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 gerada pela exceção aponta para a linha 11, retorna x [ 5 ] e diz: Erro do Address Sanitizer 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 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 gerada pela exceção aponta para a linha 11, buffer[0] = 42, e diz: Erro do Analisador 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 parcialmente endereçáveis, regiões de heap liberadas e bytes de zona vermelha de alocação de heap à esquerda 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 aparecer, pressione F5
para executar o exemplo 3.
Erro resultante – realloc
A caixa de diálogo gerada pela exceção aponta para a linha 11, buffer[0] = 42, e diz: Erro do Analisador 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 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 gerada pela exceção aponta para a linha 12, *x = 42, e diz: Erro do Limpador de Endereço: Uso de memória desalocada. Não é mostrada na captura de tela a saída na janela do console que mostra os 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