valgrind 程序測試出錯 Invalid read of size 4


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM