今天測試發現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等本身沒有檢錯能力的=函數,我們必須人為地加以判斷
