gpt4 book ai didi

c++ - 我如何理解 Valgrind 中的无效读取,其中地址大于分配的 block 大小

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:47 27 4
gpt4 key购买 nike

我是 Valgrind 的新手。收到这些 Valgrind 消息:

==932767== Invalid read of size 16
==932767== at 0x3D97D2B9AA: __strcasecmp_l_sse42 (in /lib64/libc-2.12.so)
...
==932767== Address 0x8c3e170 is 9 bytes after a block of size 7 alloc'd
==932767== at 0x6A73B4A: malloc (vg_replace_malloc.c:296)
==932767== by 0x34E821195A: ???

这里我有两个问题:

  1. 分配的 block 是7个字节,那地址0x8c3e170怎么是9个字节?通常指向的大小小于分配的大小。那么在什么情况下会遇到上述问题呢?

  2. 无效读取大小为 16 字节。它是否包括来自“地址 0x8c3e170 是大小为 7 的 block 分配后的 9 字节”的 2 个额外字节

最佳答案

如果不是省略号,我会说 Address 0x8c3e170... msg 与 Invalid read of size 16 直接相关,因为它进一步缩进了。

可能会出现误报,所以不要排除这种可能性。例如,作为优化,strcasecmp 读取的内容可能比它需要的多。

我将第二条消息读取为正在读取的地址从大小为 7 的 block 结束后的 9 个字节开始

我有两个建议,其中任何一个都可能会帮助您找到它:

1) 在 valgrind 下运行您的应用程序,以便您可以使用 gdb 在单独的终端窗口中附加:

~ valgrind --vgdb=yes --vgdb-error=0 your_program

在另一个窗口中:

~ gdb your_program
(gdb) target remote | vgdb

这个选项让它停止,就好像在 valgrind 发现的每个问题上都设置了一个断点

2) 使用 clang 或 gcc(4.9 或更高版本)编译未定义和/或内存清理程序。它们会捕获相同类型的问题,但我发现错误消息的信息量更大。

关于c++ - 我如何理解 Valgrind 中的无效读取,其中地址大于分配的 block 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32215786/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com