Sanitizer: Address, Thread e UB Sanitizer
Individui bug di memoria, threading e comportamento indefinito con la famiglia dei sanitizer
Sanitizer: Address, Thread e UB Sanitizer è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
Controlli a runtime
I sanitizer sono controlli a runtime strumentati in fase di compilazione, integrati in Clang e GCC. Rilevano bug che il sistema dei tipi non è in grado di individuare.
AddressSanitizer (ASan)
Rileva errori di memoria: buffer overflow, uso dopo la liberazione, doppia liberazione e perdite di memoria. Rallentamento di circa 2 volte.
g++ -fsanitize=address -g -O1 main.cpp
./a.outEsempio di output di ASan
Quando ASan rileva un bug, stampa uno stack trace con la riga esatta e il tipo di errore.
==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 4 at 0x60200000001c
#0 0x... in main main.cpp:12ThreadSanitizer (TSan)
Rileva race condition e altri bug di concorrenza. Rallentamento di circa 5-15 volte.
g++ -fsanitize=thread -g main.cpp
./a.out
# Reports concurrent unprotected accessesUndefined Behavior Sanitizer (UBSan)
Rileva overflow di interi con segno, dereferenziazioni di puntatori nulli, accessi non allineati, divisioni per zero e molto altro.
g++ -fsanitize=undefined -g main.cppMemorySanitizer (MSan)
Rileva le letture di memoria non inizializzata. È disponibile solo con Clang. Richiede la compilazione dell'intero programma, incluse le librerie, sotto MSan.
LeakSanitizer
È incluso con ASan su Linux. Segnala la memoria ancora allocata al termine del programma.
ASAN_OPTIONS=detect_leaks=1 ./a.outI sanitizer NON sono gratuiti
Tutti i sanitizer rallentano i programmi e utilizzano più memoria. Li utilizzi nello sviluppo e nella CI, non nelle release di produzione.
Non è possibile combinarli tutti
ASan, TSan e MSan si escludono a vicenda: strumentano la memoria in modi diversi. UBSan può essere combinato con gli altri.
Supporto dei compilatori
GCC supporta ASan, TSan e UBSan. Clang supporta tutti i precedenti e anche MSan. I flag sono identici tra i compilatori.
Integrazione nella CI
Esegua la suite di test sotto ciascun sanitizer nella CI. Rilevi race condition e bug di memoria prima che arrivino agli utenti. Lo combini con il fuzzing per ottenere la migliore copertura.
Suggerimento: compili con -O1
Quando compila per i sanitizer, ottimizzi almeno con -O1. -O0 funziona, ma effettua meno inline e rende gli stack trace meno informativi.
File di soppressione
Per falsi positivi noti o problemi di terze parti, scriva un file di soppressione e indichi al sanitizer di ignorarli.
ASAN_OPTIONS="suppressions=asan.supp" ./a.outVerifica rapida
Quale sanitizer rileva le race condition tra thread?
Riepilogo
I sanitizer rilevano bug reali durante l'esecuzione: AddressSanitizer per gli errori di memoria, ThreadSanitizer per le race condition, UBSan per il comportamento indefinito e MSan per le letture non inizializzate. Li combini con la suite di test nella CI per ottenere un notevole miglioramento della sicurezza.
Impara C++ con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 51
- Lezioni
- 203
Domande Frequenti
La lezione «Sanitizer: Address, Thread e UB Sanitizer» è gratuita?
Sì — il testo completo di «Sanitizer: Address, Thread e UB Sanitizer» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «Sanitizer: Address, Thread e UB Sanitizer»?
Individui bug di memoria, threading e comportamento indefinito con la famiglia dei sanitizer Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Sanitizer: Address, Thread e UB Sanitizer»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C++ Academy?
Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Strumenti di analisi statica: clang-tidy, cppcheck
- Sanitizer: Address, Thread e UB Sanitizer
- Fuzzing con libFuzzer
- Integrazione continua per progetti C++