Dela via


Fel: stack-buffer-underflow

Adressfel för sanitizer: Stackbuffertunderflöde

Anmärkningar

Dessa felmeddelanden anger en minnesåtkomst till någonstans före början av en stackvariabel.

Exempel – underflöde för lokal matris

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

int main() {

    int subscript = -1;
    char buffer[42];
    buffer[subscript] = 42; // Boom!
   
    return 0;
}

Om du vill skapa och testa det här exemplet kör du dessa kommandon i en kommandotolk för Visual Studio 2019 version 16.9 eller senare:

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

ASAN är en form av dynamisk analys, vilket innebär att den bara kan identifiera felaktig kod som faktiskt körs. En optimerare tar bort tilldelningen till buffer[subscript] eftersom buffer[subscript] den aldrig läss från. Därför kräver /Od det här exemplet flaggan.

Resulterande fel

Skärmbild av felsökningsprogrammet som visar stack-buffer-underflow-fel i exempel 1.

Exempel – stackunderflöde på tråd

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

Om du vill skapa och testa det här exemplet kör du dessa kommandon i en kommandotolk för Visual Studio 2019 version 16.9 eller senare:

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

Resulterande fel – stackunderflöde i tråd

Skärmbild av felsökningsprogrammet som visar stack-buffer-underflow-fel i exempel 2.

Se även

AddressSanitizer– översikt
AddressSanitizer kända problem
AddressSanitizer- och språkreferens
AddressSanitizer-körningsreferens
AddressSanitizer skugg byte
AddressSanitizer-moln eller distribuerad testning
AddressSanitizer-felsökningsintegrering
AddressSanitizer-felexempel