Erro: heap-use-after-free
Erro de Address Sanitizer: uso de memória desalocada
Mostramos três exemplos em que o armazenamento no heap pode ser alocado por meio de malloc
, realloc
(C) e new
(C++), juntamente com um uso equivocado de volatile
.
Exemplo- malloc
// example1.cpp
// heap-use-after-free error
#include <stdlib.h>
int main() {
char *x = (char*)malloc(10 * sizeof(char));
free(x);
// ...
return x[5]; // Boom!
}
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
devenv /debugexe example1.exe
Quando o Visual Studio for exibido, pressione F5
para executar o exemplo 1.
Erro resultante
A caixa de diálogo de exceção lançada aponta para a linha 11, retorna x [ 5 ] e diz: Address Sanitizer Error Use of deallocated memory. Não mostrada na captura de tela é a saída na janela do console que mostra endereços de memória e uma chave para identificar bytes endereçáveis, bytes parcialmente endereçáveis, regiões de heap liberadas e bytes de zona vermelha esquerda de heap na área do erro.
Exemplo- operator new
// example2.cpp
// heap-use-after-free error
#include <windows.h>
int main() {
char *buffer = new char[42];
delete [] buffer;
// ...
buffer[0] = 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 example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe
Quando o Visual Studio for exibido, pressione F5
para executar o exemplo 2.
Erro resultante – operador novo
A caixa de diálogo de exceção lançada aponta para a linha 11, buffer[0] = 42 e diz: Address Sanitizer Error: Use of deallocated memory. Não é mostrada na captura de tela a saída na janela do console que mostra endereços de memória e uma chave para identificar bytes endereçáveis, bytes parcialmente endereçáveis, regiões de heap liberadas e bytes de zona vermelha de alocação esquerda de heap na área do erro.
Exemplo- realloc
// example3.cpp
// heap-use-after-free error
#include <malloc.h>
int main() {
char *buffer = (char*)realloc(0, 42);
free(buffer);
// ...
buffer[0] = 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 example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe
Quando o Visual Studio for exibido, pressione F5
para executar o exemplo 3.
Erro resultante – realloc
A caixa de diálogo de exceção lançada aponta para a linha 11, buffer[0] = 42 e diz: Address Sanitizer Error: Use of deallocated memory. Não mostrada na captura de tela é a saída na janela do console que mostra endereços de memória e uma chave para identificar bytes endereçáveis, bytes parcialmente endereçáveis, regiões de heap liberadas e bytes de zona vermelha esquerda de heap na área do erro.
Exemplo – volátil
// example4.cpp
// heap-use-after-free error
#include <stdlib.h>
int main() {
volatile char *x = (char*)malloc(sizeof(char));
free((void*)x);
//...
*x = 42; // Boom!
}
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 example4.cpp /fsanitize=address /Zi
devenv /debugexe example4.exe
Quando o Visual Studio for exibido, pressione F5
para executar o exemplo 4.
Erro resultante – volátil
A caixa de diálogo de exceção lançada aponta para a linha 12, *x = 42, e diz: Erro do desinfetante de endereço: uso de memória desalocada. Não mostrada na captura de tela é a saída na janela do console que mostra endereços de memória e uma chave para identificar bytes endereçáveis, bytes de zona vermelha esquerda de heap e alguns bytes endereçáveis e parcialmente endereçáveis na área do erro.
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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de