Clang:如何强制由于 -fsanitize=undefined 而导致运行时错误崩溃/异常

问题描述 投票:0回答:1

我刚刚看了 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
    没有出现
  • 退出状态为 != 0
c clang undefined-behavior
1个回答
1
投票

https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html

对于大多数检查(检查),检测程序会打印详细的信息 错误报告并在检查失败时继续执行。您可以使用 以下选项可更改错误报告行为:

  • -fno-sanitize-recover=...
    :打印详细错误报告并退出程序;

  • -fsanitize-trap=...
    :执行陷阱指令(不需要UBSan运行时支持)。如果信号没有被捕获,程序将 通常由于 SIGILL 或 SIGTRAP 信号而终止。

听起来你想使用

-fsanitize=undefined -fno-sanitize-recover=all

© www.soinside.com 2019 - 2024. All rights reserved.