10 febrero 2008

El efecto 2038 y como probarlo desde C

Ya se habló de sobra del efecto 2000 hace tiempo: los programas que empleasen dos cifras para las fechas podrían considerar que el año 00 no era el 2000, sino el 1900, y calcular incorrectamente cualquier diferencia entre tiempos, con los problemas que podría conllevar.

Pero también existe el efecto 2038: muchos sistemas actuales están programados en lenguaje C (o alguno de sus "derivados") y en estos sistemas la forma "habitual" de contar fechas es como segundos transcurridos desde el 1 de enero de 1970.

¿El problema? En un sistema de 32 bits, como son la mayoría de los actuales, el tipo de datos "time_t" usado para guardar fechas equivale a un "long", un entero largo... y el número de segundos que se puede contar acaba en 2038, en la madrugada del 19 de enero. Un ejemplo para probarlo desde C sería éste


#include
#include

int main ()
{
time_t momento;
int i;

momento = 2147483641;
for (i = 0; i < 10; i++) {
momento ++;
printf ( "El instante %ld se convierte en %s\n",
momento, ctime ( &momento ) );
}

return 0;
}


Se supone que es C estándar, debería funcionar tanto desde Windows como desde Linux, y su resultado debería ser algo como:

El instante 2147483642 se convierte en Tue Jan 19 04:14:02 2038
El instante 2147483643 se convierte en Tue Jan 19 04:14:03 2038
El instante 2147483644 se convierte en Tue Jan 19 04:14:04 2038
El instante 2147483645 se convierte en Tue Jan 19 04:14:05 2038
El instante 2147483646 se convierte en Tue Jan 19 04:14:06 2038
El instante 2147483647 se convierte en Tue Jan 19 04:14:07 2038
El instante -2147483648 se convierte en (null)
El instante -2147483647 se convierte en (null)
El instante -2147483646 se convierte en (null)
El instante -2147483645 se convierte en (null)


¿La solución? Debería venir "sóla". En sistemas de 64 bits, y si se usa realmente el tipo "time_t", esto debería ocultar los detalles del hardware, y debería bastar con recompilar el fuente para tener una vida muuuucho más larga. Esperemos que en el 2038 no queden muchos equipos con software de 32 bits y/o que no lo hayan previsto...

Más detalles en la Wikipedia: Efecto 2038
Y en algún que otro sitio más, como El módem

3 comentarios:

Koki dijo...

Ya los procesadores de 64 bits están en el mercado. Falta que más gente se anime a usar SO de 64.

Nacho Cabanes dijo...

El problema no es "más gente" sino "todos los servidores de cualquier tipo".

Se supone que en 30 años no debería quedar ningún servidor de 32 bits activo, ni ninguno de 64 (o más) que use software de 32. Pero quizá sea demasiado suponer...

Anónimo dijo...

Es mucho más probable que pequeños autómatas de 32bit-"sobraos" (Arduino-like) en los que hoy confiamos ciegamente, p.e. alarmas domésticas, u otros electrodomésticos que hayan sido programados en C, o al menos siguiendo ese origen de los tiempos, continuen operativos y lleguen a funcionar mal.
Probablemente habrá una campaña apocalíptica de revisión de ascensores y cosas así de riesgo que se aprovechará para sacar el dinero a los propietarios...