今天测试发现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)
错误出现的地方是链表的插入环节, 于是我找到了链表的插入函数, 以下就是测试代码:
但根据这代码找不出问题所在
测试了好就仍然没有发现问题, 最后发现了一个疑问:节点的容量太小而插入的数据较大, 导致擦写到了不该访问的内存
于是将节点的数据存储大小调大一倍(原本是64字节, 改成128字节), 再次测试, 问题终于解决
反思:
本次的错误出现的原因是
1. 对数据的大小猜测不够准确, 没有预留足够大的空间
2. 程序本身没有做数据大小判断, 针对于类似memcpy等本身没有检错能力的=函数,我们必须人为地加以判断