我刚刚在UB(Undefined Behavior)上看了一场有趣的演讲,我try 了一些东西.
请考虑以下代码:
#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
消息,and退出状态/返回代码将为0,就好像没有发生任何坏事一样.
当使用clang时,如何在C程序中强制hard crash / exception(类似于assert()
错误)?
感谢您提前给我任何有用的答复.
PS:我了解到错误消息不能在编译时产生,只能在运行时产生,但我没有想到在启用
-fsanitize=undefined
时会产生如此loose的后果.
期望:
clang -O0 -fsanitize=undefined a.c -o a.out
./a.out
echo $?
- 未显示
Hello World
- 退出状态为!= 0