Compartilhar via


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

Screenshot of the debugger displaying use of deallocated memory error for example 1.

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

Screenshot of the debugger displaying use of deallocated memory error in example 2.

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

Screenshot of the debugger displaying use of deallocated memory error in example 3.

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

Screenshot of the debugger displaying a use of deallocated memory error in example 4.

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