Compartir a través de


Error: heap-use-after-free

Error del saneador de direcciones: uso de memoria desasignada

Se muestran tres ejemplos en los que se puede asignar almacenamiento en el montón a través de malloc, realloc (C) y new (C++), junto con un uso erróneo de volatile.

Ejemplo- 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 y probar este ejemplo, ejecute estos comandos en un símbolo del sistema para desarrolladores de Visual Studio 2019 versión 16.9 o posterior:

cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe

Cuando aparezca Visual Studio, presione F5 para ejecutar el ejemplo 1.

Error resultante

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

La excepción iniciada apunta a la línea 11, devuelve x [ 5 ], y dice: Address Sanitizer Error Use of desasignated memory( Uso de la memoria desasignada). No se muestra en la captura de pantalla la salida en la ventana de la consola que muestra las direcciones de memoria y una clave para identificar bytes direccionables, bytes direccionables parcialmente, regiones de montón libres y bytes de zona roja izquierda en el área del error.

Ejemplo- 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 y probar este ejemplo, ejecute estos comandos en un símbolo del sistema para desarrolladores de Visual Studio 2019 versión 16.9 o posterior:

cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe

Cuando aparezca Visual Studio, presione F5 para ejecutar el ejemplo 2.

Error resultante: nuevo operador

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

La excepción iniciada apunta a la línea 11, buffer[0] = 42 y dice: Address Sanitizer Error: Uso de la memoria desasignada. No se muestra en la captura de pantalla es la salida de la ventana de la consola que muestra las direcciones de memoria y una clave para identificar bytes direccionables, bytes direccionables parcialmente, regiones de montón libres y bytes de zona roja alloca en el área del error.

Ejemplo- 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 y probar este ejemplo, ejecute estos comandos en un símbolo del sistema para desarrolladores de Visual Studio 2019 versión 16.9 o posterior:

cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe

Cuando aparezca Visual Studio, presione F5 para ejecutar el ejemplo 3.

Error resultante: reasignación

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

La excepción iniciada apunta a la línea 11, buffer[0] = 42 y dice: Address Sanitizer Error: Uso de la memoria desasignada. No se muestra en la captura de pantalla la salida en la ventana de la consola que muestra las direcciones de memoria y una clave para identificar bytes direccionables, bytes direccionables parcialmente, regiones de montón libres y bytes de zona roja izquierda en el área del error.

Ejemplo: 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 y probar este ejemplo, ejecute estos comandos en un símbolo del sistema para desarrolladores de Visual Studio 2019 versión 16.9 o posterior:

cl example4.cpp /fsanitize=address /Zi
devenv /debugexe example4.exe

Cuando aparezca Visual Studio, presione F5 para ejecutar el ejemplo 4.

Error resultante: volátil

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

La excepción iniciada apunta a la línea 12, *x = 42 y dice: Address Sanitizer Error: Uso de la memoria desasignada. No se muestra en la captura de pantalla la salida en la ventana de la consola que muestra direcciones de memoria y una clave para identificar bytes direccionables, bytes de zona roja izquierda del montón y algunos bytes direccionables y parcialmente direccionables en el área del error.

Consulte también

Introducción a AddressSanitizer
Problemas conocidos de AddressSanitizer
Referencia de lenguaje y compilación de AddressSanitizer
Referencia del entorno de ejecución addressSanitizer
Bytes de sombra addressSanitizer
Pruebas distribuidas o en la nube addressSanitizer
Integración del depurador AddressSanitizer
Ejemplos de errores addressSanitizer