Vérificateur d'application combiné avec Outils de débogage pour Windows est une installation étonnante. (J'ai découvert l'existence d'Application Verifier en recherchant un système de gestion de la qualité. question précédente sur un problème de corruption de tas .) J'ai également utilisé BoundsChecker et Insure++ (mentionnés dans d'autres réponses) dans le passé, mais j'ai été surpris par la quantité de fonctionnalités présentes dans Application Verifier.
Clôture électrique (alias "efence"), dmalloc , Valgrind etc. méritent tous d'être mentionnés, mais la plupart d'entre eux sont beaucoup plus faciles à faire fonctionner sous *nix que sous Windows. Valgrind est ridiculement flexible : J'ai débogué de gros logiciels de serveur avec de nombreux problèmes de tas en l'utilisant.
Si tout le reste échoue, vous pouvez fournir vos propres opérateurs globaux new/delete et surcharges malloc/calloc/realloc -- la façon de le faire variera un peu en fonction du compilateur et de la plate-forme -- et ce sera un peu un investissement -- mais il peut s'avérer payant à long terme. La liste des fonctionnalités souhaitables devrait être familière à dmalloc et electricfence, ainsi qu'au livre, étonnamment excellent, intitulé Écrire du code solide :
-
valeurs sentinelles : laisser un peu plus d'espace avant et après chaque allocation, en respectant l'exigence d'alignement maximum ; remplir avec des nombres magiques (aide à attraper les débordements et les sous-débordements de tampon, et les pointeurs "sauvages" occasionnels).
-
remplissage de l'allocation : remplir les nouvelles allocations avec une valeur magique non-0 -- Visual C++ le fait déjà pour vous dans les constructions Debug (aide à détecter l'utilisation de variables non initialisées).
-
remplissage libre : remplir la mémoire libérée avec une valeur magique non-0, conçue pour déclencher un segfault si elle est déréférencée dans la plupart des cas (aide à attraper les pointeurs dangling).
-
sans retard : ne pas remettre la mémoire libérée dans le tas pendant un certain temps, la garder libre mais non disponible (aide à attraper plus de pointeurs pendants, attrape les doubles-freins proches).
-
suivi de la possibilité d'enregistrer le lieu où une allocation a été faite peut parfois être utile.
Notez que dans notre système local homebrew (pour une cible embarquée) nous gardons le suivi séparé de la plupart des autres choses, parce que l'overhead d'exécution est beaucoup plus élevé.
Si vous êtes intéressé par d'autres raisons de surcharger ces fonctions/opérateurs d'allocation, jetez un coup d'oeil à ma réponse à la question "Y a-t-il une raison de surcharger l'opérateur global new et delete ?" ; l'auto-promotion éhontée mise à part, il énumère d'autres techniques utiles pour repérer les erreurs de corruption de tas, ainsi que d'autres outils applicables.