当我使用nm|grep'__ubsan'时,它返回:
U __ubsan_handle_add_overflow
U __ubsan_handle_divrem_overflow
U __ubsan_handle_dynamic_type_cache_miss
U __ubsan_handle_load_invalid_value
U __ubsan_handle_mul_overflow
U __ubsan_handle_negate_overflow
U __ubsan_handle_nonnull_arg
U __ubsan_handle_nonnull_return
U __ubsan_handle_out_of_bounds
U __ubsan_handle_shift_out_of_bounds
U __ubsan_handle_sub_overflow
U __ubsan_handle_type_mismatch
U __ubsan_handle_vla_bound_not_positive
U __ubsan_vptr_type_cache
我假设__ubsan_handle_add_overflow是检查加法溢出的指令插入。我在代码中添加了:
auto test = UINT_MAX;
test += 15;
然而,我没有看到与之相关的"运行时错误"消息
我们的代码库使用去除调试符号
strip --strip-debug --strip-unneeded
我发现"--strip-unneeded"会去掉与消毒液相关的符号,因为用它来称呼"nm"是空白的。如果我只是使用"strip-strip-debug",我会得到与上面相同的nm输出。我可能还需要调试符号才能使消毒符号发挥作用吗?我可以看到我的程序的内存消耗从大约175MB增加到大约265MB。
我为启用ubsan所做的就是-fvisibility=default和-fsanitize=undefined
遗憾的是,我所处的ARM嵌入式环境没有为我提供足够的空间来快速测试是否有消毒剂和调试符号来测试这一理论。我们的x86构建从技术上讲是功能性的,我从清理程序中看到了运行时错误,所以也许这就证明了这一点,因为它有清理程序和调试符号?
-fsanitize-undefined
启用对未定义行为的检查。但无符号整数溢出(正如您在这里调用的(并不是未定义的行为。如果要检查无符号溢出(可能是个坏主意(,则需要传递-fsanitize=unsigned-integer-overflow
。如果您想调用有符号溢出,即UB,请改为对有符号整数执行加法。