如何理解valgrind的消息“无效写入”和“地址在块内”?

时间:2019-07-24 18:24:28

标签: memory-management valgrind

我在程序上从valgrind得到以下输出:

==5328== Invalid write of size 2
...
==5328==    by 0x121289: main (flowsim_small.cpp:47)
==5328==  Address 0x1c05b630 is 0 bytes inside a block of size 16 alloc'd
==5328==    at 0x483752F: operator new[](unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
...

省略部分是回溯,两条消息都是同一消息块的一部分。

我试图了解此组合的含义:“大小为2的无效写入”和“地址为16块内的0字节”。

我已经看到许多关于SO的问题和答案,并且我理解这些情况。例如,herehere会尝试在N块(其中A + X> N)中的地址A处写入X字节。

我的情况是,我不明白从字节0开始,2个字节不能容纳到16个字节的存储区中。

您能解释一下吗?

P.S。我没有发布任何代码,因为缩小范围太困难了(我使用OpenMPI,与python接口的c ++和大量内部代码),尤其是因为我的问题很笼统。

1 个答案:

答案 0 :(得分:1)

至少在使用高级valgrind功能时会发生这种情况,例如 客户端请求描述一些由 应用程序或客户端请求更改内存的可访问性。

如果没有代码,则很难确定到底出了什么问题 在代码中或在valgrind中。

您可能会检测是否对“报告”中报告的地址做了“特殊”处理 通过使用valgrind -v -v -v -d -d -d ...错误消息。 深入了解valgrind在做什么。 这会跟踪执行的客户端请求。如果看到客户要求 所使用的地址与您所看到的地址相同,这也许可以解释。