AddressSanitizer
Fånga minnesfel
AddressSanitizer är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.
Vad är AddressSanitizer?
AddressSanitizer (ASan) är ett kompilatorbaserat verktyg som upptäcker minnesfel under körning: åtkomst utanför gränserna, användning efter frigöring, dubbel frigöring och läckor. Det är tillräckligt snabbt för vardaglig testning.
Aktivera ASan
Lägg till -fsanitize=address både vid kompilering och länkning, samt -g för läsbara rapporter.
g++ -fsanitize=address -g -O1 main.cpp -o app
./appBuffertöverskridning på heapen
ASan markerar läsningar och skrivningar efter slutet på en allokerad buffert. Det här programmet skriver ett element för långt.
#include <cstdlib>
int main() {
int* a = (int*)malloc(3 * sizeof(int));
a[3] = 7; // out of bounds
free(a);
return 0;
}Användning efter frigöring
Åtkomst till minne efter att det har frigjorts är odefinierat beteende; ASan rapporterar en heap-use-after-free med stackspåren för frigöringen och allokeringen.
#include <cstdlib>
int main() {
int* p = (int*)malloc(sizeof(int));
free(p);
*p = 5; // use after free
return 0;
}Buffertöverskridning på stacken
ASan instrumenterar även stackarrayer och upptäcker överskrivningar av lokala buffertar.
#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;
}Läsa rapporten
En ASan-rapport anger feltypen, den felande adressen och stackspår för den felaktiga åtkomsten samt den relevanta allokeringen eller frigöringen. Den första stackraden pekar vanligtvis direkt på felet.
Läckdetektering
ASan innehåller LeakSanitizer på många plattformar och rapporterar minne som aldrig frigjordes när programmet avslutades, tillsammans med stackspåret för allokeringen.
#include <cstdlib>
int main() {
int* leaked = (int*)malloc(100); // never freed
return 0;
}Körningsalternativ
Finjustera beteendet med miljövariabeln ASAN_OPTIONS, till exempel ASAN_OPTIONS=detect_leaks=1:halt_on_error=0.
Prestandakostnad
ASan gör vanligtvis program ungefär två gånger långsammare och ökar minnesanvändningen. Det är acceptabelt för tester och CI, men ni bör inte leverera en releaseversion med ASan aktiverat.
Kombinera med tester
Kör era enhetstester under ASan i CI. Många verkliga fel visar sig först när tester körs med sanitizer-verktyg aktiverade. Behåll en separat konfiguration för sanitizer-byggen.
Ingen ersättning för noggrannhet
ASan hittar bara fel på kodvägar som ni faktiskt kör. Kombinera det med god testtäckning; en felaktig gren som inte körs förblir dold.
Snabb kontroll
Kom ihåg hur ASan aktiveras.
Sammanfattning
Ni har lärt er AddressSanitizer.
- Upptäcker åtkomst utanför gränserna, användning efter frigöring, dubbel frigöring och läckor
- Aktiveras med
-fsanitize=address -g - Rapporter anger felet och visar stackspår för allokering och frigöring
- Cirka två gånger långsammare; idealiskt för tester och CI, inte för releaseversioner
Lär dig C++ med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 51
- Lektioner
- 203
Vanliga frågor
Är lektionen ”AddressSanitizer” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”AddressSanitizer”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”AddressSanitizer”?
Fånga minnesfel Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C++ Academy?
Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”AddressSanitizer”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C++ Academy-lektionen?
Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Använda gdb och lldb
- AddressSanitizer
- UBSan och TSan
- Grunderna i Valgrind