Valgrind beschwert sich mit "Ungültiger Schreibvorgang der Größe 8"

8

Ich arbeite an einem kleinen Hobby-Projekt ( www.github.com/AzP/GLSL-Validate ) ) wo ich alten Code genommen habe (zu viel c und zu wenig c ++ für meinen eigenen Geschmack, aber hey, was kannst du tun?) und ich versuche, es unter Linux und Windows aufzusetzen. Ich hatte ein paar Abstürze (jetzt hoffentlich behoben), aber seit ich begonnen habe, Valgrind zu leiten, um die Probleme zu finden, bin ich fest entschlossen, die Beschwerden, die ich bekomme, zu beheben.

Ich kann einfach nicht sehen, was mit diesem Code nicht stimmt (außer dass es ziemlich schwierig ist, mit netten "magischen Zahlen" über den Ort verteilt zu lesen) in Bezug auf die Valgrind-Beschwerden.

Ich führe Valgrind mit dem folgenden Befehl valgrind --track-origins=yes ./Program

%Vor%

Und hier kommt die Valgrind-Ausgabe. Bedeutet das is 0 bytes inside a block of size 6 alloc'd , dass ich es ignorieren kann? Ich meine '0 Bytes' klingt nicht gefährlich? Aber da ich die Frage hier gepostet habe, denke ich, dass ich denke, dass ich darauf achten sollte.

%Vor%

EDIT: Ich brauche den Code, um in einem C ++ Compiler zu kompilieren, deshalb muss ich alle Umwandlungen von malloc behalten.

    
AzP 05.10.2011, 22:29
quelle

1 Antwort

13

Das sieht falsch aus:

%Vor%

Sollte wahrscheinlich sein:

%Vor%

(Leerzeichen wurden zur Vereinfachung hinzugefügt.)

BEARBEITEN : Einige zusätzliche Erklärungen: Wenn Sie return_data[i]=... sagen, versuchen Sie etwas in return_data[i] zu schreiben. Jetzt ist return_data char** , also return_data[i] ist char* . Sie schreiben also einen Zeiger auf einen Speicherort im Speicher.

Es sieht so aus, als ob Ihre Zeiger 8 Bytes lang sind (was gut ist), aber Sie haben nur 6 Bytes zugewiesen: MAX_SOURCE_STRING+1 . Es gibt also ein Problem.

Die Tatsache, dass Sie versuchen, es in Offset 0 zu schreiben, spielt keine Rolle - Sie versuchen immer noch, mehr Daten zu schreiben, als der Puffer aufnehmen kann, und darüber beklagt sich Valgrind.

Um das Problem zu lösen, sollten Sie genügend Platz für ein Array von Zeigern reservieren. Jeder Zeiger nimmt sizeof(char*) , was auch als sizeof(*return_data) oder sizeof *return_data geschrieben werden kann. Also sollten Sie n * sizeof *return_data bytes zuweisen, wobei n (in Ihrem Fall) die magische Zahl 6 ist.

    
Omri Barel 05.10.2011, 22:37
quelle