如何使用未初始化的数据有意初始化变量,以便valgrind将变量视为未初始化?

时间:2014-02-13 11:07:22

标签: c++ heap valgrind

我的代码中有一个垃圾数据缓冲区,我将其传递给写入它的函数。我不需要这个垃圾缓冲区的数据。由于我需要在多个地方使用这些垃圾数据缓冲区,但从不从它们读取,我在任何地方都使用相同的垃圾缓冲区。

当一些虚假代码从垃圾数据缓冲区中读取时,这将是致命的,或者,例如,当我使用垃圾数据缓冲区时,我应该使用适当的专用缓冲区。

理想情况下,我希望快速伪造代码,因此在调用写入函数后我会对数据进行加扰,因此没有人可以使用(并依赖)垃圾数据。

现在我知道我可以将未初始化的数据复制到垃圾数据而不是加扰它,因此valgrind可以从垃圾邮件缓冲区中找到所有读取。

我当前的解决方案是新的[]一些字节,并将未初始化的内容复制到垃圾缓冲区,然后删除[]未初始化的数据。由于未初始化的数据在大多数情况下是0(不幸的是),因此我将其与模式进行异或。对于这么简单的事情,这一切似乎都很复杂。

有没有人想出更好的解决方案?

1 个答案:

答案 0 :(得分:7)

Valgrind(和memcheck)有一个C API

你可以这样做:

#include <memcheck.h>

// ....

VALGRIND_MAKE_MEM_UNDEFINED(trash_buffer, trash_length);

如果您希望valgrind认为数据不可访问而不是仅仅是单元化,您也可以使用VALGRIND_MAKE_MEM_NOACCESS

在valgrind外部运行时,这将只有很少的运行时开销。即使不在valgrind中运行,你复制内容的方法也可能很昂贵。