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