Sanitizers : Address, Thread et UB Sanitizer
Détecter les bogues de mémoire, de concurrence et de comportement indéfini avec la famille des sanitizers
Sanitizers : Address, Thread et UB Sanitizer est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.
Vérificateurs à l’exécution
Les outils d’assainissement sont des vérificateurs à l’exécution instrumentés lors de la compilation et intégrés à Clang et GCC. Ils détectent les bogues que le système de types ne peut pas détecter.
AddressSanitizer (ASan)
Détecte les erreurs de mémoire : dépassements de tampon, utilisation après libération, double libération et fuites. Ralentissement d’environ 2 fois.
g++ -fsanitize=address -g -O1 main.cpp
./a.outExemple de sortie d’ASan
Lorsqu’ASan détecte un bogue, il affiche une trace de pile avec la ligne exacte et le type d’erreur.
==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 4 at 0x60200000001c
#0 0x... in main main.cpp:12ThreadSanitizer (TSan)
Détecte les courses aux données et les autres bogues de concurrence. Ralentissement d’environ 5 à 15 fois.
g++ -fsanitize=thread -g main.cpp
./a.out
# Reports concurrent unprotected accessesVérificateur des comportements indéfinis (UBSan)
Détecte les dépassements d’entiers signés, les déréférencements de pointeurs nuls, les accès non alignés, les divisions par zéro et bien d’autres problèmes.
g++ -fsanitize=undefined -g main.cppMemorySanitizer (MSan)
Détecte les lectures de mémoire non initialisée. Fonctionne uniquement avec Clang. Nécessite de compiler tout le programme, bibliothèques comprises, sous MSan.
LeakSanitizer
Fourni avec ASan sous Linux, il signale la mémoire encore allouée à la fin du programme.
ASAN_OPTIONS=detect_leaks=1 ./a.outLes outils d’assainissement ne sont pas gratuits
Tous les outils d’assainissement ralentissent les programmes et utilisent davantage de mémoire. Utilisez-les pendant le développement et dans l’intégration continue, mais pas dans les versions de production.
Impossible de tout combiner
ASan, TSan et MSan s’excluent mutuellement : ils instrumentent la mémoire de manière différente. UBSan peut être combiné avec les autres.
Prise en charge par les compilateurs
GCC prend en charge ASan, TSan et UBSan. Clang prend en charge tous les outils précédents ainsi que MSan. Les options sont identiques avec les différents compilateurs.
Intégration à l’intégration continue
Exécutez votre suite de tests avec chaque outil d’assainissement dans l’intégration continue. Détectez les conditions de concurrence et les bogues mémoire avant leur publication. Combinez ces outils avec le fuzzage pour obtenir la meilleure couverture.
Conseil : compiler avec -O1
Optimisez au moins avec -O1 lors de la compilation pour les outils d’assainissement. -O0 fonctionne, mais effectue moins d’insertions, ce qui rend les traces de pile moins informatives.
Fichiers de suppression
Pour les faux positifs connus ou les problèmes causés par des bibliothèques tierces, écrivez un fichier de suppression et demandez à l’outil d’assainissement de les ignorer.
ASAN_OPTIONS="suppressions=asan.supp" ./a.outVérification rapide
Quel outil d’assainissement détecte les courses aux données entre les threads ?
Récapitulatif
Les outils d’assainissement détectent de vrais bogues à l’exécution : AddressSanitizer pour les erreurs de mémoire, ThreadSanitizer pour les courses aux données, UBSan pour les comportements indéfinis et MSan pour les lectures non initialisées. Combinez-les avec votre suite de tests dans l’intégration continue pour améliorer considérablement la sécurité.
Questions Fréquemment Posées
La leçon « Sanitizers : Address, Thread et UB Sanitizer » est-elle gratuite ?
Oui — le texte complet de « Sanitizers : Address, Thread et UB Sanitizer » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Sanitizers : Address, Thread et UB Sanitizer » ?
Détecter les bogues de mémoire, de concurrence et de comportement indéfini avec la famille des sanitizers Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C++ Academy ?
Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Sanitizers : Address, Thread et UB Sanitizer » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?
Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Outils d’analyse statique : clang-tidy et cppcheck
- Sanitizers : Address, Thread et UB Sanitizer
- Fuzzing avec libFuzzer
- Intégration continue pour les projets C++