UBSan et TSan
Détecter les comportements indéfinis et les courses critiques
UBSan et TSan est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 3 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.
Deux autres désinfecteurs
Au-delà d'ASan, deux désinfecteurs ciblent différentes catégories de bogues.
- UBSan : comportement indéfini (dépassement, décalages incorrects, déréférencement nul)
- TSan : courses de données dans le code multithread
Activer UBSan
UndefinedBehaviorSanitizer s'active avec -fsanitize=undefined. Il peut être combiné avec ASan.
g++ -fsanitize=undefined -g main.cpp -o app
./appDépassement d'entier signé
Le dépassement d'un entier signé constitue un comportement indéfini en C++. UBSan le signale à la ligne exacte.
#include <climits>
#include <iostream>
int main() {
int x = INT_MAX;
int y = x + 1; // signed overflow: UB
std::cout << y << "\n";
return 0;
}Autres comportements indéfinis détectés par UBSan
UBSan signale de nombreuses erreurs subtiles.
- Décalages hors limites (
x << 40pour un entier sur 32 bits) - Déréférencement d'un pointeur nul
- Accès mal aligné
- Valeurs d'énumération ou booléennes invalides
Faire s'arrêter UBSan
Par défaut, UBSan affiche un message et poursuit l'exécution. Ajoutez -fno-sanitize-recover=undefined pour abandonner dès la première erreur, ce qui est préférable pour l'intégration continue.
g++ -fsanitize=undefined -fno-sanitize-recover=undefined -g main.cpp -o appActiver TSan
ThreadSanitizer s'active avec -fsanitize=thread. Il détecte les courses de données : deux threads accèdent à la même mémoire sans synchronisation, dont au moins un effectue une écriture.
g++ -fsanitize=thread -g main.cpp -o app -pthread
./appExemple de course de données
Deux threads incrémentent un compteur partagé sans verrou. TSan signale les accès concurrents ainsi que leurs piles d'appels.
#include <thread>
#include <iostream>
int counter = 0;
void work() { for (int i = 0; i < 1000; ++i) ++counter; }
int main() {
std::thread t1(work), t2(work);
t1.join();
t2.join();
std::cout << counter << "\n";
return 0;
}Corriger la course
Protégez les données partagées avec un mutex ou utilisez std::atomic. Après la correction, TSan ne signale aucune course.
#include <thread>
#include <atomic>
#include <iostream>
std::atomic<int> counter{0};
void work() { for (int i = 0; i < 1000; ++i) ++counter; }
int main() {
std::thread t1(work), t2(work);
t1.join();
t2.join();
std::cout << counter << "\n";
return 0;
}Compatibilité entre TSan et ASan
TSan ne peut pas être combiné avec ASan dans la même compilation (ils sont incompatibles). Utilisez des configurations de compilation distinctes : l'une pour ASan+UBSan, l'autre pour TSan.
Matrice de compilation des désinfecteurs
Une configuration pratique d'intégration continue exécute la suite de tests avec deux compilations utilisant des désinfecteurs.
- Compilation A :
-fsanitize=address,undefined - Compilation B :
-fsanitize=thread
Cela couvre les bogues de mémoire, de comportement indéfini et de concurrence.
Coût et limites
TSan peut ralentir les programmes d'un facteur 5 à 15 et utiliser beaucoup plus de mémoire. Comme tous les désinfecteurs, il ne détecte les bogues que sur les chemins de code exécutés ; de bons tests multithreads sont donc importants.
Vérification rapide
Rappelez-vous ce que TSan détecte.
Récapitulatif
Vous avez découvert UBSan et TSan.
- UBSan (
-fsanitize=undefined) détecte les dépassements, les décalages incorrects et les déréférencements nuls - Utilisez
-fno-sanitize-recoverpour abandonner au premier comportement indéfini - TSan (
-fsanitize=thread) détecte les courses de données ; corrigez-les avec un mutex ou un type atomique - TSan et ASan nécessitent des compilations distinctes
Apprends C++ avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 51
- Leçons
- 203
Questions Fréquemment Posées
La leçon « UBSan et TSan » est-elle gratuite ?
Oui — le texte complet de « UBSan et TSan » 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 « UBSan et TSan » ?
Détecter les comportements indéfinis et les courses critiques 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 3 sur 4.
Combien de temps prend la leçon « UBSan et TSan » ?
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.