AddressSanitizer
Wykrywaj błędy pamięci
AddressSanitizer to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Czym jest AddressSanitizer?
AddressSanitizer (ASan) to oparte na kompilatorze narzędzie, które wykrywa błędy pamięci w czasie działania programu: dostęp poza zakresem, użycie po zwolnieniu pamięci, podwójne zwolnienie i wycieki. Jest wystarczająco szybkie do codziennych testów.
Włączanie ASan
Dodaj -fsanitize=address zarówno podczas kompilowania, jak i konsolidowania, a także -g, aby raporty były czytelne.
g++ -fsanitize=address -g -O1 main.cpp -o app
./appPrzepełnienie bufora sterty
ASan wykrywa odczyty i zapisy poza przydzielonym buforem. Ten program zapisuje o jeden element za daleko.
#include <cstdlib>
int main() {
int* a = (int*)malloc(3 * sizeof(int));
a[3] = 7; // out of bounds
free(a);
return 0;
}Użycie po zwolnieniu pamięci
Dostęp do pamięci po jej zwolnieniu jest niezdefiniowanym zachowaniem; ASan zgłasza błąd heap-use-after-free wraz ze stosami wywołań zwolnienia i przydzielenia pamięci.
#include <cstdlib>
int main() {
int* p = (int*)malloc(sizeof(int));
free(p);
*p = 5; // use after free
return 0;
}Przepełnienie bufora stosu
ASan instrumentuje także tablice na stosie, wykrywając przekroczenia zakresu lokalnych buforów.
#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;
}Odczytywanie raportu
Raport ASan podaje typ błędu, adres powodujący błąd oraz ślady stosu dla nieprawidłowego dostępu, a także odpowiedniego przydzielenia i zwolnienia pamięci. Pierwsza klatka stosu zwykle wskazuje dokładne miejsce błędu.
Wykrywanie wycieków
Na wielu platformach ASan zawiera LeakSanitizer, który przy zakończeniu programu zgłasza pamięć, która nigdy nie została zwolniona, wraz ze stosem wywołań przydzielenia.
#include <cstdlib>
int main() {
int* leaked = (int*)malloc(100); // never freed
return 0;
}Opcje czasu działania
Zachowanie można dostosować za pomocą zmiennej środowiskowej ASAN_OPTIONS, np. ASAN_OPTIONS=detect_leaks=1:halt_on_error=0.
Koszt wydajnościowy
ASan zazwyczaj spowalnia programy około dwukrotnie i zwiększa zużycie pamięci. Jest to akceptowalne w testach i CI, ale nie należy dostarczać kompilacji produkcyjnej z włączonym ASan.
Łączenie z testami
Uruchamiaj testy jednostkowe pod kontrolą ASan w CI. Wiele rzeczywistych błędów ujawnia się dopiero podczas wykonywania testów z włączonymi sanitizerami. Należy utrzymywać osobną konfigurację kompilacji dla sanitizerów.
To nie zastępuje dbałości
ASan znajduje błędy tylko na ścieżkach kodu, które rzeczywiście zostaną wykonane. Należy łączyć go z dobrym pokryciem testami — nieprzetestowana wadliwa gałąź pozostanie ukryta.
Szybkie sprawdzenie
Przypomnij sobie, jak włączyć ASan.
Podsumowanie
Poznali Państwo AddressSanitizer.
- Wykrywa dostęp poza zakresem, użycie po zwolnieniu pamięci, podwójne zwolnienie i wycieki
- Włączaj go za pomocą
-fsanitize=address -g - Raporty podają błąd i pokazują stosy wywołań przydzielenia oraz zwolnienia pamięci
- Około dwukrotnie wolniejszy; idealny do testów i CI, ale nie do kompilacji produkcyjnych
Często zadawane pytania
Czy lekcja „AddressSanitizer” jest bezpłatna?
Tak — pełny tekst „AddressSanitizer” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „AddressSanitizer”?
Wykrywaj błędy pamięci Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „AddressSanitizer”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Używanie gdb i lldb
- AddressSanitizer
- UBSan i TSan
- Podstawy Valgrind