检查可变长度阵列(VLA)的界限?

时间:2011-04-18 12:08:42

标签: c gcc bounds-checker

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

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

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

我目前正在使用Valgrind和gdb。

3 个答案:

答案 0 :(得分:1)

您可以使用-fmudflap代替-fstack-protector-all

更新:某些文档和选项位于http://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging

答案 1 :(得分:0)

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

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

答案 2 :(得分: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);
}

然后提出合适的宏定义(和辅助代码)来跟踪访问。正如我所说,它不会很漂亮。当然,我们的想法是宏可以“编译”成纯粹的定义,由一些构建时设置(调试/释放模式或其他)控制。