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

运行make时报Assertion failure断言失败该如何排查解决?

问题根因

你的断言触发的核心原因是有符号16位整数溢出:

  • int16_t是有符号16位整型,合法取值范围为 -32768 ~ 32767
  • 你设置了循环累加10万次,当old_value累加到最大值32767时,再执行加1操作就会触发有符号整数溢出,C语言标准中这属于未定义行为,实际运行时会绕回最小值-32768
  • 此时比较逻辑中:new_value是溢出后的-32768,而old_value + 1因为整型提升规则会被转换为int类型计算,结果为32768,二者不相等,因此断言触发。
排查步骤
  • 首先添加更详细的调试打印,输出每次循环的累加次数、新旧值,快速定位断言触发时的变量状态,修改打印代码为:
printf("循环次数: %d, 旧值: %d, 新值: %d, 比较结果: %d\n", i, old_value, new_value, (new_value == (old_value + 1)));

运行后就能直接看到当循环到第32767次时变量溢出的异常情况。

  • 核对所用变量类型的取值范围,确认累加次数是否超过类型上限,你当前的10万次累加需求远超过int16_t的最大承载能力。
  • 如果是业务确实需要大数累加,直接替换变量类型即可解决问题,比如将所有int16_t替换为int32_t,范围可覆盖到21亿,完全满足10万次累加的需求。
修复参考代码
#include <assert.h>
#include <stdio.h>
#include <stdint.h>

/**
 * 整数自增
 *
 * @param j 待自增的整数
 *
 * @return 自增后的结果
 */
int32_t increment(int32_t j) {
    return ++j;
}

int main(int argc, char *argv[]) {
    const int n_increments = 100000; // 累加10万次

    int32_t old_value = 0;
    int32_t new_value = 0;

    for (int i = 0; i < n_increments; ++i) {
        new_value = increment(old_value);
        assert(new_value == (old_value + 1));
        old_value = new_value;
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:15:03