Ik probeerde onlangs een aantal bugs op te sporen in een programma waaraan ik werk met valgrind, en een van de fouten die ik kreeg was:
==6866== Invalid write of size 4
==6866== at 0x40C9E2: superneuron::read(_IO_FILE*) (superneuron.cc:414)
de aanstootgevende regel # 414 luidt
amplitudes__[points_read] = 0x0;
en amplitudes__ is eerder gedefinieerd als
uint32_t * amplitudes__ = (uint32_t* ) amplitudes;
Het is duidelijk dat een uint32_t 4 bytes lang is, dus dit is de schrijfgrootte, maar kan iemand me vertellen waarom het ongeldig is?
Antwoord 1, autoriteit 100%
points_read
is hoogstwaarschijnlijk buiten de grenzen, je schrijft voorbij (of eerder) het geheugen dat je hebt toegewezen voor amplitudes
.
Antwoord 2, autoriteit 38%
Een typische fout die nieuwe programmeurs maken om deze waarschuwing te krijgen is:
struct a *many_a;
many_a = malloc(sizeof *many_a * size + 1);
en probeer dan het geheugen te lezen of te schrijven op locatie ‘size’:
many_a[size] = ...;
Hier zou de toewijzing moeten zijn:
many_a = malloc(sizeof *many_a * (size + 1));