C++ Academy · Leçon

UBSan et TSan

Détecter les comportements indéfinis et les courses critiques

Leçon 3 sur 413 étapes

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
./app

Dé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 << 40 pour 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 app

Activer 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
./app

Exemple 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-recover pour 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
Gratuit pour commencer

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.

Toutes les leçons de ce cours

  1. Utiliser gdb et lldb
  2. AddressSanitizer
  3. UBSan et TSan
  4. Les bases de Valgrind
← Retour à C++ Academy