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

为何下述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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:39:04