【问题标题】:Silence valgrind param write(buf) points to uninitialised byte(s)Silence valgrind param write(buf) 指向未初始化的字节
【发布时间】:2021-12-05 02:07:33
【问题描述】:

我有如下 C 代码(最小可重现示例):

BYTE *myPointer;
doStuff(&myPointer); //mallocs space and sets myPointer to point to this space


FILE* myFile = fopen(fileName, "rb+");
fseek(myFile, 0, SEEK_SET);

fwrite(myPointer, 32, 1, myFile); //<------- problematic line

现在这段代码可以正常工作并完成它应该做的事情,但是 valgrind 在fwrite(myPointer, 32, 1, myFile); 行抛出以下错误:

Syscall param write(buf) points to uninitialised byte(s)

我认为这是因为 Valgrind 认为 myPointer 是未初始化的。

这很公平,但在 doStuff 函数中,我分配空间并将 myPointer 设置为指向它,所以一切都按预期工作。

有什么方法可以让 valgrind 知道这一点/消除错误吗?

谢谢

【问题讨论】:

  • 您一定没有正确执行此操作,否则valgrind 不会抱怨它未初始化。贴出doStuff()的代码。
  • 分配内存还不够,还要初始化内存的内容。您是否至少填写了 32 个字节?
  • 啊,好的,非常感谢,我认为 doStuff() 有问题,我会再深入研究一下,没想到 valgrind 不会抱怨!
  • 使用calloc,内存会被初始化

标签: c pointers malloc valgrind


【解决方案1】:

fwrite 函数用于将数据写入到文件中。这意味着(在这种情况下)myPointer 应该指向将写入磁盘的 32 字节数据。

这当然是个问题,因为除非doStuff 正在填充myPointer 指向的内存,否则这些字节实际上是未初始化的。

假设您确实想从文件中读取,请改用fread

fread(myPointer, 32, 1, myFile);

如果您确实想写入,请确保myPointer 指向的至少 32 个字节实际上已设置为某个值。

【讨论】:

  • 非常感谢,我确实想写,所以我认为它与 doStuff() 函数有关!当我弄清楚时会在这里发布我的结果:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 2023-03-19
  • 2017-03-30
相关资源
最近更新 更多