如何让Clang在触发-fsanitize=undefined运行时错误时强制崩溃?
让Clang UBSan检测到未定义行为时直接崩溃并返回非0退出码
问题背景
测试以下存在有符号整数溢出未定义行为的代码:
#include <limits.h> #include <stdio.h> int f(int x) { return x + 10; } int main(void) { int i; i = INT_MAX - 3; printf("i = %d\n",i); printf("f(%d) = %d\n",i,f(i)); printf("Hello World\n"); return 0; }
使用clang -O0 -fsanitize=undefined a.c编译运行后,程序会输出运行时错误:
runtime error: signed integer overflow: 2147483644 + 10 cannot be represented in type 'int'
但仍会继续执行后续代码,输出Hello World,且退出状态码为0。需要实现:检测到此类错误时立即终止程序,不执行后续代码,同时返回非0退出码。
解决方案
在编译时添加-fno-sanitize-recover=undefined选项,该选项会强制UBSan在检测到未定义行为时直接终止程序,而非继续执行。
编译命令
clang -O0 -fsanitize=undefined -fno-sanitize-recover=undefined a.c -o a.out
效果验证
运行编译后的程序:
./a.out echo $?
- 程序会输出运行时错误信息后立即终止,不会输出
Hello World - 执行
echo $?会得到非0的退出状态码(通常为1)
内容的提问来源于stack exchange,提问作者Paxsali
相关产品推荐
相关产品推荐

