为何下述C语言代码中的strcpy用法被标注为存在缓冲区溢出风险?
这段代码中strcpy的使用风险解析
当前给出的代码本身逻辑无错误,不会触发实际的缓冲区溢出,BAD标注确实不够精准,但此处使用strcpy存在三类可感知的问题:
- 性能冗余
代码已经通过strlen完整遍历一次输入字符串s计算长度,而strcpy内部需要再次遍历s直到读取到'\0'才停止复制,同一个字符串被无意义遍历两次,处理长字符串时会产生不必要的性能损耗。更合理的实现是直接调用memcpy(c, s, len),复用已计算好的长度完成复制,避免二次遍历。 - 后续迭代的隐性溢出风险
风险不来自现有代码,而是来自后续维护的人为失误场景:- 若后续修改代码时误删除了
strlen(s)后的+1,或是中间插入的逻辑修改了len使其小于实际需要的内存长度,strcpy不会校验目标缓冲区的可用空间,会直接发生缓冲区溢出 - 若后续迭代中在
strlen调用和strcpy调用之间新增了修改s指向内容的逻辑,导致s实际长度超过之前计算的len,也会触发溢出
若替换为memcpy绑定已计算的len参数,至少能保证复制边界和分配的内存大小严格对齐,就算逻辑出错也更容易排查问题,溢出范围可控。
- 若后续修改代码时误删除了
- 静态扫描规则的告警风险
所有C语言的安全扫描规范都会将无长度限制的strcpy标记为高风险函数,无论上下文是否保证了缓冲区足够,只要调用strcpy就会触发安全告警,这也是这段代码被标注BAD的直接原因。
内容的提问来源于stack exchange,提问作者DegH
相关产品推荐
相关产品推荐

