Search
Valgrind je nástroj pro analýzu paměti za běhu programu. Lze ho využít na zjištění dvou základních problémů: porovnávání neinicializovaných proměnných a nesprávná práce s dynamickou pamětí.
Co je špatně na následujícím kódu?
#include <stdio.h> int main (void) { int a; printf ("%s\n", (!a) ? "nula" : "nenula"); return 0; }
Vyzkoušejte spuštění ve Valgrindu a podívejte na výsledek:
$ gcc -g program.c -o program $ valgrind ./program
Jak se změní výstup Valgrindu pokud při definici proměnné použijeme modifikátor static? Proč?
static
V druhém příkladu se pokusíme do pole alokovaného v dynamické paměti načíst řetězec, který je delší než velikost pole.
#include <stdio.h> #include <stdlib.h> int main () { char *a = malloc(4); scanf ("%s", a); free (a); return 0; }
Ověříme výstup Valgrindu:
$ echo ahoj > data.in $ gcc -g program.c -o program $ valgrind ./program < data.in
Jak se změní výstup Valgrindu, když nebude v kódu uvolnění paměti pomocí funkce free?
free
Nebo další možnost kontroly jako v BRUTE, kde program Vám řekne i čísla řádků, kde se případné úniky vyskytují.
$ valgrind –max-stackframe=1000000000 –leak-check=full –error-exitcode=191 ./program < data.in