我有一系列大约 30 个使用本地数组的函数:
void foo() {
const int array_size = 32;
char my_array[array_size];
// .. do stuff
// (array_size is used multiple times)
}
代码(使用-Wstack-protector
编译时)将产生以下警告消息:
警告:堆栈保护器不保护局部变量:可变长度缓冲区
所以我有两个问题:
首先,为什么my_array
被认为是可变长度?是的,我知道技术上的原因,但是编译器不应该足够聪明来意识到它不是真正可变长度吗?
其次,解决此警告的最合适方法是什么?我知道我可以通过执行以下操作来修复它:
void foo() {
char my_array[32];
const int array_size = sizeof(my_array) / sizeof(my_array[0]);
// .. do stuff
// (array_size is used multiple times)
}
但是有没有更好、更“正确”的方法呢?
最佳答案
const int array_size = 32;
是否不使array_size
成为常量。它仅仅意味着它不能用作左值赋值。 (它的值可以改变)。因此,不允许将其作为常量文字
用于:
char my_array[array_size];
您可以:
#DEFINE array_size 32
或
enum { array_size = 32 };
关于c - 修复堆栈保护器: variable length buffer warning?的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25515347/