UndefinedBehaviorSanitizer

介绍
如何建造
用法
可用支票
易挥发的
最少的运行时间
堆栈跟踪和报告符号
记录中
使无符号整数溢出静音
问题抑制
使用禁用仪表 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࿱

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值