valgrind(1)
Outil de développement
Exécute ton programme en surveillant chaque accès mémoire : lectures invalides, valeurs non initialisées, blocs jamais libérés.
valgrind [options] programme [arguments]Description
Valgrind fait tourner ton programme sur un processeur simulé. Son outil par défaut, Memcheck, intercepte chaque lecture, chaque écriture, chaque malloc et chaque free. Il signale les accès hors des blocs alloués, les utilisations de valeurs jamais initialisées, les doubles libérations, et à la fin la mémoire restée allouée. Le programme tourne nettement plus lentement, c'est le prix de cette surveillance.
Compile avec -g : sans ça, les rapports donnent des adresses au lieu de noms de fichiers et de numéros de lignes.
Options utiles
| Option | Effet |
|---|---|
--leak-check=full | détaille chaque fuite avec la ligne qui a alloué le bloc |
--show-leak-kinds=all | montre aussi la mémoire encore atteignable à la fin |
--track-origins=yes | indique d'où vient une valeur non initialisée |
-q | n'affiche que les erreurs |
Exemple
#include <stdlib.h>#include <string.h>
int main(void){ char *copie = malloc(16);
strcpy(copie, "fuite"); return 0;}$ gcc -g fuite.c -o fuite$ valgrind --leak-check=full ./fuite==33== Memcheck, a memory error detector==33== Copyright (C) 2002-2024, and GNU GPL'd, by Julian Seward et al.==33== Using Valgrind-3.24.0 and LibVEX; rerun with -h for copyright info==33== Command: ./fuite==33== ==33== ==33== HEAP SUMMARY:==33== in use at exit: 16 bytes in 1 blocks==33== total heap usage: 1 allocs, 0 frees, 16 bytes allocated==33== ==33== 16 bytes in 1 blocks are definitely lost in loss record 1 of 1==33== at 0x488545C: malloc (vg_replace_malloc.c:446)==33== by 0x400653: main (fuite.c:6)==33== ==33== LEAK SUMMARY:==33== definitely lost: 16 bytes in 1 blocks...==33== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)Le nombre au début de chaque ligne est le PID du processus. Le bloc de 16 octets alloué à la ligne 6 n'a jamais été libéré, et plus aucun pointeur ne le désigne : il est « definitely lost ».
Pièges
Valgrind ne voit que le chemin réellement exécuté. Un test qui ne passe pas par le code fautif ne signale rien.
Il ne surveille pas les dépassements à l'intérieur de la pile, comme un
int t[5]lu ent[5]. Pour ceux-là, compile avec-fsanitize=address.Sur macOS récent, Valgrind n'est pas disponible officiellement. Un conteneur Linux, WSL ou le terminal d'un exercice Grademe font l'affaire.
read_the_leak
Répare build_path, qui renvoie le bon chemin mais perd un bloc à chaque appel : lis le rapport de fuite, puis libère le bloc emprunté en route.