web-dev-qa-db-fra.com

Assainisseur de mémoire / d'adresse vs Valgrind

Je veux un outil pour diagnostiquer les bogues utilisateur après libération et les bogues non initialisés. Je pense à Sanitizer (mémoire et/ou adresse) et Valgrind. Mais j'ai très peu d'idées sur leurs avantages et leurs inconvénients. Quelqu'un peut-il dire les principales caractéristiques, différences et avantages/inconvénients de Sanitizer et Valgrind?

Edit: J'ai trouvé quelques comparaisons comme: Valgrind utilise DBI (instrumentation binaire dynamique) et Sanitizer utilise CTI (instrumentation au moment de la compilation). Valgrind rend le programme beaucoup plus lent (20x), que Sanitizer fonctionne beaucoup plus rapidement que Valgrind (2x). Si quelqu'un peut me donner quelques points plus importants à considérer, ce sera d'une grande aide.

23
kayas

Je pense que vous trouverez cela wiki utile.

Les principaux avantages des assainisseurs TLDR sont

  • les frais généraux du processeur sont beaucoup plus petits (Lsan est pratiquement gratuit, UBsan est 1,25x, Asan et Msan sont 2-4x pour les tâches gourmandes en calcul et 1,05-1,1x pour les interfaces graphiques, Tsan est 5-15x)
  • classe plus large d'erreurs détectées (pile et débordements globaux, utilisation après retour)
  • prise en charge complète des applications multi-thread (la prise en charge de Valgrind pour le multi-thread est une blague)

Les inconvénients sont

  • surcharge de mémoire importante (jusqu'à 2x pour Asan, jusqu'à 3x pour Msan, jusqu'à 10x pour Tsan) qui peut être un facteur limitant pour les environnements à ressources limitées (par exemple les téléphones); c'est toujours mieux que Valgrind
  • intégration plus compliquée (vous devez apprendre à votre système de construction à comprendre Asan et parfois contourner les limitations/bogues dans Asan lui-même, vous devez également utiliser un compilateur relativement récent)
  • MemorySanitizer n'est pas reall ^ W facilement utilisable pour le moment car il en faut un pour reconstruire toutes les dépendances sous Msan (y compris toutes les bibliothèques standard, par exemple libstdc ++); cela signifie que les utilisateurs occasionnels ne peuvent utiliser Valgrind que pour détecter les erreurs non initialisées
  • les désinfectants ne peuvent généralement pas être combinés les uns avec les autres (la seule combinaison prise en charge est Asan + UBsan + Lsan), ce qui signifie que vous devrez effectuer des analyses de qualité distinctes pour détecter tous les types de bogues
28
yugr

Une grande différence est que les désinfectants mémoire et thread inclus dans LLVM mappent implicitement d'énormes étendues d'espace d'adressage (par exemple, en appelant mmap(X, Y, 0, MAP_NORESERVE|MAP_ANONYMOUS|MAP_FIXED|MAP_PRIVATE, -1, 0) sur plusieurs téraoctets d'adresse dans l'environnement x86_64). Même s'ils n'allouent pas nécessairement cette mémoire, le mappage peut faire des ravages avec des environnements restrictifs (par exemple, ceux avec des paramètres raisonnables pour les valeurs ulimit).

0
jhfrontz