Partilhar via


Erro: stack-buffer-underflow

Endereço Sanitizer Error: Stack buffer underflow

Observações

Essas mensagens de erro indicam um acesso à memória em 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 criar e testar este 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 detetar código incorreto que é realmente executado. Um otimizador removerá a atribuição para buffer[subscript] porque buffer[subscript] nunca é lido. Como resultado, este exemplo requer o /Od sinalizador.

Erro resultante

Captura de tela do depurador exibindo erro stack-buffer-underflow no exemplo 1.

Exemplo - stack underflow 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 criar e testar este 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 stack-buffer-underflow no exemplo 2.

Ver também

Visão geral do AddressSanitizer
AddressSanitizer problemas conhecidos
de compilação e referência de linguagem AddressSanitizer
de referência de tempo de execução AddressSanitizer
AddressSanitizer shadow bytes
AddressSanitizer na nuvem ou de testes distribuídos
de integração do depurador AddressSanitizer
Exemplos de erro AddressSanitizer