valgrind - 地址是一个大小为16的块之前的8个字节

qiu*_*bit 9 c valgrind

我遇到了"消化"valgrind输出的问题.这是一个片段:

==15145== Invalid write of size 8
==15145==    at 0x40168E: split_node_at_letter (in /home/pgolinski/Dokumenty/Programowanie/git/dictionary/trii)
==15145==    by 0x4018E7: pass_word_further (in /home/pgolinski/Dokumenty/Programowanie/git/dictionary/trii)
==15145==    by 0x401A35: insert_word (in /home/pgolinski/Dokumenty/Programowanie/git/dictionary/trii)
==15145==    by 0x401BD5: main (in /home/pgolinski/Dokumenty/Programowanie/git/dictionary/trii)
==15145==  Address 0x52237d8 is 8 bytes before a block of size 16 alloc'd
==15145==    at 0x4C29BCF: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==15145==    by 0x401063: add_to_trie_word_list (in /home/pgolinski/Dokumenty/Programowanie/git/dictionary/trii)
==15145==    by 0x40173B: pass_word_further (in /home/pgolinski/Dokumenty/Programowanie/git/dictionary/trii)
==15145==    by 0x40183D: pass_word_further (in /home/pgolinski/Dokumenty/Programowanie/git/dictionary/trii)
==15145==    by 0x401906: pass_word_further (in /home/pgolinski/Dokumenty/Programowanie/git/dictionary/trii)
==15145==    by 0x401A35: insert_word (in /home/pgolinski/Dokumenty/Programowanie/git/dictionary/trii)
==15145==    by 0x401BD5: main (in /home/pgolinski/Dokumenty/Programowanie/git/dictionary/trii)
Run Code Online (Sandbox Code Playgroud)

地址是"大小为16的块之前的8个字节"是什么意思?

Ere*_*ith 18

这意味着Valgrind检测到您malloc()为程序分配的(通过或类似的)一个内存块,并且您尝试访问之前为8个字节的地址.

简而言之,这是一个Array Out of Bounds错误,您尝试在实际数组数据之前访问数据

一个incorrect write意味着你的值分配给这个数据段的东西.例如做word.length = 4

这是valgrind输出的细分:

==15145== Invalid write of size 8
             //This is the function doing the incorrect accessing
==15145==    at 0x40168E: split_node_at_letter (in /home/pgolinski/Dokumenty/Programowanie/git/dictionary/trii)
           [... stack trace ...]

                //This is the address you are trying to access
==15145==  Address 0x52237d8 is 8 bytes before a block of size 16 alloc'd
==15145==    at 0x4C29BCF: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)

             //This is the function that alloc'd the 'block of size 16' (calling malloc as shown in the above line)
==15145==    by 0x401063: add_to_trie_word_list (in /home/pgolinski/Dokumenty/Programowanie/git/dictionary/trii)

           [... stack trace ...]
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,事实证明是使用“-1”作为索引访问数组导致了此错误。 (2认同)