Coverity抛出overrun-buffer-arg缓冲区溢出错误如何修复?
Coverity overrun-buffer-arg 报错修复方案
错误根因
该报错属于典型的缓冲区越界风险:
key_name是总容量仅256字节的字符数组,代码从偏移len的地址key_name + len开始写入数据,却仍然指定256作为最大写入长度。当len > 0时,写入的最高地址key_name + len + 255必然超出key_name的合法访问范围key_name ~ key_name + 255,触发内存越界风险。
修复步骤
- 先校验
len的合法性,避免key_name + len本身已经超出缓冲区边界 - 将
snprintf的第二个参数替换为缓冲区剩余可用长度,即总容量减去已偏移的len值
修复后代码示例
/* 校验len合法性,可根据业务逻辑自定义错误处理分支 */ if (len >= sizeof(key_name)) { // 此处可添加报错、重置len等业务处理逻辑 return -1; } /* 传入剩余可用长度作为snprintf的最大写入字节限制 */ snprintf(key_name + len, sizeof(key_name) - len, "%s", student->name);
额外优化说明
使用sizeof(key_name)替代硬编码的256,后续如果调整key_name的数组长度,无需修改对应逻辑,代码鲁棒性更强。
内容的提问来源于stack exchange,提问作者sanky
相关产品推荐
相关产品推荐

