2012-12-28 7 views
10

ich ein Problem mit valgrind habe: Das ist mein Programm (auch der Hauptteil, wo die Fehler auftreten):Valgrind: Ungültige Lese der Größe 1

int main() 
{ 
char comanda[N]; 
.... 
char *p; 
while(fgets(comanda,100,stdin)!=NULL) 
    { 
    p=strtok(comanda," \n"); 
    if (strcmp(comanda,"INIT")==0) 
     { 
     p=strtok(NULL," "); 
     Init(n);   
     } 
395 >>if (strcmp(p,"DUMP")==0) 
     { 
     Dump(n);} 
    if (strcmp(p,"ALLOC")==0) 
     { 
     Alloc(j,n); 
     } 
    ....return 0;} 

Und wenn ich laufe valgrind heißt es:

Invalid read of size 1 
at 0x401569: main (:395) 
Address 0x0 is not stack'd malloc'd or (recently) free'd 

ich nicht herausfinden kann, was mit diesem Programm los ist.

+2

Überprüfen Sie, ob 'p'' NULL' nach 'strtok' ist. – DCoder

+0

Es könnte auch eine gute Idee sein, Programme unter einem Debugger auszuführen, um festzustellen, was sie falsch machen. –

+2

Keine Notwendigkeit für einen Debugger hier, Valgrind genau sagt, was hier vorgeht. @ user1934103, bitte lesen Sie, was es Ihnen sagt. Welche Adresse könnte "0x0" an der Stelle sein, an der sie angezeigt wird? Also sagt es dir, dass "p" "0" ist. –

Antwort

5

Es ist möglich, dass strtok NULL zurückgibt, wenn keine Token mehr vorhanden sind.

Wenn Sie NULL an strcmp übergeben, ist es ein undefiniertes Verhalten, da Sie NULL dort de-referenzieren.

22

Wie dies zu lesen:

Ungültige Lese der Größe 1

Ihr Programm versucht, ein Byte von irgendwo zu lesen, dass Valgrind nicht mag.

bei 0x401569: main (: 395)

Wo im Code dies geschieht (klar STRCMP wurde inlined)

Adresse 0x0 ist nicht stack'd malloc'd oder (Kürzlich) frei

Was die Adresse, die es las - 0x0 ist "NULL". Der Rest der Aussage sagt nur, warum es ungültig ist (es ist nicht vom Stapel, es ist nicht etwas, das Sie von malloc haben, und wurde nicht kürzlich freigegeben). Das "Kürzlich" wird erwähnt, da Valgrind den freigewordenen Speicher für eine begrenzte Anzahl von Frees im Auge behält, also kann es nicht mit Sicherheit sagen, dass es nicht eine Million freigegeben wurde - in diesem Fall war es nicht, aber wenn Sie Sieh eine Nachricht wie diese, es könnte sein, dass sie ungültig geworden ist, weil sie vor Jahren befreit wurde. Die Adresse wäre nicht null tho '(oder nahe Null).

Verwandte Themen