AddressSanitizer
Rilevare gli errori di memoria
AddressSanitizer è 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.
Che cos'è AddressSanitizer?
AddressSanitizer (ASan) è uno strumento basato sul compilatore che rileva gli errori di memoria durante l'esecuzione: accessi oltre i limiti, use-after-free, double-free e perdite di memoria. È abbastanza veloce per i test quotidiani.
Abilitare ASan
Aggiunga -fsanitize=address sia durante la compilazione sia durante il linking, oltre a -g per ottenere report leggibili.
g++ -fsanitize=address -g -O1 main.cpp -o app
./appBuffer overflow nell'heap
ASan segnala le letture e le scritture oltre la fine di un buffer allocato. Questo programma scrive un elemento di troppo.
#include <cstdlib>
int main() {
int* a = (int*)malloc(3 * sizeof(int));
a[3] = 7; // out of bounds
free(a);
return 0;
}Use-after-free
L'accesso alla memoria dopo la sua deallocazione ha un comportamento indefinito; ASan segnala un heap-use-after-free mostrando gli stack delle chiamate di deallocazione e allocazione.
#include <cstdlib>
int main() {
int* p = (int*)malloc(sizeof(int));
free(p);
*p = 5; // use after free
return 0;
}Buffer overflow nello stack
ASan strumenta anche gli array nello stack, rilevando gli sconfinamenti dei buffer locali.
#include <iostream>
int main() {
int buf[3] = {0, 0, 0};
for (int i = 0; i <= 3; ++i) buf[i] = i; // i==3 overflows
std::cout << buf[0] << "\n";
return 0;
}Leggere il report
Un report di ASan indica il tipo di errore, l'indirizzo che ha causato l'errore e gli stack delle chiamate per l'accesso errato e per l'allocazione o la deallocazione pertinente. Il primo frame dello stack di solito indica direttamente il bug.
Rilevamento delle perdite di memoria
Su molte piattaforme ASan include LeakSanitizer, che segnala la memoria mai deallocata all'uscita del programma, mostrando lo stack delle chiamate di allocazione.
#include <cstdlib>
int main() {
int* leaked = (int*)malloc(100); // never freed
return 0;
}Opzioni di runtime
Modifichi il comportamento con la variabile d'ambiente ASAN_OPTIONS, ad esempio ASAN_OPTIONS=detect_leaks=1:halt_on_error=0.
Costo in termini di prestazioni
In genere ASan rallenta i programmi di circa 2 volte e aumenta l'uso della memoria. È accettabile per i test e la CI, ma non dovrebbe distribuire una build di rilascio con ASan abilitato.
Usarlo insieme ai test
Esegua i test unitari sotto ASan nella CI. Molti bug reali emergono solo quando vengono esercitati da test eseguiti con i sanitizer attivi. Mantenga una configurazione di build dedicata ai sanitizer.
Non sostituisce l'attenzione
ASan trova i bug solo nei percorsi del codice effettivamente eseguiti. Lo abbini a una buona copertura dei test: un ramo difettoso che non viene eseguito rimane nascosto.
Verifica rapida
Ricordi come abilitare ASan.
Riepilogo
Ha imparato a usare AddressSanitizer.
- Rileva accessi oltre i limiti, use-after-free, double-free e perdite di memoria
- Si abilita con
-fsanitize=address -g - I report indicano l'errore e mostrano gli stack delle chiamate di allocazione e deallocazione
- È circa 2 volte più lento: ideale per i test e la CI, non per le build di rilascio
Domande Frequenti
La lezione «AddressSanitizer» è gratuita?
Sì — il testo completo di «AddressSanitizer» è 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 «AddressSanitizer»?
Rilevare gli errori di memoria 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 «AddressSanitizer»?
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
- Usare gdb e lldb
- AddressSanitizer
- UBSan e TSan
- Nozioni di base su Valgrind