stringtranslate.com

Problema del año 2038

Una imagen animada del error en acción. El error de desbordamiento se producirá a las 03:14:08 UTC del 19 de enero de 2038.

El problema del año 2038 (también conocido como Y2038 , [1] Y2K38 , superbacteria Y2K38 o Epochalypse [2] [3] ) es un problema de cálculo del tiempo que deja a algunos sistemas informáticos incapaces de representar los tiempos después de las 03:14:07 UTC del 19 Enero de 2038.

El problema existe en sistemas que miden el tiempo Unix (el número de segundos transcurridos desde la época Unix (00:00:00 UTC del 1 de enero de 1970)) y lo almacenan en un entero de 32 bits con signo . El tipo de datos solo es capaz de representar números enteros entre −(2 31 ) y 2 31  − 1 , lo que significa que la última hora que se puede codificar correctamente es 2 31  − 1 segundos después de la época (03:14:07 UTC del 19 de enero de 2038). . Intentar incrementar al segundo siguiente (03:14:08) hará que el número entero se desborde , estableciendo su valor en −(2 31 ), que los sistemas interpretarán como 2 31 segundos antes de la época (20:45:52 UTC del 13 de diciembre). 1901). El problema es de naturaleza similar al problema del año 2000 . En 2106 se alcanzarán restricciones de almacenamiento análogas para enteros de 32 bits sin signo .

Los sistemas informáticos que utilizan el tiempo para cálculos críticos pueden encontrar errores fatales si no se aborda el problema del año 2038. Algunas aplicaciones que utilizan fechas futuras ya han encontrado el error. [4] [5] Los sistemas más vulnerables son aquellos que rara vez o nunca se actualizan, como los sistemas heredados e integrados . Para abordar el problema, muchos sistemas modernos se han actualizado para medir el tiempo Unix con números enteros de 64 bits con signo , lo que tardará 292 mil millones de años en desbordarse, aproximadamente 21 veces la edad estimada del universo .

Causa

Muchos sistemas informáticos miden la hora y la fecha como hora Unix , un estándar internacional para el cronometraje digital. El tiempo Unix se define como el número de segundos transcurridos desde las 00:00:00 UTC del 1 de enero de 1970 (un tiempo elegido arbitrariamente en función de la creación del primer sistema Unix ), que ha sido denominado la época Unix . [6]

Históricamente, el tiempo de Unix se ha codificado como un entero de 32 bits con signo , un tipo de datos compuesto por 32 dígitos binarios (bits) que representan un valor entero, donde "con signo" significa que el número puede representar números positivos y negativos, así como cero; y generalmente se almacena en formato complemento a dos . [a] Por lo tanto, un entero de 32 bits con signo solo puede representar valores enteros desde −(2 31 ) hasta 2 31  − 1 inclusive. En consecuencia, si se utiliza un entero de 32 bits con signo para almacenar la hora Unix, la última hora que se puede almacenar es 2 31 − 1 (2,147,483,647) segundos después de la época, que son las 03:14:07 del martes 19 de enero de 2038. [ 7] Los sistemas que intenten incrementar este valor en un segundo más a 2 31 segundos después de la época (03:14:08) sufrirán un desbordamiento de enteros , invirtiendo sin darse cuenta el bit de signo para indicar un número negativo. Esto cambia el valor entero a −(2 31 ), o 2 31 segundos antes de la época en lugar de después , lo que los sistemas interpretarán como 20:45:52 del viernes 13 de diciembre de 1901. A partir de aquí, los sistemas continuarán contando hacia arriba, hacia cero, y luego hacia arriba a través de los números enteros positivos nuevamente. Como muchos sistemas informáticos utilizan cálculos de tiempo para ejecutar funciones críticas, el error puede introducir errores fatales.

Sistemas vulnerables

Cualquier sistema que utilice estructuras de datos con representaciones de tiempo firmadas de 32 bits tiene un riesgo inherente de fallar. Es prácticamente imposible obtener una lista completa de estas estructuras de datos, pero existen estructuras de datos bien conocidas que tienen el problema del tiempo de Unix:

Sistemas embebidos

Los sistemas integrados que utilizan fechas para el cálculo o el registro de diagnóstico tienen más probabilidades de verse afectados por el problema Y2038. [1] A pesar de la moderna actualización generacional de 18 a 24 meses en la tecnología de sistemas informáticos , los sistemas integrados están diseñados para durar toda la vida útil de la máquina de la que forman parte. Es posible que algunos de estos sistemas todavía estén en uso en 2038. Puede resultar poco práctico o, en algunos casos, imposible actualizar el software que ejecuta estos sistemas y, en última instancia, requerir su reemplazo si se quieren corregir las limitaciones de 32 bits.

Muchos sistemas de transporte, desde aviones hasta automóviles, utilizan ampliamente sistemas integrados. En los sistemas automotrices, esto puede incluir el sistema de frenos antibloqueo (ABS), el control electrónico de estabilidad (ESC/ESP), el control de tracción (TCS) y la tracción automática en las cuatro ruedas ; Las aeronaves pueden utilizar sistemas de guía inercial y receptores GPS . [b] Otro uso importante de los sistemas integrados es en dispositivos de comunicaciones, incluidos teléfonos móviles y dispositivos con acceso a Internet (por ejemplo , enrutadores , puntos de acceso inalámbrico , cámaras IP ) que dependen del almacenamiento de una hora y fecha precisas y se basan cada vez más en sistemas tipo Unix. sistemas operativos. Por ejemplo, el problema Y2038 hace que algunos dispositivos con Android de 32 bits se bloqueen y no se reinicien cuando se cambia la hora a esa fecha. [8]

Sin embargo, esto no implica que todos los sistemas integrados sufrirán el problema Y2038, ya que muchos de estos sistemas no requieren acceso a las fechas. Para aquellos que lo hacen, aquellos sistemas que sólo rastrean la diferencia entre horas/fechas y no horas/fechas absolutas, por la naturaleza del cálculo, no experimentarán un problema importante. Este es el caso del diagnóstico de automóviles basado en normas legisladas como CARB ( Junta de Recursos del Aire de California ). [9]

Problemas tempranos

En mayo de 2006, surgieron informes de una manifestación temprana del problema Y2038 en el software AOLserver . El software fue diseñado con un error para manejar una solicitud de base de datos que "nunca" debería expirar. En lugar de abordar específicamente este caso especial, el diseño inicial simplemente especificaba una fecha de vencimiento arbitraria en el futuro. La configuración predeterminada para el servidor especificaba que la solicitud debería expirar después de mil millones de segundos. Mil millones de segundos (aproximadamente 32 años) después de las 01:27:28 UTC del 13 de mayo de 2006 superan la fecha límite de 2038. Por lo tanto, después de este tiempo, el cálculo del tiempo de espera se desbordó y devolvió una fecha que en realidad era pasada, lo que provocó que el software fallara. Cuando se descubrió el problema, los operadores de AOLServer tuvieron que editar el archivo de configuración y establecer el tiempo de espera en un valor más bajo. [4] [5]

Soluciones

No existe una solución universal para el problema del año 2038. Por ejemplo, en el lenguaje C , cualquier cambio en la definición del time_ttipo de datos daría lugar a problemas de compatibilidad de código en cualquier aplicación en la que las representaciones de fecha y hora dependan de la naturaleza del time_tentero de 32 bits con signo. Por ejemplo, cambiar time_ta un entero de 32 bits sin signo, que ampliaría el rango a 2106 [10] (específicamente, 06:28:15 UTC del domingo 7 de febrero de 2106), afectaría negativamente a los programas que almacenan, recuperan o manipulan fechas anteriores a 1970, ya que dichas fechas están representadas por números negativos. Aumentar el tamaño del time_ttipo a 64 bits en un sistema existente provocaría cambios incompatibles en el diseño de las estructuras y la interfaz binaria de las funciones.

La mayoría de los sistemas operativos diseñados para ejecutarse en hardware de 64 bits ya utilizan enteros de 64 bits con signo time_t. El uso de un valor de 64 bits con signo introduce una nueva fecha envolvente que es más de veinte veces mayor que la edad estimada del universo : aproximadamente 292 mil millones de años a partir de ahora. [11] La capacidad de realizar cálculos sobre fechas está limitada por el hecho de que tm_yearse utiliza un valor entero de 32 bits con signo que comienza en 1900 para el año. Esto limita el año a un máximo de 2.147.485.547 (2.147.483.647 + 1900). [12]

Se han hecho propuestas alternativas (algunas de las cuales ya están en uso), como almacenar milisegundos o microsegundos desde una época (normalmente el 1 de enero de 1970 o el 1 de enero de 2000) en un entero de 64 bits con signo, proporcionando un rango mínimo de 300.000 años con una resolución de microsegundos. [13] [14] En particular, el uso que hace Java de enteros largos de 64 bits en todas partes para representar el tiempo como "milisegundos desde el 1 de enero de 1970" funcionará correctamente durante los próximos 292 millones de años. Otras propuestas de nuevas representaciones del tiempo proporcionan diferentes precisiones, rangos y tamaños (casi siempre superiores a 32 bits), además de resolver otros problemas relacionados, como el manejo de los segundos intercalares . En particular, TAI64 [15] es una implementación del estándar de Tiempo Atómico Internacional (TAI), el estándar internacional actual en tiempo real para definir un segundo y un marco de referencia.

Soluciones implementadas

Ver también

Notas

  1. ^ A menos que se especifique lo contrario, todos los números proporcionados en este artículo se han obtenido utilizando el complemento a dos para la aritmética de enteros con signo.
  2. ^ El GPS sufre su propio problema de desbordamiento del contador de tiempo conocido como Rollover del número de semana del GPS .

Referencias

  1. ^ ab "¿Es el problema del año 2038 el nuevo error del año 2000?". El guardián . 17 de diciembre de 2014 . Consultado el 11 de octubre de 2018 .
  2. ^ Bergmann, Arnd (6 de febrero de 2020). "El fin de una era". Linaro.
  3. ^ Wagenseil, Paul (28 de julio de 2017). "La 'Epocalipsis' digital podría detener el mundo". Guía de Tom .
  4. ^ ab "El futuro está por delante". 28 de junio de 2006 . Consultado el 19 de noviembre de 2006 .
  5. ^ ab Extraño problema de "pérdida de memoria" en AOLserver 3.4.2/3.x 12 de mayo de 2006
  6. ^ "Época del tiempo". unixtutoria . 15 de marzo de 2019 . Consultado el 13 de abril de 2023 .
  7. ^ Diomidis Spinellis (2006). Calidad del código: la perspectiva del código abierto. Serie de desarrollo de software eficaz en Safari Books Online (edición ilustrada). AdobePrensa . pag. 49.ISBN 978-0-321-16607-4.
  8. ^ "ZTE Blade con Android 2.2 tiene 2038 problemas" . Consultado el 20 de noviembre de 2018 .
  9. ^ "Métodos/procedimientos de prueba ARB". ARB.ca.gov . Junta de Recursos del Aire de California . Archivado desde el original el 18 de noviembre de 2016 . Consultado el 12 de septiembre de 2013 .
  10. ^ "BORRADOR: Diseño de prueba Y2038" . Consultado el 25 de mayo de 2024 .
  11. ^ "¿Cuándo termina realmente el tiempo de Unix de 64 bits?" . Consultado el 24 de septiembre de 2022 .
  12. ^ Fieltros, Bob (17 de abril de 2010). "El fin de los tiempos". Stablecross.com . Consultado el 19 de marzo de 2012 .
  13. ^ "Tiempo ununinio". Archivado desde el original el 8 de abril de 2006 . Consultado el 19 de noviembre de 2006 .
  14. ^ Microsistemas solares. "Documentación de la API de Java para System.currentTimeMillis()" . Consultado el 29 de septiembre de 2017 .
  15. ^ "TAI64".
  16. ^ "Se lanza Ruby 1.9.2". 18 de agosto de 2010 . Consultado el 1 de abril de 2022 .
  17. ^ "time.c: utilice aritmética de 64 bits incluso en plataformas con VALOR de 32 bits". GitHub .
  18. ^ "Anuncio de NetBSD 6.0". 17 de octubre de 2012 . Consultado el 18 de enero de 2016 .
  19. ^ "Lanzamiento de OpenBSD 5.5 (1 de mayo de 2014)". 1 de mayo de 2014 . Consultado el 18 de enero de 2016 .
  20. ^ ab Jonathan Corbet (14 de agosto de 2013). "Reflexionando sobre 2038". LWN.net . Archivado desde el original el 4 de marzo de 2016 . Consultado el 9 de marzo de 2016 .
  21. ^ "LKML: Arnd Bergmann: [GIT PULL] y2038: cambios en el núcleo, el controlador y el sistema de archivos". lkml.org . Consultado el 30 de enero de 2020 .
  22. ^ O'Donell, Carlos (2 de agosto de 2021). "La versión 2.34 de la biblioteca GNU C ya está disponible". Software de origen . Consultado el 30 de abril de 2024 .
  23. ^ "arco". www.freebsd.org .
  24. ^ Haynes, Thomas; Noveck, David, eds. (Marzo de 2015). "Tipos de datos estructurados". Protocolo del sistema de archivos de red (NFS) versión 4. segundo. 2.2. doi : 10.17487/RFC7530 . RFC 7530.
  25. ^ Staubach, Peter; Pawlowski, Brian; Callaghan, Brent (junio de 1995). "Especificación del protocolo NFS versión 3" . Consultado el 25 de mayo de 2024 .
  26. ^ "Algoritmos y estructuras de datos ext4" . Consultado el 13 de septiembre de 2022 .
  27. ^ Michael Larabel (15 de octubre de 2020). "El sistema de archivos XFS con Linux 5.10 lleva el problema del año 2038 al año 2486". Forónix . Consultado el 13 de septiembre de 2022 .
  28. ^ "¿Por qué el miércoles 17 de noviembre de 1858 es la hora base para OpenVMS (VAX VMS)?". Universidad Stanford . 24 de julio de 1997. Archivado desde el original el 24 de julio de 1997 . Consultado el 8 de enero de 2020 .
  29. ^ "Manual de referencia de la biblioteca VSI C Run-Time para sistemas OpenVMS" (PDF) . VSI. Noviembre de 2020. Archivado desde el original (PDF) el 17 de abril de 2021 . Consultado el 17 de abril de 2021 .
  30. ^ "OpenVMS y el año 2038". HP . Consultado el 17 de abril de 2021 .
  31. ^ "PostgreSQL versión 7.2". Enero de 2012 . Consultado el 25 de abril de 2024 .
  32. ^ "Novedades de MySQL 8.0". dev.mysql.com .
  33. ^ "Cambios en MySQL 8.0.28 (18 de enero de 2022, disponibilidad general)". dev.mysql.com .
  34. ^ "Errores de MySQL: n.º 12654: la marca de tiempo Unix de 64 bits no es compatible con las funciones de MySQL". bugs.mysql.com .

enlaces externos