【问题标题】:Address 0x93d1e2c is 12 bytes after a block of size 2,048 alloc'd地址 0x93d1e2c 是在一个大小为 2,048 的块分配后的 12 个字节
【发布时间】:2015-10-07 20:12:58
【问题描述】:

我在我的代码上运行 valgrind 并看到两个错误。

地址 0x93d1e2c 是一个大小为 2,048 的块分配后的 12 个字节

我浏览了所有讨论,到处都提到“地址 xyz 在大小块 之后是“0”字节,已分配“。当有人分配 X 字节并将其类型转换为大小为 Y 字节且 Y > X 的东西时,似乎会发生这种情况。

那么,当它说“块后 12 个字节”而不是“块后 0 个字节”时,它是什么意思?有人可以帮忙吗?

谢谢, 尼尔

【问题讨论】:

    标签: valgrind


    【解决方案1】:

    这意味着 Valgrind 检测到你在程序中分配的一块内存(通过malloc() 或类似的),并且程序试图访问该块之后 12 个字节的内存地址。

    简而言之,这是一个 array out of bounds 错误,您尝试在实际数组数据之后访问数据。

    在下面一行之后,您应该会看到一个调用堆栈,它大致指示了在您的程序中发生无效访问的位置:

    Address 0x93d1e2c is 12 bytes after a block of size 2,048 alloc'd
    // Details of the callstack should be here
    
    /* Details of the allocation of 2048 bytes should also
       be present (separately) in Valgrind's output */
    

    【讨论】:

    • 非常感谢您的回答。问题是我正在写入 (2048+12) 字节但只读取 2048 字节。在我的程序中,2048 字节实际上由许多小消息组成,每个小消息都有自己的 TLV。所以这导致我读取最后一个 TLV 的错误数据。更改 iovec 长度后,我正在使用 recvmsg(),不再出现问题。
    猜你喜欢
    • 2023-03-23
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2012-06-07
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多