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

Screenshot des Debuggers, der stapelpufferunterlauffehler in Beispiel 1 anzeigt.

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

Screenshot des Debuggers, der Stapelpuffer-Unterlauffehler in Beispiel 2 anzeigt.

Weitere Informationen

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