Az, hogy mutatsz példát, ahol működik nem jelenti azt, hogy mindenhol működik. A Valgrind a félrecímzést akkor szúrja ki, ha értelmetlen helyre történik. Ha véletlenül egy másik változót írsz felül, azt nem veszi észre. Te meg pisloghatsz, hogy mitől változott meg egy változó értéke, aminek nem kellett volna.
Parttalan ez a vita, ha nem érted a különbséget aközött, hogy heurisztikák többnyire észrevesznek valamit, vagy a Valgrind általában kiszúrja a hibát, ha triggerelődik a tesztfutás alatt, és aközött, hogy elvileg nem lehetséges egy adott típusú hibának előfordulni a rendszerben.
trükkös.c
extern void rendeles(int n, const char * termeknev);
int main(int argc, char **argv)
{
int n = 1;
rendeles(n, "kutjagummi, de nagyon hosszu, minden bufferen tulmutato merete van, tobb mint 30 hosszu, de a compilernek ne mondd meg, pssszt!");
(void)argc; (void)argv;
return 0;
}
rendeles.c
#include <stdio.h>
void rendeles(int n, const char * termeknev)
{
char celbufferpointer[30];
sprintf(celbufferpointer, "%d darab %s-t rendeltünk", n, termeknev);
}
Fordítás és futtatás:
$ gcc -g -ansi -pedantic -Wall -Wextra trukkos.c rendeles.c
$ ./a.out
*** stack smashing detected ***: terminated
Aborted (core dumped)
Ennyikeh