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