2012-12-28 16 views
10

Sto avendo un problema con valgrind: Questo è il mio programma (bene la parte principale in cui compaiono gli errori):Valgrind: lettura non valido di dimensioni 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;} 

E quando ho eseguito valgrind che dice:

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

io non riesco a capire qual è il problema con questo programma.

+2

Controllare se 'p' è' NULL' dopo 'strtok'. – DCoder

+0

Potrebbe anche essere una buona idea eseguire programmi sotto un debugger per determinare cosa stanno facendo male. –

+2

Non c'è bisogno di un debugger qui, valgrind dice esattamente cosa sta succedendo qui. @ user1934103, leggi cosa ti sta dicendo. Quale indirizzo potrebbe essere '0x0' nel posto che sta indicando? Quindi ti sta dicendo che 'p' è' 0'. –

risposta

5

E 'possibile che strtok restituisca NULL quando non ci sono più token rimasti.

Quando si passa NULL a strcmp, si tratta di un comportamento non definito mentre si rimuove il riferimento NULL lì.

22

Come leggere questo:

lettura non valido di dimensioni 1

tuo programma sta tentando di leggere un byte da qualche parte che Valgrind non piace.

a 0x401569: main (: 395)

Dove nel codice questo accade (chiaramente strcmp è stato inline)

Indirizzo 0x0 non è stack'd malloc'd o (recentemente) free'd

Che indirizzo stava leggendo - 0x0 è "NULL". Il resto della dichiarazione dice solo perché non è valido (non è uno stack, non è qualcosa che hai ricevuto da malloc e non è stato liberato di recente). Il "recentemente" è menzionato perché valgrind tiene traccia della memoria liberata per un numero limitato di frees, quindi non si può dire con certezza che non è stato liberato un milione di frees indietro - in questo caso non lo era, ma se si vedi un messaggio del genere, potrebbe essere che è diventato non valido perché è stato liberato secoli fa. L'indirizzo non dovrebbe essere zero tho '(o vicino allo zero).

Problemi correlati