Udostępnij za pośrednictwem


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

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

Screenshot of the debugger displaying use of deallocated memory error for example 1.

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

Screenshot of the debugger displaying use of deallocated memory error in example 2.

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

Screenshot of the debugger displaying use of deallocated memory error in example 3.

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

Screenshot of the debugger displaying a use of deallocated memory error in example 4.

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