gcc-linaro-7.5.0 arm-eabi栈保护警告variable length buffer如何解决
问题原因说明
这个警告是gcc-linaro-7.5.0版本针对arm架构的已知误判:当栈上分配的固定大小结构体总大小超过特定阈值时,会被错误识别为可变长度缓冲区(VLA),触发-Wstack-protector警告,和你代码的实际逻辑无关。
可行解决方案(均无需修改结构体定义)
方案1:给栈变量加static修饰
改动最小,将结构体变量从栈存储改为静态存储,不再进入栈保护检查范围。
修改后代码:
int main() { static struct Foo foo = {0}; (void)(foo); return 0; }
适用场景:单线程运行、main函数不需要重入的场景。
方案2:将结构体变量改为全局变量
全局变量存储在全局数据段,不会触发栈保护相关检查。
修改后代码:
struct Foo{ char a[32]; char d[9]; }; // 移到函数外定义为全局变量 struct Foo foo; int main() { // 需要清零的话可以调用memset memset(&foo, 0, sizeof(foo)); (void)(foo); return 0; }
适用场景:多个函数需要访问该Foo结构体实例的场景。
方案3:给main函数加编译属性关闭该警告
如果必须要把变量放在栈上、支持重入,可以仅针对main函数关闭这个误报的警告,不会影响其他函数的栈保护功能。
修改后代码:
__attribute__((optimize("-Wno-stack-protector"))) int main() { struct Foo foo = {0}; (void)(foo); return 0; }
适用场景:需要保留栈存储、要求函数可重入的场景。
内容的提问来源于stack exchange,提问作者tteng little
相关产品推荐
相关产品推荐

