Teilen über


Fehler: heap-use-after-free

Adressbereinigungsfehler: Verwendung des deallocated Memory

Wir zeigen drei Beispiele, in denen Speicher im Heap über malloc, realloc (C) und new (C++) zugeordnet werden kann, zusammen mit einer fehlerhaften Verwendung von volatile.

Beispiel- 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!
}

Führen Sie zum Erstellen und Testen dieses Beispiels die folgenden Befehle in einer Visual Studio 2019,16.9- oder höher-Entwickler-Eingabeaufforderung aus:

cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe

Wenn Visual Studio angezeigt wird, drücken F5 Sie, um Beispiel 1 auszuführen.

Resultierender Fehler

Screenshot des Debuggers, der die Verwendung des Fehlers

Das Ausgelöste Ausnahmedialogfeld verweist auf Zeile 11, Rückgabe x [ 5 ], und sagt: Adressbereinigungsfehler Verwendung des zugeordneten Speichers. Nicht im Screenshot dargestellt ist die Ausgabe im Konsolenfenster, in der Speicheradressen angezeigt werden, und ein Schlüssel zum Identifizieren adressierbarer Bytes, teilweise adressierbarer Bytes, freigegebener Heapbereiche und Heap-Links-Rotzonenbytes im Bereich des Fehlers.

Beispiel- 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;
}

Führen Sie zum Erstellen und Testen dieses Beispiels die folgenden Befehle in einer Visual Studio 2019,16.9- oder höher-Entwickler-Eingabeaufforderung aus:

cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe

Wenn Visual Studio angezeigt wird, drücken F5 Sie, um Beispiel 2 auszuführen.

Resultierender Fehler - Operator neu

Screenshot des Debuggers, der die Verwendung des Fehlers

Das Ausgelöste Ausnahmedialogfeld verweist auf Zeile 11, Puffer[0] = 42 und sagt: Adressbereinigungsfehler: Verwendung des zugeordneten Speichers. Nicht im Screenshot dargestellt ist die Ausgabe im Konsolenfenster, in der Speicheradressen angezeigt werden, und ein Schlüssel zum Identifizieren adressierbarer Bytes, teilweise adressierbarer Bytes, freigegebener Heapbereiche und Heap links alloca red zone bytes im Bereich des Fehlers.

Beispiel- 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;
}

Führen Sie zum Erstellen und Testen dieses Beispiels die folgenden Befehle in einer Visual Studio 2019,16.9- oder höher-Entwickler-Eingabeaufforderung aus:

cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe

Wenn Visual Studio angezeigt wird, drücken F5 Sie, um Beispiel 3 auszuführen.

Resultierender Fehler – realloc

Screenshot des Debuggers, der die Verwendung des Fehlers

Das Ausgelöste Ausnahmedialogfeld verweist auf Zeile 11, Puffer[0] = 42 und sagt: Adressbereinigungsfehler: Verwendung des zugeordneten Speichers. Nicht im Screenshot dargestellt ist die Ausgabe im Konsolenfenster, in der Speicheradressen angezeigt werden, und ein Schlüssel zum Identifizieren adressierbarer Bytes, teilweise adressierbarer Bytes, freigegebener Heapbereiche und Heap-Links-Rotzonenbytes im Bereich des Fehlers.

Beispiel – veränderlich

// 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!
}

Führen Sie zum Erstellen und Testen dieses Beispiels die folgenden Befehle in einer Visual Studio 2019,16.9- oder höher-Entwickler-Eingabeaufforderung aus:

cl example4.cpp /fsanitize=address /Zi
devenv /debugexe example4.exe

Wenn Visual Studio angezeigt wird, drücken F5 Sie, um Beispiel 4 auszuführen.

Resultierender Fehler - veränderlich

Screenshot des Debuggers, der eine Verwendung des Fehlers

Das Ausgelöste Ausnahmedialogfeld verweist auf Zeile 12, *x = 42, und sagt: Adressbereinigungsfehler: Verwendung des zugeordneten Speichers. Nicht im Screenshot dargestellt ist die Ausgabe im Konsolenfenster, in der Speicheradressen angezeigt werden, und ein Schlüssel zum Identifizieren adressierbarer Bytes, heap links roter Zonenbytes und einige adressierbare und teilweise adressierbare Bytes im Bereich des Fehlers.

Siehe auch

AddressSanitizer -Übersicht
Beheben bekannter Probleme mit demSanitizer
AddressSanitizer Build- und Sprachreferenz
AddressSanitizer-Laufzeitreferenz
AddressSanitizer-Schattenbytes
AddressSanitizer-Cloud oder verteilte Tests
AddressSanitizer Debugger-Integration
Beispiele für AddressSanitizer-Fehler