Błąd: stack-buffer-underflow

Błąd sanitizera adresu: niedopełnienie buforu stosu

Te komunikaty o błędach wskazują na dostęp do pamięci gdzieś przed rozpoczęciem zmiennej stosu.

Przykład — podpełnienie tablicy lokalnej

// example1.cpp
// stack-buffer-underflow error
#include <stdio.h>

int main() {

    int subscript = -1;
    char buffer[42];
    buffer[subscript] = 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 example1.cpp /fsanitize=address /Zi /Od
devenv /debugexe example1.exe

ASAN jest formą analizy dynamicznej, co oznacza, że może wykrywać tylko zły kod, który jest rzeczywiście wykonywany. Optymalizator usunie przypisanie do buffer[subscript] , ponieważ buffer[subscript] nigdy nie zostanie odczytany. W związku z tym ten przykład wymaga flagi /Od .

Wynikowy błąd

Zrzut ekranu przedstawiający błąd stack-buffer-underflow w debugerze w przykładzie 1.

Przykład — podpełnienie stosu w wątku

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

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

Błąd wynikowy — podpełnienie stosu w wątku

Zrzut ekranu przedstawiający błąd stack-buffer-underflow w debugerze w przykładzie 2.

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