La variable MALLOC_CHECK_

En los sistemas Linux la mayoría de los problemas que derivan en colisiones de aplicaciones, o incluso cuelgues o errores graves en el sistema, están relacionados con la corrupción o la mala gestión de la memoria dinámica (memoria del montón (heap) o memoria reservada). Estos problemas surgen como consecuencia de un acceso a zonas de memoria erroneas, liberación de la misma zona de memoria varias veces, etc …

La librería libc, en sus distintas versiones de Linux (posteriores a la 5.4.23) o de GNU (2.x), es la que contiene las funciones de programación en lenguaje C encargadas de la gestión de la memoria (malloc(), free(), calloc(), realloc()…). A partir de las versiones indicadas, la libería libc permite un uso parametrizado de las funciones mediante la variable de entorno MALLOC_CHECK_ ,

Al usar la variable MALLOC_CHECK_ las funciones contenidas en libc se vuelven tolerantes a fallos simples (esto hace que sean menos eficientes) permitiendo algunos errores leves pero comunes (por ejemplo el desbordamiento o el acceso a posiciones fuera de un array) pudiéndose producir pérdidas de memoria.

Los distintos valores que puede tomar la variable MALLOC_CHECK_son:

  • MALLOC_CHECK_=0: Cualquier error de memoria detectado se ignora silenciosamente.
  • MALLOC_CHECK_=1: Se imprime un mensaje de error en la salida estándar de errores (stderr), pero el programa continúa su ejecución.
  • MALLOC_CHECK_=2: En caso de error se llama inmediatamente a abort(), lo cuál hace que el programa finalice de forma anormal, pero el mensaje de error no es generado.
  • MALLOC_CHECK_=3: Hace lo mismo que en el caso anterior pero imprimiendo el mensaje de error correspondiente por la salida estándar de errores (stderr).

En aplicaciones en desarrollo es aconsejable mantener el valor de MALLOC_CHECK_=3 para que el programa finalice inmediatamente tras el fallo. De esta forma le sea más intuitivo al programador poder encontrar la causa real del fallo, ya que de lo contrario el error podría arrastrarse y provocar colisiones mucho mas tardías en la aplicación. Esos errores serían infinitamente más costosos de rastrear y reparar.

Un uso interesante de la variable MALLOC_CHECK_ puede ser mostrar al usuario final versiones beta de una aplicación que todavía está en fase de pruebas (depuración). En ningún caso debería de usarse esta variable para enterrar errores de manejo de memoria dinámica en aplicaciones en producción.

Fuentes:

Acerca de franciscoguemes

Ingeniero en Informática
Esta entrada fue publicada en C/C++, Linux. Guarda el enlace permanente.

2 respuestas a La variable MALLOC_CHECK_

  1. Pingback: Bug en el Package Explorer de Eclipse sobre Mandriva | Francisco José Güemes Sevilla

  2. Angelos dijo:

    Muy útil, gracias.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s