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.
Je pense que vous trouverez cela wiki utile.
Les principaux avantages des assainisseurs TLDR sont
Les inconvénients sont
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
).