c++ - 我怎样才能故意用未初始化的数据初始化一个变量,以便 valgrind 将该变量视为未初始化的?

标签 c++ heap-memory valgrind

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

当某些伪造代码从垃圾数据缓冲区读取时,这将是致命的,或者,例如,当我使用垃圾数据缓冲区时,我应该使用适当的专用缓冲区来代替。

理想情况下,我想让伪代码快速倒下,所以我在调用写入函数后对数据进行了打乱,这样就没有人可以使用(和依赖)这些垃圾数据。

现在我有了一个想法,我可以将未初始化的数据复制到垃圾数据上而不是对其进行加扰,这样 valgrind 就可以找到垃圾缓冲区中的所有读取。

我目前的解决方案是新建[]一些字节并将未初始化的内容复制到垃圾缓冲区,然后删除[]未初始化的数据。由于大部分时间(不幸的是)未初始化的数据为 0,我将其与模式异或。对于这么简单的事情,这一切似乎都相当复杂。

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

最佳答案

Valgrind(和 memcheck)有一个 C API !

你可以简单地这样做:

#include <memcheck.h>

// ....

VALGRIND_MAKE_MEM_UNDEFINED(trash_buffer, trash_length);

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

在 valgrind 之外运行时,这将有非常小的运行时开销。即使不在 valgrind 中运行,您复制内容的方法也可能很昂贵。

关于c++ - 我怎样才能故意用未初始化的数据初始化一个变量,以便 valgrind 将该变量视为未初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21752416/

相关文章:

c++ - 动态分配内存存储说明

c++ - 我如何知道一个对象是否使用 new 在堆上分配?

c - “大小 8 的无效读取”- Valgrind。尝试用来自其他结构的数据填充结构

c++ - 为什么 boost::assign::list_of 不适用于 pair<string, vector<string>>?

C++ 从注册表中获取 Windows 产品 ID

检查非常非常长的字符串时发生 Java 堆空间错误

c++ - 仅检查共享库中的内存问题(例如 Apache 模块)

c - 为什么来自 "Learn C the hard way"的示例在 valgrind 中显示错误?

c++ - 使用 boost 生成一组矩形以在不规则多边形中形成网格

c++ - 引用类型变量的 setter/getter C++