Sanitizer: Address-, Thread- und UB-Sanitizer
Finden Sie mit der Sanitizer-Familie Fehler in Speicherverwaltung, Threading und undefiniertem Verhalten.
Sanitizer: Address-, Thread- und UB-Sanitizer ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 2 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.
Laufzeitprüfer
Sanitizer sind zur Compile-Zeit instrumentierte Laufzeitprüfer, die in Clang und GCC integriert sind. Sie finden Fehler, die das Typsystem nicht erkennen kann.
AddressSanitizer (ASan)
Erkennt Speicherfehler: Pufferüberläufe, Use-after-free, doppeltes Freigeben und Leaks. Verlangsamt die Ausführung um etwa das Zweifache.
g++ -fsanitize=address -g -O1 main.cpp
./a.outBeispielausgabe von ASan
Wenn ASan einen Fehler erkennt, gibt es einen Stacktrace mit der genauen Zeile und der Art des Fehlers aus.
==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 4 at 0x60200000001c
#0 0x... in main main.cpp:12ThreadSanitizer (TSan)
Erkennt Data Races und andere Nebenläufigkeitsfehler. Verlangsamt die Ausführung um etwa das 5- bis 15-Fache.
g++ -fsanitize=thread -g main.cpp
./a.out
# Reports concurrent unprotected accessesUndefined Behavior Sanitizer (UBSan)
Erkennt Überläufe vorzeichenbehafteter Ganzzahlen, die Dereferenzierung von Nullzeigern, falsch ausgerichtete Zugriffe, Division durch null und weitere Fehler.
g++ -fsanitize=undefined -g main.cppMemorySanitizer (MSan)
Erkennt das Lesen nicht initialisierten Speichers. Nur für Clang verfügbar. Das gesamte Programm einschließlich aller Bibliotheken muss unter MSan erstellt werden.
LeakSanitizer
Unter Linux mit ASan gebündelt. Meldet Speicher, der beim Beenden noch allokiert ist.
ASAN_OPTIONS=detect_leaks=1 ./a.outSanitizer sind NICHT kostenlos
Alle Sanitizer verlangsamen Programme und benötigen mehr Speicher. Verwenden Sie sie in der Entwicklung und CI, nicht in Produktions-Releases.
Nicht alle kombinierbar
ASan, TSan und MSan schließen sich gegenseitig aus, da sie den Speicher unterschiedlich instrumentieren. UBSan kann mit den anderen kombiniert werden.
Compiler-Unterstützung
GCC unterstützt ASan, TSan und UBSan. Clang unterstützt alle genannten Sanitizer sowie MSan. Die Flags sind bei beiden Compilern identisch.
CI-Integration
Führen Sie Ihre Testsuite in der CI unter jedem Sanitizer aus. Erkennen Sie Race Conditions und Speicherfehler, bevor sie ausgeliefert werden. Kombinieren Sie dies für die beste Abdeckung mit Fuzzing.
Tipp: Mit -O1 erstellen
Optimieren Sie beim Erstellen für Sanitizer mindestens mit -O1. -O0 funktioniert ebenfalls, führt aber zu weniger Inlining und dadurch weniger aussagekräftigen Stacktraces.
Unterdrückungsdateien
Schreiben Sie bei bekannten Falschmeldungen oder Problemen in Drittanbieter-Code eine Unterdrückungsdatei und weisen Sie den Sanitizer an, diese zu ignorieren.
ASAN_OPTIONS="suppressions=asan.supp" ./a.outKurzer Check
Welcher Sanitizer erkennt Data Races zwischen Threads?
Zusammenfassung
Sanitizer erkennen echte Laufzeitfehler: AddressSanitizer für Speicherfehler, ThreadSanitizer für Race Conditions, UBSan für undefiniertes Verhalten und MSan für das Lesen nicht initialisierten Speichers. Kombinieren Sie sie in der CI mit Ihrer Testsuite, um die Sicherheit deutlich zu erhöhen.
Lerne C++ mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 51
- Lektionen
- 203
Häufig gestellte Fragen
Ist die Lektion „Sanitizer: Address-, Thread- und UB-Sanitizer“ kostenlos?
Ja — der vollständige Text von „Sanitizer: Address-, Thread- und UB-Sanitizer“ 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 „Sanitizer: Address-, Thread- und UB-Sanitizer“?
Finden Sie mit der Sanitizer-Familie Fehler in Speicherverwaltung, Threading und undefiniertem Verhalten. 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 2 von 4.
Wie lange dauert die Lektion „Sanitizer: Address-, Thread- und UB-Sanitizer“?
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
- Statische Analysetools: clang-tidy, cppcheck
- Sanitizer: Address-, Thread- und UB-Sanitizer
- Fuzzing mit libFuzzer
- Continuous Integration für C++-Projekte