stringtranslate.com

Problema del año 2038

Una animación 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 , superbug Y2K38 o Epocalipsis [2] [3] ) es un problema de cálculo del tiempo que deja a algunos sistemas informáticos incapaces de representar horas posteriores a las 03:14:07 UTC del 19 de enero de 2038.

El problema existe en sistemas que miden el tiempo Unix (la cantidad de segundos transcurridos desde la época Unix (00:00:00 UTC del 1 de enero de 1970)) y lo almacenan en un entero con signo de 32 bits . El tipo de datos solo es capaz de representar números enteros entre −(2 31 ) y 2 31  − 1 , lo que significa que el último tiempo 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 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 de 1901). El problema es de naturaleza similar al problema del año 2000 , con la diferencia de que el problema del año 2000 tenía que ver con números de base 10 , mientras que el problema del año 2038 involucra números de base 2 .

Se alcanzarán restricciones de almacenamiento análogas en 2106 , donde los sistemas que almacenan la hora Unix como un entero de 32 bits sin signo (en lugar de con signo) se desbordarán el 7 de febrero de 2106 a las 06:28:15 UTC.

Los sistemas informáticos que utilizan el tiempo para cálculos críticos pueden encontrar errores fatales si no se soluciona 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 se actualizan con poca frecuencia o nunca, como los sistemas heredados y embebidos . Los sistemas modernos y las actualizaciones de software de los sistemas heredados solucionan este problema utilizando números enteros con signo de 64 bits en lugar de números enteros de 32 bits, que tardarán 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 utilizando el tiempo 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 se ha denominado la época Unix . [6]

Históricamente, el tiempo Unix se ha codificado como un entero con signo de 32 bits , 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 el cero; y generalmente se almacena en formato de complemento a dos . [a] Por lo tanto, un entero con signo de 32 bits solo puede representar valores enteros de −(2 31 ) a 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 epoch, que es 03:14:07 del martes 19 de enero de 2038. [7] Los sistemas que intenten incrementar este valor en un segundo más hasta 2 31 segundos después de epoch (03:14:08) sufrirán un desbordamiento de entero , invirtiendo inadvertidamente el bit de signo para indicar un número negativo. Esto cambia el valor entero a −(2 31 ), o 2 31 segundos antes de epoch en lugar de después , que los sistemas interpretarán como 20:45:52 del viernes 13 de diciembre de 1901. A partir de aquí, los sistemas seguirán contando hacia arriba, hacia cero, y luego hacia arriba a través de los enteros positivos nuevamente. Como muchos sistemas informáticos utilizan cálculos de tiempo para ejecutar funciones críticas, el error puede introducir problemas graves.

Sistemas vulnerables

Cualquier sistema que utilice estructuras de datos con representaciones de tiempo de 32 bits con signo 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 presentan el problema de tiempo de Unix:

Sistemas embebidos

Los sistemas integrados que utilizan fechas para el cálculo o el registro de diagnóstico son los más propensos a verse afectados por el problema Y2038. [1] A pesar de la actualización generacional moderna 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 en la que son un componente. Es concebible que algunos de estos sistemas todavía puedan estar en uso en 2038. Puede resultar poco práctico o, en algunos casos, imposible actualizar el software que ejecuta estos sistemas, lo que en última instancia requerirá su reemplazo si se quieren corregir las limitaciones de 32 bits.

Muchos sistemas de transporte, desde los aviones hasta los 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 a las cuatro ruedas automática ; las aeronaves pueden utilizar sistemas de guía inercial y receptores GPS . [b] Otro uso importante de los sistemas integrados es en los dispositivos de comunicaciones, incluidos los teléfonos celulares y los dispositivos habilitados para Internet (por ejemplo, enrutadores , puntos de acceso inalámbricos , cámaras IP ) que dependen del almacenamiento de una hora y fecha precisas y se basan cada vez más en sistemas operativos tipo Unix. Por ejemplo, el problema Y2038 hace que algunos dispositivos que ejecutan 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 fechas. En el caso de los que sí lo requieren, aquellos sistemas que solo 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 de los diagnósticos automotrices basados ​​en estándares legislados como CARB ( California Air Resources Board ). [9]

Problemas iniciales

En mayo de 2006, aparecieron informes de una manifestación temprana del problema Y2038 en el software AOLserver . El software fue diseñado con un truco para manejar una solicitud de base de datos que "nunca" debería caducar. En lugar de manejar específicamente este caso especial, el diseño inicial simplemente especificó una fecha de caducidad arbitraria en el futuro con una configuración predeterminada que especificaba que las solicitudes deberían caducar después de un máximo de mil millones de segundos. Sin embargo, mil millones de segundos antes de la fecha límite de 2038 son las 01:27:28 UTC del 13 de mayo de 2006, por lo que las solicitudes enviadas después de esta hora darían como resultado una fecha de caducidad que está más allá de la fecha límite. Esto hizo que los cálculos de caducidad se desbordaran y devolvieran fechas que en realidad estaban en el pasado, 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 caducidad en un valor menor. [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 generarí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, lo que ampliaría el rango hasta 2106 [10] (específicamente, las 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 se representan con 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 funcionar en hardwaretime_t de 64 bits ya utilizan números enteros de 64 bits con signo . El uso de un valor de 64 bits con signo introduce una nueva fecha de cierre 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 con signo de 64 bits, proporcionando un rango mínimo de 300.000 años con una resolución de microsegundos. [13] [14] En particular, el uso de 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 para nuevas representaciones del tiempo proporcionan diferentes precisiones, rangos y tamaños (casi siempre más amplios que 32 bits), además de resolver otros problemas relacionados, como el manejo de 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

Véase también

Notas

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

Referencias

  1. ^ ab "¿Es el problema del año 2038 el nuevo error Y2K?". The Guardian . 17 de diciembre de 2014. Archivado desde el original el 25 de enero de 2022. Consultado el 11 de octubre de 2018 .
  2. ^ Bergmann, Arnd (6 de febrero de 2020). «El fin de una era». Linaro. Archivado desde el original el 7 de febrero de 2020. Consultado el 13 de septiembre de 2020 .
  3. ^ Wagenseil, Paul (28 de julio de 2017). «La 'épocalipsis' digital podría paralizar por completo el mundo». Tom's Guide . Archivado desde el original el 29 de noviembre de 2021. Consultado el 13 de septiembre de 2020 .
  4. ^ ab "El futuro está por delante". 28 de junio de 2006. Archivado desde el original el 28 de noviembre de 2006 . Consultado el 19 de noviembre de 2006 .
  5. ^ ab Problema extraño de "pérdida de memoria" en AOLserver 3.4.2/3.x Archivado el 4 de enero de 2010 en Wayback Machine 12 de mayo de 2006
  6. ^ "Epoch Time". unixtutoria . 15 de marzo de 2019. Archivado desde el original el 13 de abril de 2023 . 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). Adobe Press . p. 49. ISBN 978-0-321-16607-4.
  8. ^ "ZTE Blade con Android 2.2 tiene 2038 problemas". Archivado desde el original el 19 de mayo de 2022. Consultado el 20 de noviembre de 2018 .
  9. ^ "Métodos y procedimientos de prueba de la 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". Archivado desde el original el 21 de septiembre de 2019. Consultado el 25 de mayo de 2024 .
  11. ^ "¿Cuándo termina realmente el time_t de Unix de 64 bits?". Archivado desde el original el 23 de septiembre de 2022. Consultado el 24 de septiembre de 2022 .
  12. ^ Felts, Bob (17 de abril de 2010). "El fin del tiempo". Stablecross.com . Archivado desde el original el 11 de octubre de 2012. Consultado el 19 de marzo de 2012 .
  13. ^ "Unununium Time". Archivado desde el original el 8 de abril de 2006. Consultado el 19 de noviembre de 2006 .
  14. ^ Sun Microsystems. «Documentación de la API de Java para System.currentTimeMillis()». Archivado desde el original el 30 de septiembre de 2017. Consultado el 29 de septiembre de 2017 .
  15. ^ "TAI64". Archivado desde el original el 26 de septiembre de 2012 . Consultado el 4 de septiembre de 2012 .
  16. ^ "Se lanza Ruby 1.9.2". 18 de agosto de 2010. Archivado desde el original el 8 de abril de 2022. Consultado el 1 de abril de 2022 .
  17. ^ "time.c: usa aritmética de 64 bits incluso en plataformas con VALUE de 32 bits". GitHub . Archivado desde el original el 3 de noviembre de 2023 . Consultado el 3 de noviembre de 2023 .
  18. ^ "Anuncio de NetBSD 6.0". 17 de octubre de 2012. Archivado desde el original el 15 de enero de 2016 . Consultado el 18 de enero de 2016 .
  19. ^ "OpenBSD 5.5 publicado (1 de mayo de 2014)". 1 de mayo de 2014. Archivado desde el original el 22 de diciembre de 2015 . Consultado el 18 de enero de 2016 .
  20. ^ por Jonathan Corbet (14 de agosto de 2013). "Pondering 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, los controladores y el sistema de archivos". lkml.org . Archivado desde el original el 14 de febrero de 2020. 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». Sourceware . Archivado desde el original el 30 de abril de 2024 . Consultado el 30 de abril de 2024 .
  23. ^ "arch". www.freebsd.org . Archivado desde el original el 26 de septiembre de 2018 . Consultado el 26 de septiembre de 2018 .
  24. ^ Haynes, Thomas; Noveck, David, eds. (marzo de 2015). "Tipos de datos estructurados". Protocolo de Network File System (NFS) versión 4. sec. 2.2. doi : 10.17487/RFC7530 . RFC 7530.
  25. ^ Staubach, Peter; Pawlowski, Brian; Callaghan, Brent (junio de 1995). «NFS Version 3 Protocol Specification» (Especificación del protocolo NFS versión 3) . Consultado el 25 de mayo de 2024 .
  26. ^ "Estructuras de datos y algoritmos ext4". Archivado desde el original el 13 de septiembre de 2022 . Consultado el 13 de septiembre de 2022 .
  27. ^ Michael Larabel (15 de octubre de 2020). «El sistema de archivos XFS con Linux 5.10 traslada el problema del año 2038 al año 2486». Phoronix . Archivado desde el original el 13 de septiembre de 2022 . 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 de 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 de tiempo de ejecución de C de VSI 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. Archivado desde el original el 17 de abril de 2021. Consultado el 17 de abril de 2021 .
  31. ^ "PostgreSQL Release 7.2". Enero de 2012. Archivado desde el original el 26 de abril de 2024. Consultado el 25 de abril de 2024 .
  32. ^ "Novedades en MySQL 8.0". dev.mysql.com .
  33. ^ "Cambios en MySQL 8.0.28 (18 de enero de 2022, disponibilidad general)". dev.mysql.com . Archivado desde el original el 8 de diciembre de 2023 . Consultado el 14 de mayo de 2024 .
  34. ^ "MySQL Bugs: #12654: la marca de tiempo de Unix de 64 bits no es compatible con las funciones MySQL". bugs.mysql.com . Archivado desde el original el 29 de marzo de 2017 . Consultado el 28 de marzo de 2017 .
  35. ^ "Notas de la versión de MariaDB 11.5.1".
  36. ^ "Historial de cambios de Microsoft C/C++ 2003 - 2015". learn.microsoft.com . 25 de mayo de 2023 . Consultado el 13 de agosto de 2024 .
  37. ^ "Ya era hora: aplicaciones Win32". learn.microsoft.com . 7 de enero de 2021 . Consultado el 13 de agosto de 2024 .

Enlaces externos