繁体   English   中英

为什么Valgrind报告“无效读取大小2”?

[英]Why does Valgrind report “Invalid read of size 2”?

struct item
{
    int a;
};
int main()
{
    item *a = (item *)malloc(sizeof(item));
    item *b = (item *)malloc(sizeof(item));
    short *c = (short *)b;
    c += 3; 
    memcpy(a, c, sizeof(int));
    free(a);
    free(b);
    return 0;
}

为什么valgrind回显“无效读取大小2”? 我认为应该是4号。

来自Valgrind的示例消息:

==19134== Invalid read of size 2
==19134== at 0x4C2F7E0: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==19134== by 0x400625: main (main.cpp:19)
==19134== Address 0x51fd096 is 2 bytes after a block of size 4 alloc'd
==19134== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==19134== by 0x4005FC: main (main.cpp:16) 

尝试使用malloc() 2x2单通道纹理(4字节/ uint8_t s)时,我得到了“无效读取大小2”。 我假设分配太小 - 所讨论的架构上的字大小是8字节(64位) - 所以我将分配加倍并且它停止了valgrind的抱怨。 由于malloc()应该是对齐的,我对此感到有些惊讶(我确信这对专家来说是显而易见的),但也许它会帮助别人。 没有义务使用额外分配的空间,它只需要在那里。

......这是一个修复,即使它没有带来洞察力。 gcc 4.9.1(Ubuntu 4.9.1-16ubuntu6)发生问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM