gcc-4.9 Undefined Behavior Sanitizer有哪些功能?

cbeh67ev  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(230)

gcc-4.9 changes中,它说:
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)等。(到目前为止,在整数类型上。)
从我所读到的,它正在从LLVM移植到gcc
我用(5 / 0)试过,唯一的区别似乎是输出:

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

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

cngwdvgl

cngwdvgl1#

这更像是一个添加此类检查的框架,而不是试图检测所有形式的未定义行为(这几乎可以肯定是不可能的“停止问题”意义上的)。
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语言家族。

vuv7lop3

vuv7lop32#

UndefinedBehaviorSanitizer中列出的选项的完整列表
最新的GCC 5.0添加从下面列出的GCC 5 Release Series : Changes, New Features, and Fixes提取;
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.

相关问题