2012-05-07 9 views
6

Recentemente sono stato cercando di rintracciare alcuni bug in un programma di cui sto lavorando con valgrind, e uno degli errori ho ottenuto è stato:Interpretare errore valgrind scrittura non valido di dimensioni 4

==6866== Invalid write of size 4 
==6866== at 0x40C9E2: superneuron::read(_IO_FILE*) (superneuron.cc:414) 

la linea incriminata # 414 letture

amplitudes__[points_read] = 0x0; 

e amplitudes__ è definito in precedenza come

uint32_t * amplitudes__ = (uint32_t*) amplitudes; 

Ora, ovviamente, un uint32 _t è lungo 4 byte, quindi questa è la dimensione della scrittura, ma qualcuno potrebbe dirmi perché non è valido?

risposta

4

points_read è molto probabilmente fuori limite, si sta scrivendo oltre (o prima) la memoria allocata per amplitudes.

2

Un errore tipico nuovi programmatori fare per ottenere questo avvertimento è:

struct a *many_a; 
many_a = malloc(sizeof *many_a * size + 1); 

e quindi provare a leggere o scrivere la memoria nella posizione 'size':

many_a[size] = ...; 

Qui l'assegnazione dovrebbe be:

many_a = malloc(sizeof *many_a * (size + 1)); 
Problemi correlati