当我发现它仅适用于Linux时,我正在研究Valgrind以帮助改进我的C编码/调试 - 我没有其他需要或兴趣将我的操作系统转移到Linux所以我想知道是否有一个同样好的Windows程序.
UndefinedBehaviorSanitizer(ubsan)是一个快速未定义的行为检测器,已添加并可通过-fsanitize = undefined启用.将检测各种计算以在运行时检测未定义的行为.UndefinedBehaviorSanitizer目前可用于C和C++语言.
我看了这个问题(一个检测未定义行为的C++实现?)但它似乎已经过时了.
这个链接(http://gcc.gnu.org/ml/gcc-patches/2013-06/msg00264.html)上有一些信息,但已有几个月了.
这是尝试将未定义的行为消毒剂添加到GCC.请注意,它是非常alpha版本; 到目前为止,它没有做那么多,目前它应该处理除零情况,INT_MIN/-1和各种移位情况(移位负值,当第二个操作数> = = TYPE_PRECISION(first_operand)时移位)这样的.(在整数类型上,到目前为止.)
从我读过它被移植到gcc从LLVM.
我试过它,(5 / 0)唯一的区别似乎是这个输出:
main.cpp:5:19: runtime error: division by zero
Run Code Online (Sandbox Code Playgroud)
有没有人有关于它的更多信息或它有什么功能?
我很抱歉,如果这是一个超级简单的概念,但我发现很难获得正确的心态,以便正确使用由提供的消毒剂clang.
float foo(float f) { return (f / 0); }
Run Code Online (Sandbox Code Playgroud)
我编译这个小片段
clang++ -fsanitize=float-divide-by-zero -std=c++11 -stdlib=libc++ -c source.cpp -o osan
Run Code Online (Sandbox Code Playgroud)
而且我还在不使用消毒剂的情况下编译了我的对象的"正常"版本
clang++ -std=c++11 -stdlib=libc++ -c source.cpp -o onorm
Run Code Online (Sandbox Code Playgroud)
我期待一些详细的输出,或者来自控制台的一些错误,但是在检查文件时nm我只发现了1个差异
nm o* --demangle
onorm:
0000000000000000 T foo(float)
osan:
U __ubsan_handle_divrem_overflow
0000000000000000 T foo(float)
Run Code Online (Sandbox Code Playgroud)
所以在清理版本中有一个未定义的符号,其名称类似于我在编译时使用的清洁剂; 但是一切都是"沉默的",而且从铿锵的前端根本没有输出.
我应该如何使用消毒剂以及什么是正确的工作流程?那个未定义的符号有什么意义?