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

cppcheck报数组越界错误,代码正常运行如何解决?

cppcheck报数组索引越界但代码实际运行正常的解决思路

先贴出完整错误信息:

Src/utils.c:243:23: error: 数组索引越界;'buf'缓冲区大小为0,却在偏移3处被访问。[ctuArrayIndex]
    value = (uint32_t)buf[3] << 24u;
                      ^
Src/crypto/chacha20.c:87:41: note: 调用函数Utils_Deserialize32LE时,第一个参数未初始化
    uint32_t x4  = Utils_Deserialize32LE(&key[0]);
                                        ^
Src/utils.c:243:23: note: 使用参数buf
    value = (uint32_t)buf[3] << 24u;
                      ^
make: *** [Makefile:178: cppcheck] Error 1

这段代码实际运行正常,但cppcheck始终抛出上述错误。我已经给Utils_Deserialize32LE添加了空指针检查,问题依旧,有没有人遇到过类似情况?

可行的解决方向:

  • 给函数参数添加大小注解:cppcheck无法自动推断buf的缓冲区大小,可在函数声明里明确标注参数指向的数组至少有4字节:
    uint32_t Utils_Deserialize32LE(const uint8_t buf[static 4]);
    
    这样cppcheck就能识别到访问buf[3]是安全的,不会再报越界错误。
  • 局部抑制警告:如果不想修改函数声明,可在报错代码行上方添加cppcheck专属抑制注释:
    // cppcheck-suppress ctuArrayIndex
    value = (uint32_t)buf[3] << 24u;
    
  • 确认调用处变量的可推断性:报错里提到的"参数未初始化"是cppcheck未识别到key的初始化状态或长度。确保key是已初始化且长度足够的数组,也可以给key添加大小注解,帮助cppcheck正确推断。
  • 调整cppcheck命令参数:如果确认这段逻辑绝对安全,可在执行cppcheck时添加--suppress=ctuArrayIndex跳过该检查,但不建议全局这么做,容易遗漏真实的越界问题。

内容的提问来源于stack exchange,提问作者Igor Mišić

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:35:10