Memory Leak
Fuga de memoria
Descripción
Una fuga de memoria es una forma no intencionada de consumo de memoria por la cual la aplicación no libera un bloque de memoria asignado cuando ya no se necesita. Las consecuencias de este problema dependen de la aplicación en sí.
Considere los siguientes tres casos generales:
- Aplicación de espacio de usuario (User-land) de corta duración: Poco efecto notable, si lo hay. El sistema operativo moderno recupera la memoria perdida después de la finalización del programa.
- Aplicación de espacio de usuario de larga duración: Potencialmente peligrosa. Estas aplicaciones continúan desperdiciando memoria con el tiempo, consumiendo eventualmente todos los recursos de la RAM. Conduce a un comportamiento anormal del sistema.
- Proceso del espacio del núcleo (Kernel-land): Muy peligroso. Las fugas de memoria en el nivel del núcleo provocan graves problemas de estabilidad del sistema. La memoria del núcleo es muy limitada en comparación con la memoria del espacio de usuario y debe manejarse con precaución.
El siguiente ejemplo es una fuga de memoria básica en C:
#include <stdlib.h>
#include <stdio.h>
#define LOOPS 10
#define MAXSIZE 256
int main(int argc, char **argv)
{
int count = 0;
char *pointer = NULL;
for(count=0; count<LOOPS; count++) {
pointer = (char *)malloc(sizeof(char) * MAXSIZE);
}
free(pointer);
return count;
}
En este ejemplo, tenemos 10 asignaciones del tamaño MAXSIZE. Toda asignación, excepto la última, se pierde. Si ningún puntero apunta al bloque asignado, es irrecuperable durante la ejecución del programa. Una solución sencilla a este ejemplo trivial es colocar la llamada free() dentro del bucle ‘for’.
Recomendación
Evitar las fugas de memoria en las aplicaciones es difícil. Hay pasos que puede seguir para ayudar a detectar y abordar las fugas de memoria:
- Use herramientas de creación de perfiles (Profiling Tools): Emplee herramientas de creación de perfiles de memoria como Android Profiler (para Android) o Instruments (para iOS) para identificar las fugas de memoria y los patrones de uso de memoria.
- Use bibliotecas de detección de fugas: Integre bibliotecas de detección de fugas como LeakCanary (para Android) o Instruments (para iOS) en su proceso de desarrollo para detectar y señalar automáticamente las fugas de memoria durante las fases de desarrollo y prueba.
- Use Sanitizers: Considere compilar su aplicación con herramientas de saneamiento (sanitizers) como
HWAddressSanitizer,GWP-ASanyArm Memory Tagging Extension
Enlaces
Estándares
- OWASP_MASVS_L1:
- MSTG_CODE_8
- OWASP_MASVS_L2:
- MSTG_CODE_8
- CWE_TOP_25:
- CWE_400
- PCI_STANDARDS:
- REQ_6_2
- OWASP_MASVS_v2_1:
- MASVS_RESILIENCE_4
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- CC_9_1
- HIPAA_CONTROLS:
- SECURITY212
- SECURITY213
- SECURITY255