Sdílet prostřednictvím


Chyba: stack-buffer-underflow

Chyba sanitizátoru adresy: Podtečení vyrovnávací paměti zásobníku

Tyto chybové zprávy označují přístup k paměti někde před začátkem proměnné zásobníku.

Příklad – místní podtečení pole

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

int main() {

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

Pokud chcete tento příklad sestavit a otestovat, spusťte tyto příkazy v sadě Visual Studio 2019 verze 16.9 nebo novějším vývojářském příkazovém řádku:

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

ASAN je forma dynamické analýzy, což znamená, že dokáže rozpoznat pouze chybný kód, který je skutečně proveden. Optimalizátor odebere přiřazení buffer[subscript] , protože se z toho buffer[subscript] nikdy nečte. V důsledku toho tento příklad vyžaduje /Od příznak.

Výsledná chyba

Snímek obrazovky ladicího programu zobrazující chybu podtečení zásobníku vyrovnávací paměti v příkladu 1

Příklad – podtečení zásobníku ve vlákně

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

Pokud chcete tento příklad sestavit a otestovat, spusťte tyto příkazy v sadě Visual Studio 2019 verze 16.9 nebo novějším vývojářském příkazovém řádku:

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

Výsledná chyba – podtečení zásobníku ve vlákně

Snímek obrazovky s ladicím programem zobrazující chybu podtečení zásobníku vyrovnávací paměti v příkladu 2

Viz také

Přehled AddressSanitizer
Známé problémy s addressSanitizerem
Referenční dokumentace k sestavení a jazyku AddressSanitizer
Referenční informace k modulu runtime AddressSanitizer
Stínové bajty AddressSanitizer
AddressSanitizer – cloud nebo distribuované testování
Integrace ladicího programu AddressSanitizer
Příklady chyb AddressSanitizer