C++ Academy · Lezione

Sanitizer: Address, Thread e UB Sanitizer

Individui bug di memoria, threading e comportamento indefinito con la famiglia dei sanitizer

Lezione 2 di 415 passaggi

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

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

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

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

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

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

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

Gratis per iniziare

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

  1. Strumenti di analisi statica: clang-tidy, cppcheck
  2. Sanitizer: Address, Thread e UB Sanitizer
  3. Fuzzing con libFuzzer
  4. Integrazione continua per progetti C++
← Torna a C++ Academy