Fehler: stack-buffer-underflow
Adressbereinigungsfehler: Stapelpufferunterlauf
Diese Fehlermeldungen geben einen Speicherzugriff auf eine beliebige Stelle vor beginn einer Stapelvariable an.
Beispiel : lokaler Arrayunterlauf
// example1.cpp
// stack-buffer-underflow error
#include <stdio.h>
int main() {
int subscript = -1;
char buffer[42];
buffer[subscript] = 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 example1.cpp /fsanitize=address /Zi /Od
devenv /debugexe example1.exe
ASAN ist eine Form der dynamischen Analyse, was bedeutet, dass nur fehlerhaften Code erkannt werden kann, der tatsächlich ausgeführt wird. Ein Optimierer entfernt die Aufgabe, buffer[subscript]
weil buffer[subscript]
sie nie gelesen wird. Daher erfordert dieses Beispiel die /Od
Kennzeichnung.
Resultierender Fehler
Beispiel : Stapelunterlauf im Thread
// example2.cpp
// stack-buffer-underflow error
#include <windows.h>
DWORD WINAPI thread_proc(void *) {
int subscript = -1;
volatile char stack_buffer[42];
stack_buffer[subscript] = 42;
return 0;
}
int main() {
HANDLE thr = CreateThread(NULL, 0, thread_proc, NULL, 0, NULL);
if (thr == 0) return 0;
WaitForSingleObject(thr, INFINITE);
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
Resultierender Fehler - Stapelunterlauf im Thread
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