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
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
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