41

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) 时移位和诸如此类。(到目前为止,关于整数类型。)

从我读过的内容来看,它正在被移植到gccfrom LLVM.

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

main.cpp:5:19: runtime error: division by zero

有没有人有更多关于它的信息或它有什么特点?

4

2 回答 2

47

这更像是一个添加此类检查的框架,而不是试图检测所有形式的未定义行为(这在“停止问题”意义上几乎肯定是不可能的)。

GCC 文档将这些列为当前支持的检查:

-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++;

虽然-ftrapv会导致发出签名溢出的陷阱,但会-fsanitize=undefined给出诊断消息。这目前仅适用于 C 系列语言。

于 2013-12-23T07:13:23.127 回答
1

UndefinedBehaviorSanitizer中列出的选项的完整列表

从 GCC 5 Release Series 中提取的最新 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-03-28T07:07:58.317 回答