gcc-4.9未定义行为消毒器有哪些功能
What features does gcc-4.9 Undefined Behavior Sanitizer have?
在gcc-4.9的更改中,它说:
UndefinedBehaviorManitizer(ubsan),一种快速的未定义行为检测器,已添加,可以通过-fsanitize=undefined启用。将对各种计算进行检测,以检测未定义的行为在运行时。UndefinedBehaviorManitizer当前可用于C和C++语言。
我研究了这个问题(检测未定义行为的C++实现?),但它似乎已经过时了。
此链接(http://gcc.gnu.org/ml/gcc-patches/2013-06/msg00264.html)有一些关于它的信息,但它已经有几个月的历史了。
这是一种将未定义行为消毒器添加到GCC的尝试。请注意,这是一个非常阿尔法的版本;到目前为止,在它应该处理除以零的情况的时刻,INT_MIN/-1,以及各种换档情况(以负值换档,当第二个操作数大于TYPE_PRECISION(first_operand)等。(到目前为止,在整数类型上。)
据我所知,它正从LLVM
移植到gcc
。
我在(5 / 0)
中尝试过,唯一的区别似乎是这个输出:
main.cpp:5:19: runtime error: division by zero
有人有关于它的更多信息吗?或者它有什么功能?
这更像是一个添加此类检查的框架,而不是试图检测所有形式的未定义行为(从"停止问题"的意义上讲,这几乎肯定是不可能的)。
GCC文档将这些列为当前支持的检查:
-fsanitize=undefined
启用UndefinedBehaviorManitizer,一个快速的未定义行为检测器。将对各种计算进行仪表化处理以在运行时检测未定义的行为。当前的子选项有:
-fsanitize=shift
此选项允许检查移位操作的结果是否未定义。请注意,究竟考虑了什么undefined在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族语言。
UndefinedBehaviorManitizer 中列出的选项的完整列表
从GCC 5发布系列中提取的最新GCC 5.0添加:以下列出的更改、新功能和修复程序;
UndefinedBehaviorManitizer获得了一些新的消毒选项:
-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.
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 类模板的成员功能的定义在单独的TU中完全专业化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- FFMPEG关于多个功能的未定义引用
- 对我的功能的未定义引用
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- IFDEF块内部对功能的未定义引用
- 功能标识符是未定义的C
- 对完整模板专业类成员功能的未定义引用,但不是部分专业化
- 对函数的未定义引用,该功能是另一个类的成员
- 使用mingw对魔鬼功能的未定义引用
- 对CUDA实现功能的未定义引用
- 在Linux Makefile中对功能的未定义引用
- 体系结构x86_64的未定义符号-头文件中的显示功能
- G++删除了无用的功能?未定义的引用
- 对功能代码块的未定义引用
- 未定义对Android NDK功能的引用
- 对vtable的未定义引用;虚拟功能问题
- 对的未定义引用_imp__GetDIBits@28具有GetDIBits功能