0Pricing
C++ Academy · Lekcja

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

Przepeł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

  1. Używanie gdb i lldb
  2. AddressSanitizer
  3. UBSan i TSan
  4. Podstawy Valgrind
← Powrót do C++ Academy