C++ Academy · Lektion

Sanitizer: Address-, Thread- und UB-Sanitizer

Finden Sie mit der Sanitizer-Familie Fehler in Speicherverwaltung, Threading und undefiniertem Verhalten.

Lektion 2 von 415 Schritte

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.out

Beispielausgabe 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:12

ThreadSanitizer (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 accesses

Undefined 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.cpp

MemorySanitizer (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.out

Sanitizer 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.out

Kurzer 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.

Kostenlos starten

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

  1. Statische Analysetools: clang-tidy, cppcheck
  2. Sanitizer: Address-, Thread- und UB-Sanitizer
  3. Fuzzing mit libFuzzer
  4. Continuous Integration für C++-Projekte
← Zurück zu C++ Academy