问题标签 [ubsan]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - UBSAN 报告:-875 << 7 作为未定义的行为
简单的代码片段:
UBSAN 将其报告为 UB。
我的理解是-875 << 7
公正-(875<<7)
的,没有溢出。
那么,这里真的有问题吗?
c++ - 为什么 -fsanitize=undefined 会导致“未定义对 typeinfo 的引用”?
以下测试用例是从实际应用程序中简化而来的,无法与-fsanitize=undefined
(使用 GCC 6.1.1)链接,但没有它也可以正常链接。谁能告诉我为什么?
它似乎与 Qt/QObject、-fvisibility=hidden
和的组合有关-fsanitize=undefined
,但问题出在哪里,我无法理解。
lib1.h:
lib1.cc:
lib2.cc:
构建步骤:
构建输出(来自最后一步):
c++ - -fsanitize=bounds-strict 是否包含在 GCC 6 的 -fsanitize=undefined 中?
我正在为使用 GCC 6 编译的 C++ 库编写问题报告。我正在阅读GCC 6 Changes, New Features, and Fixes,其中一个注释是:
- UndefinedBehaviorSanitizer 获得了一个新的清理选项 -fsanitize=bounds-strict,它可以严格检查数组边界。特别是,它启用了 -fsanitize=bounds 以及灵活的类似数组成员的数组的检测。
是否包含严格的边界检查-fsanitize=undefined
?还是我们都需要-fsanitize=undefined
and -fsanitize=bounds-strict
?
c++ - 如何确定 UBSAN 是使用 clang 还是 gcc 编译的?
我们使用以下代码来确定是否-fsanitize=address
已在编译时为 clang 和 gcc 指定。我们如何确定是否-fsanitize=undefined
已指定?
gcc - 如何设置 ASAN/UBSAN 报告输出
我想运行我的单元测试套件-fsanitize=address,undefined
并将所有消毒剂错误写入report.txt
文件。默认情况下,所有 sanitizer 错误都会写入标准输出,但是软件也会将信息写入标准输出,因此很难检测到错误。我试过了:
我还尝试在运行测试之前调用 C API:
然而,似乎两者都不起作用,所有错误都被写入标准输出。我正在使用 Debian 测试:
是否有任何替代方法可以将我的单元测试中的消毒剂错误保存在某处?
c++ - lambda wrapper 对可变参数模板函数调用引起的 gcc 分段错误
今天我花了好几个小时试图理解为什么这段代码在g++6.2
and上出现段错误g++7.0
,同时愉快地按预期在clang++3.9
(and 4.0
)上工作。
我将问题简化为85 行独立代码片段,正常执行时不会出现段错误,但在 UBSAN 下总是报错。
通过使用 编译、启用优化并作为额外标志传递,该问题在 wandbox 上可重现。g++7
-fsanitize=undefined
这是 UBSAN 报告的内容:
g++
声明ns#0
在“lambda gibberish” (模拟for_tuple
原始片段)中未初始化。现在,发生了一些非常有趣的事情:
如果我删除“lambda gibberish”,将第 61 行转换为
然后 UBSAN 停止抱怨。
如果我将捕获列表从 更改
[&]
为[&n, &ns...]
,UBSAN 也会停止抱怨:……等等什么?那和 有什么不同
[&]
?
将上述发现应用于原始代码片段可修复 segfaults。
这是一个g++
错误吗?或者我的代码中是否有任何未定义的行为?
c - 使用 gcc 捕获类型转换溢出
我有一个带有许多类型转换和强制转换的遗留 c 项目。通常为了检查溢出动态行为,gcc(和 C 语言)为此定义了一个内置函数:
内置函数:bool __builtin_add_overflow (type1 a, type2 b, type3 *res)
如果结果溢出,则函数返回 true。然后我的程序可能会捕捉到这种情况并采取相应的行动。
为了在不更改任何遗留代码的情况下拥有相同的功能,是否可以指示 gcc 使用此类内置函数并在内置函数返回 true 时调用提供的函数作为捕手?我希望我能找到类似的东西:
无效_cyg_add_overflow_catcher(A, B, __FILE , LINE );
GCC 已经可以检测功能,用于可追溯性和分析,所以这个概念并不奇怪。有任何想法吗?
c++ - 通过指向不正确函数类型的指针调用函数(未知)
我有一个动态链接库的程序。该程序将函数指针传递给该库以执行。
但是 ubsan (Undefined Behavior Sanitizer) 指定指针位于不正确的函数类型上。那只会发生
- 如果回调函数有一个类作为参数
- 如果回调函数有一个类作为参数,但只前向声明
- 如果我指定编译标志:-fvisibility=hidden。
我使用 clang 来编译我的项目。
它是铿锵未定义的行为清洁剂中的错误吗?
以下代码简化为一个简单的测试用例。检查评论,看看我们可以在哪里采取行动来删除一些警告
应用程序代码:
主文件.cxx
库文件的代码是:
来电者.cxx:
来电者.h
参数.h
owExport.h
配置项目的 CMakeLists.txt:
c++ - 加载地址 X,但空间不足,无法容纳 Y 类型的对象
我正在通过 Undefined Behavior Sanitizer 运行一些更新。消毒剂正在产生一条我不太明白的消息:
有问题的代码试图通过触摸缓存行范围内的地址来使缓存定时攻击更加困难。第 1326 行是reinterpret_cast
:
为什么 santizier 声称 auint32_t u
没有足够的空间来容纳 a uint32_t
?
或者,我是否正确解析了错误消息?这就是sanitzier抱怨的事情吗?如果我解析不正确,那么消毒剂在抱怨什么?