0Pricing
C++ Academy · Lektion

UBSan und TSan

Undefiniertes Verhalten und Race Conditions finden

UBSan und TSan ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Zwei weitere Sanitizer

Neben ASan zielen zwei weitere Sanitizer auf andere Fehlerklassen ab.

  • UBSan: undefiniertes Verhalten (Überläufe, fehlerhafte Verschiebungen, Nullzeiger-Dereferenzierung)
  • TSan: Datenrennen in nebenläufigem Code

UBSan aktivieren

UndefinedBehaviorSanitizer wird mit -fsanitize=undefined aktiviert. Es kann mit ASan kombiniert werden.

g++ -fsanitize=undefined -g main.cpp -o app
./app

Überlauf vorzeichenbehafteter Ganzzahlen

Ein Überlauf einer vorzeichenbehafteten Ganzzahl ist in C++ undefiniertes Verhalten. UBSan meldet ihn genau in der betreffenden Zeile.

#include <climits>
#include <iostream>

int main() {
    int x = INT_MAX;
    int y = x + 1; // signed overflow: UB
    std::cout << y << "\n";
    return 0;
}

Weitere von UBSan erkannte UB-Fehler

UBSan erkennt viele schwer aufzuspürende Fehler.

  • Verschiebungen außerhalb des gültigen Bereichs (x << 40 bei einem 32-Bit-int)
  • Nullzeiger-Dereferenzierung
  • Fehlausgerichteter Zugriff
  • Ungültige Enum- oder Bool-Werte

UBSan beim ersten Fehler anhalten

Standardmäßig gibt UBSan eine Meldung aus und läuft weiter. Fügen Sie -fno-sanitize-recover=undefined hinzu, um beim ersten Fehler abzubrechen, was für CI besser geeignet ist.

g++ -fsanitize=undefined -fno-sanitize-recover=undefined -g main.cpp -o app

TSan aktivieren

ThreadSanitizer wird mit -fsanitize=thread aktiviert. Es erkennt Datenrennen: Zwei Threads greifen ohne Synchronisierung auf denselben Speicher zu, wobei mindestens einer schreibt.

g++ -fsanitize=thread -g main.cpp -o app -pthread
./app

Beispiel für ein Datenrennen

Zwei Threads erhöhen einen gemeinsamen Zähler ohne Sperre. TSan meldet die konkurrierenden Zugriffe und deren Stacktraces.

#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;
}

Das Datenrennen beheben

Schützen Sie gemeinsame Daten mit einem Mutex oder verwenden Sie std::atomic. Nach der Behebung meldet TSan keine Datenrennen mehr.

#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;
}

Kompatibilität von TSan und ASan

TSan kann nicht im selben Build mit ASan kombiniert werden, da sie sich gegenseitig stören. Verwenden Sie separate Build-Konfigurationen: eine für ASan+UBSan und eine weitere für TSan.

Sanitizer-Build-Matrix

Eine praktische CI-Konfiguration führt die Testsuite in zwei Sanitizer-Builds aus.

  • Build A: -fsanitize=address,undefined
  • Build B: -fsanitize=thread

Damit werden Speicher-, UB- und Nebenläufigkeitsfehler abgedeckt.

Kosten und Grenzen

TSan kann Programme um das Fünf- bis Fünfzehnfache verlangsamen und deutlich mehr Speicher verwenden. Wie alle Sanitizer erkennt es nur Fehler auf ausgeführten Codepfaden. Daher sind gute Tests für nebenläufigen Code besonders wichtig.

Schnelltest

Rufen Sie sich in Erinnerung, was TSan erkennt.

Zusammenfassung

Sie haben UBSan und TSan kennengelernt.

  • UBSan (-fsanitize=undefined) findet Überläufe, fehlerhafte Verschiebungen und Nullzeiger-Dereferenzierungen
  • Verwenden Sie -fno-sanitize-recover, um beim ersten UB-Fehler abzubrechen
  • TSan (-fsanitize=thread) findet Datenrennen; beheben Sie sie mit Mutex oder Atomics
  • TSan und ASan benötigen separate Builds

Häufig gestellte Fragen

Ist die Lektion „UBSan und TSan“ kostenlos?

Ja — der vollständige Text von „UBSan und TSan“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „UBSan und TSan“?

Undefiniertes Verhalten und Race Conditions finden Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C++ Academy zu starten?

Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „UBSan und TSan“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?

Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. gdb und lldb verwenden
  2. AddressSanitizer
  3. UBSan und TSan
  4. Valgrind-Grundlagen
← Zurück zu C++ Academy