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字节:
这样cppcheck就能识别到访问uint32_t Utils_Deserialize32LE(const uint8_t buf[static 4]);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ć
相关产品推荐
相关产品推荐

