首页 > 其他 > 详细

valgrind 程序测试出错 Invalid read of size 4

时间:2014-02-13 17:25:02      阅读:969      评论:0      收藏:0      [点我收藏+]

今天测试发现valgrind发现了一个错误 :Invalid read of size 4

但是之前还测试得好好的, 于是一步步排查错误, 错误的具体信息如下:

Invalid read of size 4

==19400==    at 0x4009460: memcpy (mc_replace_strmem.c:883)

==19400==    by 0x804CA18: dequeue_queue (queue_linklist.c:83)

==19400==    by 0x804C3FE: pthread_sender (pthread_sender.c:253)

==19400==    by 0x364A48: start_thread (in /lib/libpthread-2.12.so)

==19400==    by 0x2A0AAD: clone (in /lib/libc-2.12.so)

==19400==  Address 0x78ad17c is 4 bytes after a block of size 80 alloc‘d

==19400==    at 0x40072D5: malloc (vg_replace_malloc.c:291)

==19400==    by 0x804C94B: insert_data_queue (queue_linklist.c:24)

==19400==    by 0x804BC75: pthread_recv_data (pthread_recv_data.c:1103)

==19400==    by 0x364A48: start_thread (in /lib/libpthread-2.12.so)

==19400==    by 0x2A0AAD: clone (in /lib/libc-2.12.so)

错误出现的地方是链表的插入环节, 于是我找到了链表的插入函数, 以下就是测试代码:bubuko.com,布布扣

但根据这代码找不出问题所在

测试了好就仍然没有发现问题, 最后发现了一个疑问:节点的容量太小而插入的数据较大, 导致擦写到了不该访问的内存

于是将节点的数据存储大小调大一倍(原本是64字节, 改成128字节), 再次测试, 问题终于解决

 

反思:

  本次的错误出现的原因是

    1. 对数据的大小猜测不够准确, 没有预留足够大的空间

    2. 程序本身没有做数据大小判断, 针对于类似memcpy等本身没有检错能力的=函数,我们必须人为地加以判断

valgrind 程序测试出错 Invalid read of size 4

原文:http://www.cnblogs.com/sirius-xu/p/3547663.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!