Contrôler les fuites mémoire avec Valgrind

Ghassen

Valgrind est un outil de programmation libre pour débuguer, effectuer du profilage du code et mettre en évidence des fuites mémoire.

Valgrind possède plusieurs outils  :

  1. Memcheck : un détecteur de mauvaise gestion mémoire
  2. Callgrind : un profileur
  3. Cachegrind : un simulateur des caches

On va s’intéresser dans cet article sur sa fonctionnalité première qui est de contrôler l’utilisation de la mémoire avec Memcheck.

Memcheck permet de détecter les opérations interdites d’accès mémoire en lecture ou en écriture et vérifie entre autres :

  • Qu’on n’utilise pas des valeurs ou des pointeurs non initialisés
  • Qu’on n’accède pas à des zones mémoire libérées ou non allouées
  • Qu’on ne libère pas deux fois une zone mémoire
  • Qu’on n’oublie pas de libérer la mémoire allouée. Des options permettent de connaître avec précision les zones de mémoire qui sont perdues.
  • Qu’on passe des arguments valides à certaines fonctions de la librairie standard comme la fonction memcpy().
Commande

leak-check

  • no : ne fait rien.
  • full / yes : donne des détails sur chaque fuite mémoire.
  • summary : indique le nombre des fuites mémoire.

leak-resolution

indique le niveau de recherche des fuites mémoire.

show-reachable

étend la recherche aux zones encore pointées mais non désallouées.

 

Prenons un exemple illustrant comment on peut détecter une erreur mémoire grâce à valgrind:

Ci-dessous le programme de test :

Compilons-le :

Le code compile bien et aucune erreur n’est détectée.

Maintenant exécutons-le avec valgrind (utilisons l’outil memcheck):

Ouvrons le fichier file.out qui contient  le résulat obtenu de la commande valgrind : 

On apprend que l’erreur de segmentation a lieu dans la fonction main, à la 5° ligne du fichier test.c ! Jetons un petit coup d’œil .

C’est une erreur de segmentation (débordement de mémoire en écriture) : écriture d’une variable de taille 6 (incluant le caractère de fin de chaîne) dans une case mémoire de taille 5.

Facile à corriger, donc on modifie notre code pour donner :

Et là aucun problème !

Grâce  à l’outil Memcheck de Valgrind, On a pu détecter une erreur de mémoire qui n’a pas été visible à la phase de compilation et on a évité un plantage ultérieur de programme à l’exécution.

facebooktwittergoogle_plusmail

Laisser un commentaire