ungültiger Lese-Speicher - Valgrind

8

Hier ist mein Code: Ich versuche, die Informationen einer Struktur zu erhalten und die Informationen tief zu kopieren. Aber valgrind zeigt "ungültiges Lesen" an. Ich weiß, dass ich die Erinnerung lese, die veröffentlicht wird. Ich weiß nicht warum; kann jemand es für mich herausfinden?

Code

%Vor%

Valgrind-Bericht

%Vor%     
kevin 28.12.2013, 04:14
quelle

2 Antworten

6

Ich denke, das ist ein Fehlerbericht von valgrind , den Sie unterdrücken sollten. Es ist letztlich ein Fehler in der C-Bibliothek auf Ihrem System.

Die Beschwerde lautet, dass der von strdup() aufgerufene Code 4 Byte bei einem Offset von 4 Byte in einen Block von 6 Byte liest, die von malloc() zugewiesen wurden. Da "kevin" 6 Bytes belegt, glaube ich, dass eine memcpy() Variante von strdup() verwendet wurde und beim Lesen von 4 Bytes gleichzeitig durch die Daten gefangen wurde. Es ist zwar sicher, aber technisch gesehen ist valgrind korrekt, sich zu beschweren. Sie können jedoch nichts dagegen tun - Ihr Code ist unschuldig und die Systembibliothek ist schuldig. Dafür gibt es Unterdrückungen!

%Vor%

Die schnelle Kopie verwendet die Tatsache, dass die malloc() 'd Daten 4-Byte (wahrscheinlicher, 8-Byte) ausgerichtet sind. Er kopiert die 4 Bytes 'k', 'e', ​​'v' und 'i' in einer Operation; Es kopiert dann die anderen zwei Bytes der Zeichenfolge ('n', '\ 0') plus die zwei Bytes, die in einer zweiten Operation technisch nicht Teil des zugewiesenen Speicherplatzes sind. Die minimale tatsächliche Zuweisung ist wahrscheinlich 8 Bytes auf einem 32-Bit-System; Bei 64-Bit-Rechnern ist es meist 16 Byte. Das bedeutet, dass die zusätzlichen zwei Bytes Teil des für die Speicherzuweisung reservierten Speicherplatzes sind, aber valgrind ist korrekt, um zu melden, dass der Code außerhalb des zugewiesenen Speicherplatzes kopiert.

    
Jonathan Leffler 28.12.2013, 06:58
quelle
1

Dies sieht wie eine Optimierung in strdup() und puts() aus, sie lesen ihre Eingabe in Blöcken von vier Bytes anstelle von einem Byte nach dem anderen, achten jedoch darauf, nicht zu schreiben Ende. Dies ist sicher, solange die vier Byte-Adressen ausgerichtet sind: Richtig ausgerichtete Lesevorgänge können niemals eine Hardware-Ausnahme auslösen, und da diese beiden Funktionen nicht über das Ende der Zeichenfolge hinaus schreiben, ist ihre Operation sicher. obwohl es aus sprachlicher Sicht illegal ist. Und Sie können sicher sein, dass diese Vier-Byte-Adressen richtig ausgerichtet sind, da es sich um eine Optimierung handelt. Nicht-ausgerichtetes Lesen würde den Code zum Crawlen bringen.

Valgrind prüft das Sprachlevel der Korrektheit, nicht auf der physischen Ebene, daher der Fehlerbericht. Also stimme ich Jonathan Leffler zu, dass Sie diesen "Fehler" einfach unterdrücken sollten, was, wenn Sie die Kommentare betrachten, automatisch von neueren Versionen von Valgrind übernommen wird.

    
cmaster 28.12.2013 07:13
quelle

Tags und Links