Problema del año 2038

De Wikipedia, la enciclopedia libre
Ir a la navegación Ir a la búsqueda
Animación del efecto 2038.

En informática, el problema del año 2038 (conocido también por el numerónimo Y2K38) podría causar que una parte del software falle en ese año. El problema afecta a los programas que usen la representación del tiempo basada en el sistema POSIX, que se basa en contar el número de segundos transcurridos desde el 1 de enero de 1970 a las 00:00:00 (ignorando los segundos intercalares). Las últimas versiones del kernel Linux comienzan a contar desde las 21:00 del 31 de diciembre de 1969. En Android, ocurre lo mismo, ya que utiliza esta versión de kernel, aunque no es posible seleccionar la fecha desde el menú de ajustes.

Esta representación es un estándar de facto en los sistemas tipo Unix y también en los programas escritos para muchos otros sistemas operativos debido al gran alcance del lenguaje de programación C. En la mayoría de sistemas de 32 bits, el tipo de dato time_t usado para guardar el contador de segundos es un entero de 32 bits con signo, es decir, que puede representar un rango de números entre -2 147 483 648 y 2 147 483 647 (-231 y 231-1; 1 bit para el signo, y 31 para representar su valor en complemento a dos), por lo que el último segundo representable con este formato será a las 03:14:07 UTC del 19 de enero de 2038, cuando el contador llegue a 2 147 483 647. Un segundo después, el contador se desbordará y saltará al valor -2 147 483 648, que causará el fallo de programas que interpretarán el tiempo como que están en 1901 (dependiendo de la implementación), en vez de en 2038. A su vez, esto causaría cálculo y procesamiento incorrecto y causaría un problema mundial. Los sistemas que cuentan la hora desde (21:00 31/12/1969) llegaran a su tope a las 00:14:07.

No hay una forma sencilla de arreglar este problema para las combinaciones existentes de CPU/SO. Cambiar la definición de time_t para usar un tipo de 64 bits rompería la compatibilidad binaria para el software, almacenamiento de datos y, por lo general, cualquier cosa que tenga algo que ver con la representación binaria del tiempo. Cambiar time_t a un entero de 32 bits sin signo afectaría a los programas que hacen cálculos con diferencias de tiempo.

La mayoría de sistemas operativos para arquitecturas de 64 bits utilizan enteros de 64 bits para time_t. La migración a estos sistemas está todavía en proceso y se espera que se complete mucho antes de 2038. Usar un entero de 64 bits retrasaría la fecha del problema unos 2,90 billones de años (2,9 × 1012). Es decir, 220 veces la edad aproximada del Universo.

Antecedentes[editar]

  • Muy relacionado con el tema del año 2038 está el año 2036 (numérico: Y2K36). El 7 de febrero de 2036 a las 06:28:16 UTC, el contador del protocolo de sincronización de hora NTP (Protocolo de tiempo de red), ampliamente utilizados en los círculos de Unix, llegará a su máximo valor en muchos dispositivos, especialmente los sistemas integrados, que aún utilizan el antiguo estándar RFC 868. En las implementaciones modernas, este problema está resuelto en la RFC 5905. En este caso el contexto es que el tiempo de espera se lleva a cabo con un número de 32 bits en segundos, pero sin signo y con la hora de inicio del 1 de enero de 1900 a las 00:00:00 UTC.[1]​ Con una implementación muy adecuada de los sistemas, no hay mayor problema durante el cálculo, ya que la sincronización de tiempo debería funcionar de acuerdo con un método de diferencia. Si un cliente no conoce la hora actual (inicio en frío en sistemas sin reloj de hardware) y no verifica una fecha mínima (por ejemplo, la fecha de su compilación o la fecha del software NTP), podría probar la fecha 1900-01-01 UTC, que no se puede mostrar en tiempo de Unix y entonces el reloj interno del sistema afectado puede saltar a valores "absurdos", lo que puede conducir a un fallo total.[2]
  • El Boeing 787 presenta una falla de software que obliga a apagar cada cierto y por completo los sistemas eléctricos a fin de prevenir entrar en modo de fallo, lo que ocasionaría el apagado de los motores en vuelo. La remota posiblidad ocurre en un software contador de centésimas de segundos que se desborda después de poco más de 248 días de funcionamiento continuo (248×24 horas ×3600 segundos ×100 = 2 142 720 000). La Administración Federal de Aviación (FAA) consideró menos peligroso y económico el implementar una directiva de aeronavegabilidad contra sustituir el software de todos los aviones a nivel mundial.
  • El 8 de agosto de 2013 la sonda espacial Deep Impact tuvo una falla en el conteo del tiempo, lo que ocasionó la mala orientación de sus paneles solares quedando así sin suministro eléctrico para comunicarse y condujo a la finalización de la misión.[3]​ En este caso el conteo se llevaba a cabo por décimas de segundo en una variable de 32 bits sin signo: 2^32=4 294 967 296; si sumamos 429 496 729,6 décimas de segundo a la fecha 1 de enero de 2000 resulta 11 de agosto de 2013 12:38:49 a.m.,[4]​ teniendo en cuenta, además, el fenómeno de la dilatación del tiempo.

Dispositivos afectados[editar]

El problema hacía que los dispositivos Android se bloquearan y no reiniciaran cuando se establecía la fecha límite. Para comprobar esto se puede ir a la configuración de fecha y hora en el dispositivo, y al tratar de cambiar la fecha y hora al 2038; se encontrará con la sorpresa de que solo le permite cambiarlo hasta el 31 de diciembre de 2037. En la versión 4.0.4 se agregó esta característica, en las versiones anteriores, el calendario mostraba fechas hasta 2104, pero al seleccionar una fecha más adelantada a la fecha límite, el calendario volvía a la fecha actual. El selector de fechas mostraba correctamente los años a simple vista, pero al poner un dedo sobre alguna fecha no contable, este marcaba su negativa, es decir, el 19 de enero de 2040 por ejemplo, a simple vista se veía correcto, pero el sistema marcaba 13 de diciembre de 1903, ya que al reiniciarse, la primera fecha mostrable es 13 de diciembre de 1901. Un dato curioso es que de esta forma el sistema no se tildaba ni reiniciaba, la única manera era dejando que el contador llegara al límite por sí mismo.[5]

En los dispositivos iOS el sistema permite cambiar la fecha hasta el 1 de enero de 2038; sin embargo, desde el iPhone 5s en adelante se solucionaría, ya que estos modelos recientes de iPhone poseen un procesador de 64 bits que lo deja fuera de este problema. Igualmente Android ya está disponible en variantes de 64 bits desde la versión 5.0 por lo que gradualmente dejará atrás este problema. Los dispositivos con Android de 32 bits, Ubuntu Phone, Ubuntu Touch o Firefox OS llegan hasta el 31 de diciembre de 2037. Los dispositivos con Windows Phone 7 permiten llegar hasta el 1 de enero de 2040. Los dispositivos Windows Phone 8 no están afectados, y cuentan fechas desde el año 1601 hasta el 3000, concretamente el 1 de enero, al llegar a las 23:59, el contador regresa 24 horas y vuelve a marcar las 00:00 01/01/3000.

Concretamente, el problema afecta a los programas que usan la representación del tiempo basada en el sistema POSIX, que es el explicado en el párrafo anterior. Es la representación estándar en los sistemas tipo Unix y en todos los programas escritos en el lenguaje de programación C. La mayoría del software actual cae dentro de ese grupo y fallarán, dependiendo de como estén implementados, como si estuviesen funcionando en 1901 o 1970, en vez de en 2038. A pesar de ser un problema bien conocido (los programadores conocen esta limitación desde la implementación misma del lenguaje C), no existe una forma sencilla de solucionar este problema. Podría cambiarse el tipo de variable empleado por un entero de 32 bits sin signo, pero esto haría que todos los programas que hacen cálculos con diferencias de tiempo fallen. Y reescribir por completo esas aplicaciones es un trabajo enorme que sólo puede evitarse migrando a los 64 bits.

Soluciones actuales[editar]

La tecnología actual va dejando atrás gradualmente los 32 bits. Los mayores fabricantes de procesadores (Intel, AMD, Mediatek y otros) ofrecen microprocesadores de 64 bits desde hace tiempo. Asímismo Microsoft ofrece versiones de Windows de 64 bits desde Windows XP, MacOS sólo existe en 64 bits desde Mac OS X 10.7, Linux existe en versiones de 64 bits desde el año 2003, iOS usa 64 bits desde iOS 7 y Android existe en versiones de 64 bits desde Android 5.0. De esta forma si hoy en día los 32 bits ya están siendo reemplazados, díficilmente seguirán en uso en 2038. Aún si quedaran sistemas embebidos operando con 32 bits para aquel entonces, los fabricantes tendrían bastante tiempo para reparar el problema mediante actualizaciones.[6]

Véase también[editar]

Referencias[editar]

  1. «NTP Timescale and Leap Seconds» (html). NTP org (en inglés). Archivado desde el original el 3 de noviembre de 2011. Consultado el 12 de octubre de 2018. «With respect to the recent year 2000 issue, the most important thing to observe about the NTP timescale is that it knows nothing about days, years or centuries, only the seconds since the beginning of the current era which began on 1 January 1900. On 1 January 1970 when Unix life began, the NTP timescale showed 2,208,988,800 and on 1 January 1972 when UTC life began, it showed 2,272,060,800.» 
  2. Cassely, Jean-Laurent (6 de mayo de 2015). «2.147.483.647: pourquoi ce nombre peut tout faire buguer et rend fous les informaticiens» (html). Slate (en francés). Archivado desde el original el 9 de mayo de 2015. Consultado el 12 de octubre de 2018. «L'article de la BBC raconte que c'est aussi ce bug qui est soupçonné d'avoir causé la perte de contact par la Nasa en 2013 de sa sonde spatiale Deep Impact.» 
  3. Wallace, Malcolm (23 de septiembre de 2013). «Re: [tz] Deep Impact: wrong time zone?» (html). Gmane Org. (en inglés). Archivado desde el original el 2 de octubre de 2013. Consultado el 12 de octubre de 2018. «Put another way, if you represented time as the number of tenths of a second since midnight on January 1, 2000, then you would hit 4294967296 tenths of a second on August 11, 2013[2]. 4294967296 is significant because it's 2^32, which is the smallest number that can't be represented as a 32-bit integer. Generally this will wrap around to 0 (as in calculating 4294967295 + 1 will give you 0).» 
  4. Issue 16899 - android - Year 2038 problem.(en inglés)
  5. «Qué es el "Efecto 2038", a qué dispositivos afecta y qué peligro podría suponer» (html). Xataka. 23 de septiembre de 2017. Archivado desde el original el 23 de septiembre de 2017. Consultado el 12 de octubre de 2018. «E incluso en el caso de que aún quedase algún sistema de red o dispositivo secundario anclado en los 32 bits por aquel entonces, los fabricantes tienen tiempo de sobra para parchearlos con actualizaciones de software. Vamos, que va a ser muy difícil que este problema de 2038 acabe causando algún estrago significativo.» 

Enlaces externos[editar]