Découvrez comment la solution Parasoft Continuous Quality permet de contrôler et de gérer les environnements de test pour fournir des logiciels de haute qualité en toute confiance. Inscrivez-vous pour la démo >>

BLOG

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

Recherche d'une fuite de mémoire en C ou C ++ Temps de lecture : 3 minutes

Contrairement à l'image ci-dessus, 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 à rechercher 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.

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

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 variable string_so_far pointe vers la chaîne «hello» qui lui a été assignée suite à 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 fuite Description
LEAK_FREE Se produit lorsque vous libérez un bloc de mémoire qui contient des pointeurs vers d'autres blocs de mémoire.
LEAK_RETURN Se 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.
LEAK_SCOPE Se 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, vous pouvez obtenir un essai gratuit de Parasoft Insure ++.

Obtenez le débogueur de mémoire ultime pour C et C ++.
Essayez Parasoft Insure ++

 

Écrit par

Arthur Hicken

Arthur est impliqué dans la sécurité logicielle et l'automatisation des tests chez Parasoft depuis plus de 25 ans, aidant à la recherche de nouvelles méthodes et techniques (dont 5 brevets) tout en aidant les clients à améliorer leurs pratiques logicielles.

Recevez les dernières nouvelles et ressources sur les tests de logiciels dans votre boîte de réception.