Compartir a través de


Error: stack-buffer-underflow

Error de AddressSanitizer: subdesbordamiento del búfer de pila

Estos mensajes de error indican un acceso de memoria a algún lugar antes del principio de una variable de pila.

Ejemplo: subdesbordamiento de matriz local

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

int main() {

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

Para compilar y probar este ejemplo, ejecute estos comandos en un símbolo del sistema para desarrolladores de Visual Studio 2019 versión 16.9 o posterior:

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

ASAN es una forma de análisis dinámico, lo que significa que solo puede detectar código incorrecto que realmente se ejecuta. Un optimizador quitará la asignación a buffer[subscript] porque buffer[subscript] nunca se lee. Como resultado, este ejemplo requiere la /Od marca .

Error resultante

Captura de pantalla del depurador, donde se muestra el error stack-buffer-overflow en el ejemplo 1.

Ejemplo: subdesbordamiento de pila en el subproceso

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

Para compilar y probar este ejemplo, ejecute estos comandos en un símbolo del sistema para desarrolladores de Visual Studio 2019 versión 16.9 o posterior:

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

Error resultante: subdesbordamiento de pila en el subproceso

Captura de pantalla del depurador, donde se muestra el error stack-buffer-overflow en el ejemplo 2.

Consulte también

Introducción a AddressSanitizer
Problemas conocidos de AddressSanitizer
Referencia de lenguaje y compilación de AddressSanitizer
Referencia del entorno de ejecución addressSanitizer
Bytes de sombra addressSanitizer
Pruebas distribuidas o en la nube addressSanitizer
Integración del depurador AddressSanitizer
Ejemplos de errores addressSanitizer