2010-06-11 5 views
1

En traitant des écrasements de mémoire aléatoires, dans MSVC il est possible de valider l'état du tas en divers points avec un appel à _CrtCheckMemory, et de savoir avec au moins un petit niveau de confiance que le code jusqu'à la vérification n'était pas responsable pour toute erreur qui pourrait causer l'échec de new ou de malloc plus tard.GCC/XCode équivalent de _CrtCheckMemory?

En XCode, quelle est la manière équivalente d'essayer et de mettre en boîte dans un écrasement de mémoire? Tout ce que j'ai en ce moment est un échec aléatoire d'un appel à nouveau, quelque part dans les entrailles d'un code avec aucune idée réelle de combien de temps le code a fonctionné avec un tas corrompu jusqu'à ce point.

Répondre

0

Cette fonctionnalité est réellement intégrée dans le tas dans GCC. Comme décrit here La meilleure façon de l'activer est sur le XCode :: Exécuter du menu: Enable Guard Malloc

-1

Cela ne répond pas directement à votre question, mais je me suis senti obligé de répondre. Comme vous le dites, les outils tels que les fonctions de vérification du CRT ne vous donnent qu'un faible niveau de confiance et ne traitent pas les fuites de ressources autres que la mémoire. Si vous vous trouvez en fonction de ces outils, je dirais qu'il y a quelque chose de très, très mauvais dans votre approche du développement C++. Au cours des 10 dernières années, je n'ai pas eu un seul problème dans mon code associé à une fuite de mémoire. Ce n'est pas parce que je suis un dieu de codage C++, mais parce que j'utilise les outils de base de RAII, des pointeurs intelligents et des collections de bibliothèques standard dans mon code, et évitez autant que possible l'allocation de mémoire dynamique explicite en utilisant new. Chaque fois que vous vous retrouvez à écrire une ligne de code comme:

Something * p = new Something; 

stop, et vous vous demandez « Est-il possible que je pourrais éviter de le faire? » et si la réponse est "non", alors demandez-vous pourquoi vous allouez de la mémoire à un pointeur brut, et si vous ne trouvez pas de solution (ce qui devrait être rarement le cas), écrivez immédiatement le code pour gérer les pointeurs. Si vous adoptez cette approche, vous n'aurez pas besoin d'outils tels que des fonctions CRT spéciales ou de Valgrind, et vous économiserez des océans de temps lors du débogage

+0

Dans un monde idéal, il serait possible d'être un pur C++ programmeur où toutes les structures du programme ont été implémentable avec C++ idiomes . Dans mon monde, je porte un code Windows de 10 ans sur le Mac, c'est écrit dans ... bien. un mélange de C, C + (un sous-ensemble bizarre de C++ produit par des gens qui ont appris C++ après C et écrit ce qui est essentiellement du code C, mais avec quelques classes), C++ qui doit interagir avec les bibliothèques dynamiques lls qui exportent fonctions, C fonctions de création d'interfaces, ou simplement en exportant des classes C++. amusement. –

+0

Ceci est une déclaration ridicule. J'étais développeur chez Microsoft et _CrtCheckMemory() est très utilisé. Sur la base de cette déclaration de personnes, je suppose que nous avons tout fait mal chez Microsoft. La vérification de l'intégrité du tas et de la pile est utile pour trouver des dépassements de tampon, des problèmes d'assignation de pointeurs, des bugs que le compilateur génère ... Utilisez Valgrind sur Linux ou lancez votre propre outil qui accroche les allocations et effectue votre propre vérification avec certains sorte de nombre magique du début et de la fin de l'allocation. – Byron

0

comme il est implicite que dans la réponse de Neil, permet de faire ce explicite.

pour autant que je sais qu'il n'y a pas un outil qui est aussi facilement disponible _CrtCheckMemory pour gcc IIRC il y a des s J'ai vérifié les bibliothèques malloc, mais je ne les ai pas trouvées utilisables comme _CrtCheckMemory. Il y a cependant Valgrind qui est déployé de manière non intrusive, et donne un résultat beaucoup plus long.