gcc-4.9未定义的行为消毒剂

34 c++ gcc undefined-behavior gcc4.9

gcc-4.9中改变了:

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)时移位)这样的.(在整数类型上,到目前为止.)

从我读过它被移植到gccLLVM.

我试过它,(5 / 0)唯一的区别似乎是这个输出:

main.cpp:5:19: runtime error: division by zero
Run Code Online (Sandbox Code Playgroud)

有没有人有关于它的更多信息或它有什么功能?

Nem*_*emo 41

这是一个添加此类检查的框架,而不是尝试检测所有形式的未定义行为(在"暂停问题"意义上几乎肯定不可能).

海湾合作委员会的文件中列出了这些作为当前支持的检查:

-fsanitize=undefined 启用UndefinedBehaviorSanitizer,一个快速未定义的行为检测器.将检测各种计算以在运行时检测未定义的行为.目前的子选项是:

-fsanitize=shift此选项可以检查移位操作的结果是否未定义.请注意,C和C++之间以及ISO C90和C99等之间略有不同之处.

-fsanitize=integer-divide-by-zero 检测整数除以零以及INT_MIN/-1除法.

-fsanitize=unreachable使用此选项,编译器将把__builtin_unreachable调用转换为诊断消息调用.到达__builtin_unreachable调用时,行为未定义.

-fsanitize=vla-bound此选项指示编译器检查可变长度数组的大小是否为正.此选项在-std = c ++ 1y模式下没有任何效果,因为标准要求抛出异常.

-fsanitize=null此选项启用指针检查.特别是,打开此选项时构建的应用程序在尝试取消引用NULL指针时,或者如果引用(可能是右值引用)绑定到NULL指针时将发出错误消息.

-fsanitize=return此选项启用返回语句检查.打开此选项时构建的程序将在到达非void函数结束时发出错误消息,而不实际返回值.此选项仅适用于C++.

-fsanitize=signed-integer-overflow此选项启用有符号整数溢出检查.我们检查+,*,以及一元和二元的结果 - 在签名的算术中不会溢出.注意,必须考虑整数提升规则.也就是说,以下不是溢出:

signed char a = SCHAR_MAX;
a++;
Run Code Online (Sandbox Code Playgroud)

虽然-ftrapv会发出有符号溢出的陷阱,但会发出-fsanitize=undefined诊断消息.这目前仅适用于C系列语言.

  • `-fsanitize = undefined`本身是否支持所有这些子选项,还是我必须传递它们? (3认同)
  • 我在IRC上被告知`-fsanitize = undefined`启用所有这些子选项. (3认同)