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 << 40bei 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 appTSan 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
./appBeispiel 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.