Interpretatie van valgrind-fout Ongeldige schrijfactie van grootte 4

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_readis 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));

Other episodes