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
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ě
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