我有一系列大约30个使用本地数组的函数:
void foo() {
const int array_size = 32;
char my_array[array_size];
// .. do stuff
// (array_size is used multiple times)
}
代码(使用-Wstack-protector
进行编译时)将产生以下警告消息:
warning: stack protector not protecting local variables: variable length buffer
所以我有两个问题:
首先,为什么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)
}
但是有更好,更“正确”的方式吗?
答案 0 :(得分:2)
const int array_size = 32;
不使array_size
成为常量。它仅仅意味着它不能用作左值赋值。 (否则它的值可以改变)。因此,不允许将其作为constant literal
:
char my_array[array_size];
你可以:
#DEFINE array_size 32
或
enum { array_size = 32 };
答案 1 :(得分:-1)
您可能应该将数组动态分配为:
void foo() {
const int array_size = 32;
char *my_array;
my_array = malloc((array_size)*sizeof(char));
// .. do stuff
// (array_size is used multiple times)
free(my_array);
}