5

有没有办法检查 VLA 中的缓冲区溢出?我使用了 -fstack-protector-all -Wstack-protector但收到以下警告:

警告:不保护局部变量:可变长度缓冲区

是否有实现此目的的库?(-lefence 用于堆内存)

我目前正在使用 Valgrind 和 gdb。

4

3 回答 3

1

您可以使用 -fmudflap 而不是 -fstack-protector-all

更新:一些文档和选项在这里http://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging

于 2011-04-18T15:16:25.633 回答
0

我看不出图书馆如何为您做到这一点。使用可变长度数组,您不会调用任何函数来进行索引,因此没有地方可以“挂钩”库。使用malloc(),分配在函数中是显式的,您可以跟踪它。

当然,您可以浏览代码并使用预处理器技巧将一些宏添加到每个索引点,并将宏扩展为检查边界的代码。但这是非常具有侵入性的。

我正在考虑类似的改变:

void work(int n)
{
  int data[n];   /* Our variable-length array. */

  data[0] = 0;
}

变成类似的东西:

#include "vla-tracking.h"

void work(int n)
{
  VLA_NEW(int, data, n);  /* Our variable-length array. */

  VLA_SET(data, 0, 0);
}

然后提出合适的宏定义(和辅助代码)来跟踪访问。正如我所说,它不会很漂亮。当然,这个想法是宏将能够“编译”为简单的定义,由一些构建时设置(调试/发布模式或其他)控制。

于 2011-04-18T13:16:48.337 回答
0

也许使用 alloca() 会有所帮助。这很烦人,因为 c99 应该使您不必使用它,但 GCC 手册页似乎说如果您使用 alloca(),堆栈保护代码将被打开。

当然,真正的解决方案是编写完美的、无错误的代码,从不试图破坏堆栈。

于 2011-04-18T13:11:08.200 回答