You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:41:02