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

为何GCC未对存在缓冲区溢出的代码触发stringop-overflow警告?

GCC未检测到memcpy缓冲区溢出的原因与解决办法

先看这段存在明显缓冲区溢出的代码:

#include <string.h>

int main() {
  char d[1], s[4] = {0, 1, 2, 3};
  memcpy(d, s, 8);
}

这段代码试图用memcpy把8字节数据拷贝到仅1字节的数组d中,运行时会触发栈溢出崩溃,但用GCC 11.2或9.4版本执行gcc -Wall -Wextra -pedantic test.c -o test_app编译时,却没有收到预期的-Wstringop-overflow警告——而根据GCC文档,-Wstringop-overflow=2是默认启用的。

为什么没触发警告?

  • -Wstringop-overflow检测范围有限:该选项原本主要针对strcpy、strcat这类依赖空字符的字符串操作函数,对通用内存拷贝的memcpy支持并不完善。在GCC 9.x和11.x版本中,默认静态分析逻辑不会主动关联memcpy的目标缓冲区大小与拷贝长度,除非能通过代码明确推断出溢出。
  • 默认警告集未覆盖memcpy强检测:-Wall -Wextra -pedantic这组选项不包含针对memcpy越界读写的严格检测规则,GCC不会主动对这类通用内存操作做深度边界校验。
  • 源缓冲区大小干扰:这里源数组s仅4字节,拷贝8字节同时存在读越界,但GCC默认不会检测这种读溢出,且该场景下的写溢出未被默认规则捕捉到。

如何让GCC检测到这个问题?

  • 添加-Warray-bounds=2选项:该选项会强制GCC检查数组访问边界,包括memcpy操作中目标缓冲区的容量是否足够,编译时就能直接抛出警告。
  • 使用地址 sanitizer:编译时加上-fsanitize=address,运行程序时会精准报告缓冲区溢出位置,适合开发调试阶段使用。
  • 手动校验拷贝长度:在代码中明确保证目标缓冲区大小不小于拷贝字节数,从根源避免溢出问题。

内容的提问来源于stack exchange,提问作者hko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:40:54