GCC 10.2.0中-D_FORTIFY_SOURCE=2为何无缓冲区溢出编译警告?
GCC 10.2.0中_FORTIFY_SOURCE相关的警告行为变更及解决方法
你的问题核心是GCC版本升级后,静态编译期的缓冲区溢出警告消失了——这确实是GCC 8及以后版本的有意调整,和_FORTIFY_SOURCE本身的运行时检测逻辑无关,具体细节和解决方法如下:
1. 警告选项的拆分变更
GCC 7及更早版本中,针对strcpy、memcpy这类函数的静态缓冲区溢出检查是包含在-Wall中的,配合-D_FORTIFY_SOURCE=2和-O2会在编译时直接抛出警告。但从GCC 8开始,官方把这类字符串/内存操作的溢出检查拆分成了独立的警告选项,不再默认随-Wall/-Wextra启用:
- 针对字符串操作(如
strcpy)的静态检查:需要显式添加-Wstringop-overflow=2(级别2会检测已知大小缓冲区的溢出) - 针对内存拷贝操作(如
memcpy)的静态检查:需要添加-Wmemcpy-overflow
2. 恢复编译期警告的编译命令
把这些选项加到你的编译参数里,就能回到GCC 7时的编译期警告效果:
g++ -O2 -g -D_FORTIFY_SOURCE=2 -Wall -Wextra -Wstringop-overflow=2 -Wmemcpy-overflow main.cpp
用这个命令编译你的代码,会分别针对strcpy(var1,"abcdefghi")和memcpy(&var1,&var2,10)抛出明确的缓冲区溢出警告。
3. 关于_FORTIFY_SOURCE的运行时检测
你提到的运行时能检测到溢出并终止程序是正常的——GCC 10.2.0中_FORTIFY_SOURCE=2的运行时检测逻辑没有变化,只要开启了-O2及以上优化,就会在危险操作时触发abort,这部分和旧版本一致。
额外小提示
你的代码里printf语句有格式错误:printf("size of var1",var1,sizeof(var1));不会输出正确的大小值,应该改成:
printf("size of var1: %zu\n", sizeof(var1));
内容的提问来源于stack exchange,提问作者scarecornet
相关产品推荐
相关产品推荐

