Rejoignez-nous le 30 avril : dévoilement de Parasoft C/C++test CT pour l'excellence en matière de tests continus et de conformité | En savoir plus

Recherche d'une fuite de mémoire en C ou C ++

Portrait d'Arthur Hicken, évangéliste chez Parasoft
2 août 2023
3 min lire

En raison de données abondantes, les fuites de mémoire dans le développement de logiciels peuvent être difficiles à identifier. Cet article vous apprendra à utiliser un programme de détection d'erreurs d'exécution pour trouver des fuites de mémoire en C et C++.

Les fuites de mémoire dans les logiciels de programmation peuvent être difficiles à identifier car il y a une abondance de données. Dans cet article, vous pouvez apprendre à trouver des fuites de mémoire dans les applications C et C++ à l'aide d'un outil de détection d'erreurs d'exécution.

Qu'est-ce qu'une fuite de mémoire? Exemples C ++ et C

Lorsque vous êtes confronté à une fuite de mémoire, C ++ et C disposent d'un ensemble d'outils de détection d'exécution qui peuvent être en mesure d'améliorer les performances. Ceux qui écrivent du code en C ou C ++ connaissent les fuites de mémoire. Wikipedia propose la définition suivante:

En informatique, une fuite de mémoire est un type de fuite de ressources qui se produit lorsqu'un programme informatique gère incorrectement les allocations de mémoire de telle sorte que la mémoire qui n'est plus nécessaire n'est pas libérée. Une fuite de mémoire peut également se produire lorsqu'un objet est stocké en mémoire mais n'est pas accessible par le code en cours d'exécution.

En d'autres termes, les fuites signifient que la mémoire allouée dynamiquement ne peut pas être libérée vers le système d'exploitation car le programme ne contient plus de pointeurs qui peuvent y accéder. Vous avez perdu le contrôle de cette mémoire quelle que soit sa taille et ne pouvez plus y accéder ou la libérer.

Un des meilleurs exemples de ce comportement peut être vu en exécutant le programme «Hello world» ci-dessous.

   
/ * * Fichier: hello.c * / #include #comprendre int main (int argc, char * argv []) {char * string, * string_so_far; int i, longueur; longueur = 0; pour (i = 0; i

Si nous exécutons ce programme avec les arguments suivants:

bonjour c'est un test

Si nous examinons l'état du programme à la ligne 25, juste avant d'exécuter l'appel à malloc pour la deuxième fois, nous observons:

  • La chaîne de variables pointe jusqu'à présent sur la chaîne "bonjour" qui a été affectée à la suite de l'itération de boucle précédente.
  • La chaîne variable pointe vers la chaîne étendue «hello this» qui a été assignée lors de cette itération de boucle.

Ces affectations sont schématisées ci-dessous; les deux variables pointent vers des blocs de mémoire allouée dynamiquement.

La déclaration suivante:

string_so_far = chaîne;

créera les deux variables pointant vers le bloc de mémoire le plus long comme indiqué ci-dessous:

Une fois que cela se produit, cependant, il ne reste plus de pointeur qui pointe vers le bloc le plus court. Même si vous le vouliez, il n'y a aucun moyen de récupérer la mémoire précédemment pointée par string_so_far; il est désormais attribué de manière permanente. C'est ce qu'on appelle une «fuite de mémoire». C ++ et C sont souvent confrontés à ces problèmes courants, il est donc important de les détecter tôt.

Comment trouvez-vous une fuite de mémoire en C ++ et C?

Bien qu'il n'y ait pas de bouton pour «détecter les fuites de mémoire», C ++ et c ont des outils de détection d'exécution qui peuvent vous aider. Ce type d'erreur peut être diagnostiqué par des outils de détection d'erreurs de mémoire, tels que Parasoft Insure ++. Ceci est montré ci-dessous:

[bonjour.c: 25] ** LEAK_ASSIGN ** >> string_so_far = string; Fuite de mémoire en raison de la réaffectation du pointeur: chaîne Bloc perdu: 0x0804bd68 à 0x0804bd6f chaîne (8 octets), allouée à hello.c, 15 malloc () (interface) main () hello.c, 15 trace de la pile où l'erreur s'est produite: main ( ) bonjour.c, 25

Cet exemple s'appelle LEAK_ASSIGN car il se produit lorsqu'un pointeur est réaffecté. (PS Les autres débogueurs de mémoire ne font souvent pas de distinction entre la mémoire exceptionnelle et la mémoire réellement perdue, mais Insure ++ le fait.) Dans ce cas, une mémoire exceptionnelle n'est pas une mémoire géniale, c'est une mémoire que vous n'avez pas libérée, contrairement à une fuite réelle qui est de la mémoire que vous ne pouvez pas libérer.

Types de fuites de mémoire

Parasoft Insure++ peut également détecter automatiquement plusieurs autres types de fuites.

Type de fuiteDescription
FUITE_FREESe produit lorsque vous libérez un bloc de mémoire qui contient des pointeurs vers d'autres blocs de mémoire.
FUITE_RETOURSe produit lorsqu'une fonction renvoie un pointeur vers un bloc de mémoire alloué, mais que la valeur renvoyée est ignorée dans la routine d'appel.
FUITE_SCOPESe produit lorsqu'une fonction contient une variable locale qui pointe vers un bloc de mémoire, mais que la fonction retourne sans enregistrer le pointeur dans une variable globale ou le renvoyer à son appelant.

Notez que le message d'erreur indique la ligne source exacte sur laquelle le problème se produit, pas seulement l'endroit où le bloc a été alloué, ce qui est un problème clé dans la recherche et la résolution des fuites de mémoire. Ceci est extrêmement important car il est facile d'introduire des fuites de mémoire subtiles dans vos applications, mais il est très difficile de les trouver toutes.

Si vous recherchez un outil C++ de vérification des fuites de mémoire,  en savoir plus sur Parasoft Insure++ ici.

Détection et visualisation des erreurs d'exécution et de mémoire avec Parasoft Insure ++