C++ gcc-4.9未定义的行为消毒剂
信中说: UndefinedBehaviorSanitizer(ubsan),一种快速的未定义行为 检测器,已添加,可通过-fsanitize=undefined启用。 将对各种计算进行检测,以检测未定义的行为 在运行时。UndefinedBehaviorSanitizer目前可用于 C语言和C++语言。 我看了这个问题(),但它似乎已经过时了 这个链接()有一些相关信息,但已经有几个月了 这是向GCC添加未定义的行为消毒剂的尝试。 请注意,这是非常阿尔法版本;到目前为止,它没有做那么多,至少 它应该处理零除的时刻,INT_MIN/-1,和 各种换档情况(按负值换档,换档时 第二个操作数大于类型精度(第一个操作数)等。 (到目前为止,关于整数类型。) 据我所知,它正在从C++ gcc-4.9未定义的行为消毒剂,c++,gcc,undefined-behavior,gcc4.9,C++,Gcc,Undefined Behavior,Gcc4.9,信中说: UndefinedBehaviorSanitizer(ubsan),一种快速的未定义行为 检测器,已添加,可通过-fsanitize=undefined启用。 将对各种计算进行检测,以检测未定义的行为 在运行时。UndefinedBehaviorSanitizer目前可用于 C语言和C++语言。 我看了这个问题(),但它似乎已经过时了 这个链接()有一些相关信息,但已经有几个月了 这是向GCC添加未定义的行为消毒剂的尝试。 请注意,这是非常阿尔法版本;到目前为止,它没有做那么多,至少
LLVM
移植到gcc
我已经用(5/0)
试过了,唯一的区别似乎是这个输出:
main.cpp:5:19: runtime error: division by zero
是否有人对它有更多的信息或它有什么功能?这更多的是一个添加此类检查的框架,而不是试图检测所有形式的未定义行为(从“停止问题”的意义上来说,这几乎肯定是不可能的) 将这些列为当前支持的检查:
-fsanize=未定义
启用UndefinedBehaviorSanitizer,这是一种快速的未定义行为检测器。将对各种计算进行检测
在运行时检测未定义的行为。当前子选项包括:
-fsanize=shift
此选项允许检查移位操作的结果是否未定义。请注意,具体考虑的是什么
未定义的C和C++之间以及ISO之间略有不同。
C90和C99等
-fsanize=整数除零
检测整数除零和整数除-1
-fsanize=unreachable
使用此选项,编译器将把uuu builtin\u unreachable调用改为诊断消息调用。当到达uuu builtin\u unreachable调用时,行为为
未定义
-fsanize=vla-bound
此选项指示编译器检查可变长度数组的大小是否为正。此选项不会
在-std=c++1y模式下有任何影响,因为标准要求
而不能抛出异常
-fsanize=null
此选项启用指针检查。特别是,启用此选项生成的应用程序将发出错误
尝试取消引用空指针时的消息,或者如果引用
(可能是右值引用)绑定到空指针
-fsanize=return
此选项启用返回语句检查。启用此选项生成的程序将发出错误消息
当到达非void函数的末尾时
返回一个值。这个选项只在C++中工作。
-fsanize=signed integer overflow
此选项启用signed integer overflow检查。我们检查+、*、和两个一元数的结果
二进制-在有符号算术中不会溢出。注意,
必须考虑整数升级规则。即
以下不是溢出:
signed char a = SCHAR_MAX;
a++;
当-ftrapv
导致发出签名溢出陷阱时,-fsanitize=undefined
会给出一条诊断消息
目前仅适用于C语言系列
中列出的选项的完整列表
以下列出的最新GCC 5.0增补内容
UndefinedBehaviorSanitizer获得了一些新的消毒选项:
-fsanitize=float-divide-by-zero: detect floating-point division by zero;
-fsanitize=float-cast-overflow: check that the result of floating-point type to integer conversions do not overflow;
-fsanitize=bounds: enable instrumentation of array bounds and detect out-of-bounds accesses;
-fsanitize=alignment: enable alignment checking, detect various misaligned objects;
-fsanitize=object-size: enable object size checking, detect various out-of-bounds accesses.
-fsanitize=vptr: enable checking of C++ member function calls, member accesses and some conversions between pointers to base and derived classes, detect if the referenced object does not have the correct dynamic type.
这项工作似乎需要做很多基础工作才能得到支持。这篇文章似乎从文档页面上消失了(从2016-01年开始),你知道怎么回事吗?@IgorSkochinsky:谢谢。我已经修复了一些链接(可能)更持久。现在文本与我的摘录不太匹配,但我现在没有时间修复它…是-fsanize=undefined
本身启用了所有这些子选项,还是我也必须通过它们?IRC告诉我-fsanize=undefined
启用了所有这些子选项。很好的答案+1-我正在努力找出答案如果您需要启用所有子选项以使此功能有用…如果默认情况下都启用了这些选项,我找不到相关信息。您知道吗?