修复堆栈保护程序的正确方法是什么:可变长度缓冲区警告?

时间:2014-08-26 21:22:14

标签: c

我有一系列大约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)
}

但是有更好,更“正确”的方式吗?

2 个答案:

答案 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);
}