介绍
如何建造
用法
可用支票
易挥发的
最少的运行时间
堆栈跟踪和报告符号
记录中
使无符号整数溢出静音
问题抑制
使用禁用仪表 attribute((no_sanitize(“undefined”)))
抑制重新编译的代码中的错误(忽略列表)
运行时抑制
支持平台
当前状态
附加配置
例子
更多信息
简介
UndefinedBehaviorSanitizer(UBSan)是一种快速的未定义行为检测器。UBSan在编译时修改程序,以捕获程序执行期间的各种未定义行为,例如:
使用未对齐或空指针
有符号整数溢出
转换为浮点类型,在浮点类型之间或在浮点类型之间进行转换,这将使目标溢出
请参阅下面的可用支票的完整列表。
UBSan有一个可选的运行时库,该库提供了更好的错误报告。这些检查的运行时成本很小,并且不影响地址空间布局或ABI。
如何建立
使用CMake构建LLVM / Clang 。
用法
使用clang++编译和链接与你的程序-fsanitize=undefined 的标志。确保使用clang++(而不是ld)作为链接器,以便您的可执行文件与正确的UBSan运行时库链接。如果要编译/链接C代码,可以使用clang 代替clang++。
% cat test.cc
int main(int argc, char **argv) {
int k = 0x7fffffff;
k += argc;
return 0;
}
% clang++ -fsanitize=undefined test.cc
% ./a.out
test.cc:3:5: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type ‘int’
您只能启用UBSan提供的部分支票,并为每种支票定义所需的行为:
-fsanitize=…:打印详细的错误报告并继续执行(默认);
-fno-sanitize-recover=…:打印详细的错误报告并退出程序;
-fsanitize-trap=…:执行陷阱指令(不需要UBSan运行时支持)。
请注意,trap/recover选项不会启用相应的消毒剂,并且通常需要附有适当的-fsanitize= 标志。
例如,如果您将程序编译/链接为:
% clang++ -fsanitize=signed-integer-overflow,null,alignment -fno-sanitize-recover=null -fsanitize-trap=alignment
程序将在有符号整数溢出后继续执行,在第一次无效使用空指针后退出,并在第一次使用未对齐指针后陷阱。
可检查
可用的检查有:
-fsanitize=alignment:使用未对齐的指针或创建未对齐的引用。还可以清除类似前提的属性。
-fsanitize=bool:加载bool既不是true也不是的值 false。
-fsanitize=builtin:将无效值传递给编译器内置函数。
-fsanitize=bounds