11.9.4.6 : Tests de qualité d'exécution/fuites mémoire



Un programme peut se comporter correctement au premier abord mais contenir des erreurs qui ne seront pas remontées par le système d'exploitation.

Généralement, un dépassement mémoire noteLecture au-delà de la mémoire allouée. Lire $N+1$ éléments dans un tableau de $N$ éléments, par exemple. provoque une erreur de type segmentation fault. Ceci est causé par le fait que le programme qui a produit ce dépassement a tenté une lecture ou une écriture dans un endroit de la mémoire auquel il n'avait pas les droits d'accès. D'où le célèbre segmentation fault de la part du système d'exploitation.



Cependant, si le dépassement mémoire touche une partie de la mémoire réservée pour le même programme (une autre variable ou un autre tableau) le système d'exploitation ne relèvera pas d'erreur puisqu'un programme peut faire ce qu'il veut de sa mémoire.

Dans l'absolu, ce comportement n'est tout de même pas souhaité par le développeur, mais comme aucune erreur n'est soulevée par le système d'exploitation, le développeur peut considérer que son programme est correct.



Un autre problème fréquent, est l'omission de la désallocation de la mémoire allouée dynamiquement (avec malloc, new ou mmap). Ce cas peut être décelé si la consommation mémoire est bien trop importante en comparaison de la taille de la mémoire RAM, mais sera extrêmement difficile à mettre en évidence si la consommation est faible.



Le programme valgrind [60]Valgrind permet d'analyser le comportement d'un programme pendant son exécution et ainsi déceler les fuites mémoires. Il peut même déterminer à quelle ligne de code le tableau qui n'est pas désalloué est effectivement alloué, (voir cours [144]Introduction to the Valgrind Debugger/Profiler, Pierre Aubert). Il détecte également les écrasements involontaires de variables suite à des dépassements mémoire et informe quelle ligne de code produit cet écrasement illégal (voir cours [144]Introduction to the Valgrind Debugger/Profiler, Pierre Aubert).



Il est très efficace de compléter les tests unitaires en les lançant également avec valgrind afin de garantir que l'exécution ne contient pas d'erreurs. Il faut néanmoins prendre en compte le fait que l'exécution avec valgrind sera légèrement plus lente.

Le programme valgrind peut également vérifier des programmes parallèles sur une même machine.