我刚刚看了 UB 上的一个有趣的演讲,我尝试了一些东西。
考虑以下代码:
#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
然后运行程序,会出现运行时错误,clang会详细解释错误所在:
runtime error: signed integer overflow: 2147483644 + 10 cannot be represented in type 'int'
但是,程序将继续越过offending行并执行
Hello World
消息,并且退出状态/返回代码将为0,就好像没有发生任何不好的事情一样。
我的问题是:
当使用 clang 发生这种情况时,如何在我的 C 程序中强制发生 硬崩溃/异常(如
assert()
错误)?
感谢您提前提供任何有用的答案。
PS:我了解到错误信息不能在编译时产生,只能在运行时产生,但没想到启用-fsanitize=undefined
时后果如此
松。
期望:
clang -O0 -fsanitize=undefined a.c -o a.out
./a.out
echo $?
Hello World
没有出现https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
对于大多数检查(检查),检测程序会打印详细的信息 错误报告并在检查失败时继续执行。您可以使用 以下选项可更改错误报告行为:
:打印详细错误报告并退出程序;-fno-sanitize-recover=...
:执行陷阱指令(不需要UBSan运行时支持)。如果信号没有被捕获,程序将 通常由于 SIGILL 或 SIGTRAP 信号而终止。-fsanitize-trap=...
听起来你想使用
-fsanitize=undefined -fno-sanitize-recover=all
。