有没有办法检查VLA中的缓冲区溢出?我用-fstack保护器,所有-Wstack保护器但得到这些警告:可变长度数组(VLA)的边界检查?
警告:没有保护局部变量:可变长度的缓冲器
是否有实现这一图书馆吗?
我目前使用Valgrind的和gdb(-lefence是堆内存)。
有没有办法检查VLA中的缓冲区溢出?我用-fstack保护器,所有-Wstack保护器但得到这些警告:可变长度数组(VLA)的边界检查?
警告:没有保护局部变量:可变长度的缓冲器
是否有实现这一图书馆吗?
我目前使用Valgrind的和gdb(-lefence是堆内存)。
也许使用了alloca()会有所帮助。这很烦人,因为c99应该可以让你免于使用它,但是GCC手册页似乎说如果使用alloca(),堆栈保护代码将会打开。
当然,真正的解决方案是编写完美的,无bug的代码,永远不会破坏堆栈。
我看不出库能为你做到这一点;使用可变长度的数组,您不会调用任何函数来执行索引,所以没有地方可以“挂钩”库。使用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);
}
然后拿出适当的宏定义(和辅助码)来跟踪访问。正如我所说,它不会很漂亮。当然,这个想法是,宏可以“编译”出纯粹的定义,由一些构建时间设置(调试/释放模式或其他)来控制。
您可以改用的-fmudflap -fstack保护器,所有
更新:有些文档和选项都在这里http://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging