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

C++ gcc-4.9未定义的行为消毒剂,c++,gcc,undefined-behavior,gcc4.9,C++,Gcc,Undefined Behavior,Gcc4.9,信中说: UndefinedBehaviorSanitizer(ubsan),一种快速的未定义行为 检测器,已添加,可通过-fsanitize=undefined启用。 将对各种计算进行检测,以检测未定义的行为 在运行时。UndefinedBehaviorSanitizer目前可用于 C语言和C++语言。 我看了这个问题(),但它似乎已经过时了 这个链接()有一些相关信息,但已经有几个月了 这是向GCC添加未定义的行为消毒剂的尝试。 请注意,这是非常阿尔法版本;到目前为止,它没有做那么多,至少

信中说:

UndefinedBehaviorSanitizer(ubsan),一种快速的未定义行为 检测器,已添加,可通过-fsanitize=undefined启用。 将对各种计算进行检测,以检测未定义的行为 在运行时。UndefinedBehaviorSanitizer目前可用于 C语言和C++语言。 我看了这个问题(),但它似乎已经过时了

这个链接()有一些相关信息,但已经有几个月了

这是向GCC添加未定义的行为消毒剂的尝试。 请注意,这是非常阿尔法版本;到目前为止,它没有做那么多,至少 它应该处理零除的时刻,INT_MIN/-1,和 各种换档情况(按负值换档,换档时 第二个操作数大于类型精度(第一个操作数)等。 (到目前为止,关于整数类型。)

据我所知,它正在从
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-我正在努力找出答案如果您需要启用所有子选项以使此功能有用…如果默认情况下都启用了这些选项,我找不到相关信息。您知道吗?