有没有办法检查VLA中的缓冲区溢出?我使用了 -fstack-protector-all -Wstack-protector 但是得到了这些警告:
警告:不保护局部变量:可变长度缓冲区
是否有用于实现此目的的库? (-lefence用于堆内存)
我目前正在使用Valgrind和gdb。
答案 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);
}
然后提出合适的宏定义(和辅助代码)来跟踪访问。正如我所说,它不会很漂亮。当然,我们的想法是宏可以“编译”成纯粹的定义,由一些构建时设置(调试/释放模式或其他)控制。