La corrupción de memoria ocurre en un programa cuando los contenido de una dirección de memoria involuntariamente se modifican debido a errores de programación; esto se conoce como violación de la seguridad de memoria. Cuando los contenidos corruptos de memoria se usan más tarde en el programa, conduce a un accidente del programa o a un comportamiento extraño del mismo. Casi el 10% de accidentes de aplicación en sistemas de Windows es debido a la corrupción del stack.[1]
Los lenguajes de programación modernos como C y C++ tienen rasgos potentes de direcciones de memoria explícita y aritmética de punteros. Estos rasgos se diseñan para desarrollar aplicaciones eficientes y software del sistema. Sin embargo, la utilización de estos rasgos incorrectamente puede llevar a errores de corrupción de memoria.
La corrupción de memoria es una de la clase de errores de programación más insuperable debido a dos motivos:
- La fuente de la corrupción de la memoria y su manifestación pueden estar muy separados, por lo que es difícil relacionar la causa y el efecto.
- Los síntomas aparecen en condiciones inusuales, por lo que es difícil de reproducir constantemente el error.
Clasificación
Los errores de corrupción de memoria se pueden clasificar en cuatro categorías:
- Utilización de memoria no inicializada: se considera que los contenido de la memoria no inicializada son valores basura y usando estos valores puede llevar al comportamiento del programa imprevisible.
- Uso de la memoria sin propietario: es común el uso de punteros para acceder y modificar la memoria. Si un puntero es un puntero nulo, puntero colgando (apuntando a la memoria que ya se ha liberado), o en una ubicación de memoria fuera de la pila actual o límites de la pila, se refiere a la memoria que no es entonces poseída por el programa. Estos punteros son un grave defecto de programación. Acceder a esa memoria suele causar excepciones del sistema operativo, también denominados fallos de página, lo que más comúnmente lleva a una falla del programa.
- Usa de memoria más allá de la asignada (buffer overflow): Si un arreglo se utiliza en un bucle, con la condición de corte incorrecta, la memoria más allá de los límites del arreglo puede ser manipulada. Los buffer overflows son uno de los defectos de programación más comúnmente explotados por los virus informáticos[2] que causan graves problemas de seguridad informática (por ejemplo, el ataque return-to-libc) en los programas utilizados. También se puede acceder a la memoria incorrectamente antes del comienzo de un buffer.
- Gestión defectuosa de la memoria heap: fugas de memoria y liberar memoria que no es del heap o esta sin asignar son los errores más frecuentes causados por la gestión deficiente de la memoria heap.
Protección
Muchos depuradores memoria como Purify, Valgrind, Insure++, AddressSanitizer[3] están disponibles para detectar errores de corrupción de memoria.
Referencias
Enlaces externos