Compartilhar via


Erro: stack-buffer-underflow

Erro na limpeza de endereço: subfluxo de buffer de pilha

Essas mensagens de erro indicam um acesso de memória a algum lugar antes do início de uma variável de pilha.

Exemplo – subfluxo 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 e testar esse exemplo, execute estes comandos em um prompt de comando do desenvolvedor do Visual Studio 2019 versão 16.9 ou posterior:

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

ASAN é uma forma de análise dinâmica, o que significa que só pode detectar código ruim que é realmente executado. Um otimizador removerá a atribuição para buffer[subscript] porque buffer[subscript] nunca é lida. Como resultado, este exemplo requer o /Od sinalizador.

Erro resultante

Captura de tela do depurador exibindo erro de subfluxo de buffer de pilha no exemplo 1.

Exemplo – subfluxo de pilha no 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;
}

Para compilar e testar esse exemplo, execute estes comandos em um prompt de comando do desenvolvedor do Visual Studio 2019 versão 16.9 ou posterior:

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

Erro resultante – subfluxo de pilha no thread

Captura de tela do depurador exibindo erro de subfluxo de buffer de pilha no exemplo 2.

Confira também

Visão geral do AddressSanitizer
Problemas conhecidos do AddressSanitizer
Referência de linguagem e build do AddressSanitizer
Referência de runtime do AddressSanitizer
Bytes de sombra de AddressSanitizer
Nuvem do AddressSanitizer ou teste distribuído
Integração do depurador do AddressSanitizer
Exemplos de erro do AddressSanitizer