Condividi tramite


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

Screenshot del debugger che mostra l'errore stack-buffer-underflow nell'esempio 1.

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

Screenshot del debugger che mostra l'errore stack-buffer-underflow nell'esempio 2.

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