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.

Synopsis
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

OptionEffet
--leak-check=fulldétaille chaque fuite avec la ligne qui a alloué le bloc
--show-leak-kinds=allmontre aussi la mémoire encore atteignable à la fin
--track-origins=yesindique d'où vient une valeur non initialisée
-qn'affiche que les erreurs

Exemple

fuite.c
#include <stdlib.h>#include <string.h>
int main(void){    char *copie = malloc(16);
    strcpy(copie, "fuite");    return 0;}
Terminal
$ 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 en t[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.

C

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.

Ouvrir l'exercice

À toi d'écrire le code.