c - 修复堆栈保护器: variable length buffer warning?的正确方法是什么

标签 c

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

相关文章:

从 Mac 上的 XCode 交叉编译到 Windows

c - 关于The modified-GNU algorithm的问题

c++ - 在同一项目中使用 C 和 C++ 的 SourceMonitor

c++ - 为什么当内存足够时 malloc() 会失败?

c - 是否有必要尝试连接到 getaddrinfo() 返回的所有地址?

c - 关于读取套接字的返回值

c - 反转包含 ASCII 字符和非 ASCII 字符的字符串

ios10 iphone5s voip siphon pjsip2.5.5 打开声音设备时出错

c - 浏览文件行 - C

c - 从 C 中的套接字读取给出奇怪的输出