0Pricing
C++ Academy · Lezione

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
./app

Buffer 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

  1. Usare gdb e lldb
  2. AddressSanitizer
  3. UBSan e TSan
  4. Nozioni di base su Valgrind
← Torna a C++ Academy