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