Errore: stack-buffer-underflow
Errore di purificazione dell'indirizzo: flusso di underflow del buffer dello stack
Questi messaggi di errore indicano un accesso alla memoria da qualche parte prima dell'inizio di una variabile dello stack.
Esempio - Underflow della matrice locale
// example1.cpp
// stack-buffer-underflow error
#include <stdio.h>
int main() {
int subscript = -1;
char buffer[42];
buffer[subscript] = 42; // Boom!
return 0;
}
Per compilare e testare questo esempio, eseguire questi comandi in un prompt dei comandi per sviluppatori di Visual Studio 2019 versione 16.9 o successiva:
cl example1.cpp /fsanitize=address /Zi /Od
devenv /debugexe example1.exe
ASAN è una forma di analisi dinamica, il che significa che può rilevare solo codice non valido effettivamente eseguito. Un ottimizzatore rimuoverà l'assegnazione a buffer[subscript]
perché buffer[subscript]
non viene mai letta da. Di conseguenza, questo esempio richiede il /Od
flag .
Errore risultante
Esempio: stack underflow nel 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;
}
Per compilare e testare questo esempio, eseguire questi comandi in un prompt dei comandi per sviluppatori di Visual Studio 2019 versione 16.9 o successiva:
cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe
Errore risultante - Stack Underflow nel thread
Vedi anche
Panoramica di AddressSanitizer
Problemi noti di AddressSanitizer
Riferimento alla compilazione e al linguaggio AddressSanitizer
Informazioni di riferimento sul runtime AddressSanitizer
Byte ombreggiatura AddressSanitizer
AddressSanitizer cloud o test distribuiti
Integrazione del debugger AddressSanitizer
Esempi di errore addressSanitizer