2012-05-07 5 views
6

Ich war vor kurzem in einem Programm einige Bugs aufzuspüren versuche ich mit valgrind arbeitete, und einer der Fehler, die ich bekam, war:Interpretieren valgrind Fehler Ungültige Schreib der Größe 4

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

die störende Zeile # 414 mal gelesen

amplitudes__[points_read] = 0x0; 

und amplitudes__ definiert ist früher als

uint32_t * amplitudes__ = (uint32_t*) amplitudes; 

Jetzt offensichtlich ein uint32 _t ist 4 Bytes lang, also ist das die Schreibgröße, aber könnte mir jemand sagen, warum es ungültig ist?

Antwort

4

points_read ist höchstwahrscheinlich außerhalb der Grenzen, Sie schreiben über (oder vorher) den Speicher, den Sie für amplitudes zugewiesen haben.

2

Ein typischer Fehler neue Programmierer tun, um diese Warnung zu erhalten, ist:

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

und dann versuchen, den Speicher an der Stelle ‚Größe‘ zu lesen oder schreiben:

many_a[size] = ...; 

Hier wird die Zuteilung sollte sein:

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