La corrupción de la memoria ocurre en un programa de computadora cuando el contenido de una ubicación de memoria se modifica debido a un comportamiento programático que excede la intención del programador original o las construcciones del programa/lenguaje; esto se denomina violación de la seguridad de la memoria . Las causas más probables de corrupción de la memoria son errores de programación (errores de software). Cuando el contenido de la memoria corrupta se usa más adelante en ese programa, esto provoca un bloqueo del programa o un comportamiento extraño y extraño del programa. Casi el 10% de los bloqueos de aplicaciones en sistemas Windows se deben a la corrupción del montón . [1]
Los lenguajes de programación modernos como C y C++ tienen potentes funciones de gestión explícita de memoria y aritmética de punteros . Estas funciones están diseñadas para desarrollar aplicaciones y software de sistema eficientes. Sin embargo, el uso incorrecto de estas funciones puede provocar errores de corrupción de memoria.
La corrupción de memoria es uno de los errores de programación más difíciles de solucionar por dos razones:
- La fuente de la corrupción de la memoria y su manifestación pueden estar muy alejadas, lo que dificulta correlacionar la causa y el efecto.
- Los síntomas aparecen en condiciones inusuales, lo que dificulta reproducir el error de manera consistente.
Los errores de corrupción de memoria se pueden clasificar en cuatro categorías generales:
- Uso de memoria no inicializada : el contenido de la memoria no inicializada se trata como valores basura. El uso de dichos valores puede provocar un comportamiento impredecible del programa.
- Uso de memoria no propia: es común utilizar punteros para acceder a la memoria y modificarla. Si un puntero de este tipo es un puntero nulo, un puntero colgante (que apunta a la memoria que ya se ha liberado) o a una ubicación de memoria fuera de los límites actuales de la pila o el montón , se refiere a memoria que no está en posesión del programa. El uso de este tipo de punteros es un grave error de programación. El acceso a dicha memoria suele provocar excepciones del sistema operativo, que suelen provocar un bloqueo del programa (a menos que se utilice un software de protección de memoria adecuado).
- Uso de memoria más allá de la memoria asignada ( desbordamiento de búfer ): si se utiliza una matriz en un bucle, con una condición de terminación incorrecta, la memoria más allá de los límites de la matriz puede ser manipulada accidentalmente. El desbordamiento de búfer es una de las fallas de programación más comunes explotadas por los virus informáticos, causando serios problemas de seguridad informática (por ejemplo, ataque de retorno a libc , protección contra destrucción de pila ) en programas ampliamente utilizados. En algunos casos, los programas también pueden acceder incorrectamente a la memoria antes del inicio de un búfer.
- Gestión defectuosa de la memoria del montón: las fugas de memoria y la liberación de memoria no asignada o que no pertenece al montón son los errores más frecuentes causados por una gestión defectuosa de la memoria del montón.
Hay muchos depuradores de memoria como Purify , Valgrind , Insure++ , Parasoft C/C++test y AddressSanitizer disponibles para detectar errores de corrupción de memoria.
Véase también
Referencias
- ^ Radich, Q.; Sherer, T.; Sharkey, K.; Batchelor, D.; Kennedy, JT; Mabee, D.; Coulter, D.; Michael, S. (28 de abril de 2021). "Application Verifier (Windows 7 and Windows Server 2008 R2 Application Quality Cookbook) - Win32 apps". Microsoft Developer Network . Consultado el 9 de febrero de 2022 .
Enlaces externos
- Tutorial sobre corrupción de memoria Una introducción a las técnicas de explotación y mecanismos de protección