Поэтому, учитывая этот выход:Почему Valgrind сообщает о ошибках чтения/записи INSIDE действительных блоков?
==80518== Invalid read of size 4
==80518== at 0x558D: Node::ReadFolder(GFile*) (in ./ScribeRecoverMail2)
==80518== by 0x7B61: Worker::Export(GFile*, GArray<Node*>&) (in ./ScribeRecoverMail2)
==80518== by 0x8F7A: Worker::Main() (in ./ScribeRecoverMail2)
==80518== by 0x142D64: ThreadEntryPoint(void*) (in /Users/matthew/Code/Scribe-Branches/v2.00/Utils/ScribeRecoverMail2/build/Debug/ScribeRecoverMail2.app/Contents/Frameworks/Lgi.framework/Versions/A/Lgi)
==80518== by 0x47E258: _pthread_start (in /usr/lib/libSystem.B.dylib)
==80518== by 0x47E0DD: thread_start (in /usr/lib/libSystem.B.dylib)
==80518== Address 0x1d72f590 is 16 bytes inside a block of size 72 alloc'd
==80518== at 0x41581: malloc (vg_replace_malloc.c:266)
==80518== by 0x3D5616: operator new(unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib)
==80518== by 0x77A6: Worker::Scan(GFile*, GArray<Node*>&) (in ./ScribeRecoverMail2)
==80518== by 0x8F0C: Worker::Main() (in ./ScribeRecoverMail2)
==80518== by 0x142D64: ThreadEntryPoint(void*) (in /Users/matthew/Code/Scribe-Branches/v2.00/Utils/ScribeRecoverMail2/build/Debug/ScribeRecoverMail2.app/Contents/Frameworks/Lgi.framework/Versions/A/Lgi)
==80518== by 0x47E258: _pthread_start (in /usr/lib/libSystem.B.dylib)
==80518== by 0x47E0DD: thread_start (in /usr/lib/libSystem.B.dylib)
==80518==
==80518== Invalid read of size 4
==80518== at 0x10B70F: GFile::Read(void*, int, int) (in /Users/matthew/Code/Scribe-Branches/v2.00/Utils/ScribeRecoverMail2/build/Debug/ScribeRecoverMail2.app/Contents/Frameworks/Lgi.framework/Versions/A/Lgi)
==80518== by 0x360E: Node::Read(GFile*, unsigned int&) (in ./ScribeRecoverMail2)
==80518== by 0x55CF: Node::ReadFolder(GFile*) (in ./ScribeRecoverMail2)
==80518== by 0x7B61: Worker::Export(GFile*, GArray<Node*>&) (in ./ScribeRecoverMail2)
==80518== by 0x8F7A: Worker::Main() (in ./ScribeRecoverMail2)
==80518== by 0x142D64: ThreadEntryPoint(void*) (in /Users/matthew/Code/Scribe-Branches/v2.00/Utils/ScribeRecoverMail2/build/Debug/ScribeRecoverMail2.app/Contents/Frameworks/Lgi.framework/Versions/A/Lgi)
==80518== by 0x47E258: _pthread_start (in /usr/lib/libSystem.B.dylib)
==80518== by 0x47E0DD: thread_start (in /usr/lib/libSystem.B.dylib)
==80518== Address 0x1a198900 is 0 bytes inside a block of size 24 alloc'd
==80518== at 0x41581: malloc (vg_replace_malloc.c:266)
==80518== by 0x3D5616: operator new(unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib)
==80518== by 0xDFADB: GFile::GFile() (in /Users/matthew/Code/Scribe-Branches/v2.00/Utils/ScribeRecoverMail2/build/Debug/ScribeRecoverMail2.app/Contents/Frameworks/Lgi.framework/Versions/A/Lgi)
==80518== by 0x8E4E: Worker::Main() (in ./ScribeRecoverMail2)
==80518== by 0x142D64: ThreadEntryPoint(void*) (in /Users/matthew/Code/Scribe-Branches/v2.00/Utils/ScribeRecoverMail2/build/Debug/ScribeRecoverMail2.app/Contents/Frameworks/Lgi.framework/Versions/A/Lgi)
==80518== by 0x47E258: _pthread_start (in /usr/lib/libSystem.B.dylib)
==80518== by 0x47E0DD: thread_start (in /usr/lib/libSystem.B.dylib)
Кажется, что Valgrind жалуется нормального повседневного поведения. Эти блоки все еще выделены, и доступ находится внутри блоков памяти, начиная и заканчивая. Так почему же валгринд жалуется?
Эта программа рушится на окнах, поэтому я построил ее на Mac, чтобы отбросить ее и увидеть, где все идет не так. До сих пор много предупреждений об ошибках внутри блока, но ничего сомнительного, как «писать в свободную память» или что-то еще. Я совершенно смущен.
PS, работающий с последней стабильной версией valgrind v3.7.0, скомпилирован и установлен на той же машине, что и я. Я давно использую valgrind и никогда не видел такого сообщения.
Как выглядит GFile :: Read? Кажется, что адрес относится к целевой памяти (буфер GFile), в то время как его исходные данные недопустимы. –
Привет, Франк, функция этой функции доступна здесь: http://lgi.svn.sourceforge.net/viewvc/lgi/trunk/src/mac/General/GFile.cpp?revision=393&view=markup – fret
Я видя такой же отказ valgrind в системе Linux: http://stackoverflow.com/questions/30985301/valgrind-reporting-invalid-read-entirely-within-still-allocated-block – Novelocrat