2011-04-18 93 views
5

有没有办法检查VLA中的缓冲区溢出?我用-fstack保护器,所有-Wstack保护器但得到这些警告:可变长度数组(VLA)的边界检查?

警告:没有保护局部变量:可变长度的缓冲器

是否有实现这一图书馆吗?

我目前使用Valgrind的和gdb(-lefence是堆内存)。

回答

0

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

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

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

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