Błąd: heap-use-after-free
Błąd narzędzia do oczyszczania adresu: użycie cofniętych przydziałów pamięci
Przedstawiamy trzy przykłady, w których magazyn w stercie można przydzielić za pośrednictwem metody malloc
, realloc
(C) i new
(C++) wraz z błędnym użyciem volatile
elementu .
Przykład- malloc
// example1.cpp
// heap-use-after-free error
#include <stdlib.h>
int main() {
char *x = (char*)malloc(10 * sizeof(char));
free(x);
// ...
return x[5]; // Boom!
}
Aby skompilować i przetestować ten przykład, uruchom następujące polecenia w wierszu polecenia programu Visual Studio 2019 w wersji 16.9 lub nowszej:
cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe
Gdy pojawi się program Visual Studio, naciśnij klawisz F5
, aby uruchomić przykład 1.
Wynikowy błąd
Wyjątek zgłaszany wskazuje wiersz 11, zwraca wartość x [ 5 ] i mówi: Address Sanitizer Error Use of deallocated memory (Użycie cofniętych przydziałów pamięci). Na zrzucie ekranu nie pokazano danych wyjściowych w oknie konsoli, w których są wyświetlane adresy pamięci, oraz klucz do identyfikowania adresowanych bajtów, częściowo adresowanych bajtów, zwolnionych regionów sterty i sterty pozostawionej czerwonej strefy w obszarze błędu.
Przykład- operator new
// example2.cpp
// heap-use-after-free error
#include <windows.h>
int main() {
char *buffer = new char[42];
delete [] buffer;
// ...
buffer[0] = 42; // Boom!
return 0;
}
Aby skompilować i przetestować ten przykład, uruchom następujące polecenia w wierszu polecenia programu Visual Studio 2019 w wersji 16.9 lub nowszej:
cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe
Gdy pojawi się program Visual Studio, naciśnij klawisz F5
, aby uruchomić przykład 2.
Wynikowy błąd — nowy operator
Zgłoszony wyjątek wskazuje wiersz 11, bufor[0] = 42 i mówi: Błąd sanitizera adresu: Użycie cofniętych przydziałów pamięci. Na zrzucie ekranu nie pokazano danych wyjściowych w oknie konsoli, w których są wyświetlane adresy pamięci, oraz klucz do identyfikowania adresowanych bajtów, częściowo adresowanych bajtów, zwolnionych regionów sterty i sterty pozostawiono bajty strefy czerwonej alloca w obszarze błędu.
Przykład- realloc
// example3.cpp
// heap-use-after-free error
#include <malloc.h>
int main() {
char *buffer = (char*)realloc(0, 42);
free(buffer);
// ...
buffer[0] = 42; // Boom!
return 0;
}
Aby skompilować i przetestować ten przykład, uruchom następujące polecenia w wierszu polecenia programu Visual Studio 2019 w wersji 16.9 lub nowszej:
cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe
Gdy pojawi się program Visual Studio, naciśnij klawisz F5
, aby uruchomić przykład 3.
Błąd wynikowy — przydział rzeczywisty
Zgłoszony wyjątek wskazuje wiersz 11, bufor[0] = 42 i mówi: Błąd sanitizera adresu: Użycie cofniętych przydziałów pamięci. Na zrzucie ekranu nie pokazano danych wyjściowych w oknie konsoli, w których są wyświetlane adresy pamięci, oraz klucz do identyfikowania adresowanych bajtów, częściowo adresowanych bajtów, zwolnionych regionów sterty i sterty pozostawionej czerwonej strefy w obszarze błędu.
Przykład — volatile
// example4.cpp
// heap-use-after-free error
#include <stdlib.h>
int main() {
volatile char *x = (char*)malloc(sizeof(char));
free((void*)x);
//...
*x = 42; // Boom!
}
Aby skompilować i przetestować ten przykład, uruchom następujące polecenia w wierszu polecenia programu Visual Studio 2019 w wersji 16.9 lub nowszej:
cl example4.cpp /fsanitize=address /Zi
devenv /debugexe example4.exe
Gdy pojawi się program Visual Studio, naciśnij klawisz F5
, aby uruchomić przykład 4.
Wynikowy błąd — volatile
Wyjątek zgłaszany wskazuje wiersz 12, *x = 42 i mówi: Address Sanitizer Error: Use of deallocated memory (Błąd: użycie cofniętych przydziałów pamięci). Na zrzucie ekranu nie pokazano danych wyjściowych w oknie konsoli, w których są wyświetlane adresy pamięci, oraz klucz do identyfikowania adresowalnych bajtów, sterty pozostawionej czerwonej strefy oraz niektórych adresowalnych i częściowo adresowalnych bajtów w obszarze błędu.
Zobacz też
AddressSanitizer — omówienie
Rozwiązywanie znanych problemów z programemSanitizer
Dokumentacja języka i kompilacji narzędzia AddressSanitizer
AddressSanitizer runtime reference (Dokumentacja środowiska uruchomieniowego AddressSanitizer)
Bajty w tle addressSanitizer
AddressSanitizer — chmura lub testowanie rozproszone
Integracja debugera AddressSanitizer
Przykłady błędów addressSanitizer
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla