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

Clang/GCC默认启用有符号整数溢出检查并支持按需关闭的方法

当然可以!不管是GCC还是Clang,都能实现全局默认开启有符号整数溢出的安全检查(检测到溢出就终止程序),同时针对特定代码块、函数甚至操作单独关闭检查。下面分编译器给你拆解具体操作:

GCC 的配置方式

全局默认启用溢出检查并终止程序

要全局开启有符号整数溢出的检测,你可以借助UndefinedBehaviorSanitizer(UBSan):

  • 如果你想开启所有未定义行为的检查(包括溢出),用编译选项:-fsanitize=undefined -fno-sanitize-recover=undefined
  • 如果你只想精准针对有符号整数溢出,用:-fsanitize=signed-integer-overflow -fno-sanitize-recover=signed-integer-overflow

其中-fno-sanitize-recover的作用是让编译器在检测到溢出时直接终止程序,而不是仅输出警告信息。

另外,GCC还有一个更轻量的选项-ftrapv,它会在编译时直接插入陷阱指令,一旦发生有符号整数溢出就触发程序崩溃。不过这个选项没有UBSan的详细诊断信息,适合对性能开销敏感的场景。

局部关闭溢出检查

如果你需要针对某段代码、某个函数跳过溢出检查,有几种方式:

  1. 修饰单个函数:用属性标记函数,让它不参与溢出检查:
    __attribute__((no_sanitize("signed-integer-overflow")))
    int risky_add(int a, int b) {
        return a + b; // 这里的溢出不会被检测
    }
    
  2. 包裹代码段:用编译指令临时禁用检查,之后再恢复:
    int safe_add(int a, int b) {
        return a + b; // 这里会被检查
    }
    
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wsanitize=signed-integer-overflow"
    int risky_add(int a, int b) {
        return a + b; // 这里的溢出不会被检测
    }
    #pragma GCC diagnostic pop
    
  3. 主动处理溢出:如果你的代码明确需要溢出行为,可以用GCC内置函数(比如__builtin_add_overflow),这类函数会主动处理溢出逻辑,不会触发UBSan的检查:
    int add_with_overflow(int a, int b, int *result) {
        return __builtin_add_overflow(a, b, result); // 返回1表示溢出,0表示正常
    }
    
Clang 的配置方式

Clang的逻辑和GCC非常相似,同样支持UBSan和轻量陷阱选项:

全局默认启用溢出检查并终止程序

  • 开启全量UB检查:-fsanitize=undefined -fno-sanitize-recover=undefined
  • 仅开启有符号整数溢出检查:-fsanitize=signed-integer-overflow -fno-sanitize-recover=signed-integer-overflow
  • 轻量陷阱选项:-ftrapv,和GCC的作用一致,溢出时直接崩溃,无详细诊断。

局部关闭溢出检查

  1. 修饰单个函数:同样支持属性标记:
    __attribute__((no_sanitize("signed-integer-overflow")))
    int risky_add(int a, int b) {
        return a + b;
    }
    
  2. 包裹代码段:用Clang专属的编译指令:
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wsanitize=signed-integer-overflow"
    int risky_add(int a, int b) {
        return a + b;
    }
    #pragma clang diagnostic pop
    
  3. 主动处理溢出:Clang也支持__builtin_add_overflow等内置函数,用法和GCC完全一致。
额外注意点
  • 这些功能需要较新版本的编译器支持:GCC 4.9+、Clang 3.1+基本都能覆盖。
  • UBSan会带来一定的性能开销,如果是生产环境对性能敏感,优先考虑-ftrapv或者仅在测试阶段开启UBSan。
  • 有符号整数溢出本身属于C/C++标准中的未定义行为,所以即使关闭检查,也要确保你的代码逻辑是安全的(比如明确依赖溢出的补码行为)。

内容的提问来源于stack exchange,提问作者BeeOnRope

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:57:14