Problema del año 2038 [cerrado]


Respuestas:


17

He encontrado este problema en un sistema Linux incorporado que necesitaba manejar fechas posteriores a 2038 en algunos certificados criptográficos a largo plazo, por lo que diría que la similitud de esto depende del dominio de su aplicación.

Si bien la mayoría de los sistemas deberían estar listos mucho antes de 2038, si hoy te encuentras calculando fechas en el futuro, es posible que tengas un problema.


Bueno uno! ¡No pensé en ese ejemplo! ¿Qué usa el estándar PKI como sintaxis de tiempo dentro de los certificados? Nunca he mirado!
geoffc

@geoffc, en realidad era un formato patentado y tenía sus estructuras internas de fecha / hora, que eran lo suficientemente grandes como para ajustarse a fechas posteriores a 2038, pero usaba funciones GLIBC para la conversión de fecha / hora. Si recuerdo correctamente, la mktimellamada estaba fallando silenciosamente.
Alex B

13

Creo que este será un problema importante, mucho más pernicioso que los problemas del año 2000 de 1999/2000 porque el código afectado generalmente es de nivel inferior (es CTIME) y, por lo tanto, es más difícil detectar lugares donde se almacena el tiempo de esa manera.

Para complicar aún más las cosas, el hecho de que se percibiera que Y2K era un squib húmedo hará que sea más difícil llamar la atención sobre el problema en el período previo al evento.

Referencias culturales:

Cory Doctorow estaba probando un nuevo modelo para la puesta en marcha / publicación de historias cortas bajo licencias abiertas, y le sugerí un tema de 2038 para uno de ellos, lo que hizo brillantemente en Época: http://craphound.com/?p=2337


Hablando como alguien que estaba trabajando en el tema en ese momento, Y2K fracasó debido a mucho trabajo y planificación de antemano. La percepción del squib húmedo se vio reforzada por todos los exagerados exageraciones en los medios. Espero que haya mucha planificación y trabajo a partir de 2035 más o menos, pero si tenemos suerte, nos perderemos el bombardeo mediático.
David Thornley

Saludos por el enlace Mark.
boehj

9

Hace unos años, ya había informes de problemas, en áreas como programas hipotecarios que hacen cálculos de préstamos a 30 años: 2008 + 30 = 2038.


8

Un sistema operativo de 64 bits es irrelevante para el problema 2037. (CTIME se agota más cerca de 2037 que de 2038).

La pregunta no es la profundidad de bits del sistema operativo, sino cómo almacena el tiempo el sistema operativo. ¿O cómo elige la columna de la base de datos almacenar tiempo? ¿O cómo este directorio mantiene el tiempo de almacenamiento del atributo de sintaxis de tiempo en el back-end?

Este es un problema mucho más grande de lo que la gente piensa, ya que es tan endémico y común haber usado contadores de tiempo de 32 bits.

Cada instancia que almacena tiempo necesita ser revisada, y todas las API actualizadas, y todas las herramientas que lo usan actualizadas también.

Las capas de abstracción que le permiten establecer la hora a través de un formato de hora legible por el ser humano, en lugar de los datos en bruto escritos lo hacen más fácil, pero ese es solo un caso.

Sospecho que esto va a ser mucho más grande de lo que la mayoría de la gente piensa.


1
El mayor problema que veo son los formatos de archivo y los archivos de sistema. Sin embargo, el rango de fechas para ext4 es 2514, vfat es 2107. El problema es con reiserfs (2038).
Maciej Piechotka

ReiserFS también tiene otros problemas. Todavía creo que hay muchos más lugares ocultos de lo que la gente piensa de ese tiempo de tienda en CTIME. Es un formato de tiempo muy fácil y útil. Por supuesto, CTIME sin firmar no tiene el problema 2037. Creo que ese es el caso de la marca de tiempo 2107.
geoffc

1
Estás pensando en Apple HFS. FAT no usa time_ten absoluto. Almacena año, mes y día como campos en un valor de 16 bits: 5 bits por día, 4 por mes, dejando 7 por año. 2107 es 1980 (año cero en tierra FAT) + 2 ^ 7-1. Para mayor diversión, FAT almacena la hora del día de la misma manera en otro valor de 16 bits, pero si hace los cálculos, encontrará que necesita 17 bits para almacenar la hora del día de esta manera. FAT evita esto dejando caer un bit de resolución por segundos; FAT no puede distinguir los cambios con menos de 2 segundos de diferencia. ¡Ah, Microsoft, qué mundo tan aburrido sería sin tus innecesarias incompatibilidades!
Warren Young

8

Esta es mi opinión, pero este problema se debe a un problema de contador de 32 bits, hoy la mayoría de los sistemas operativos se actualizan para manejar el tiempo en 64 bits (al menos en computadoras de 64 bits), por lo que supongo que todo el sistema operativo y el software estarán listos por mucho tiempo antes de 2038, digamos 2020. Por lo tanto, es posible que solo tenga problemas si en 2038 seguirá ejecutando software a partir de 2020.
Probablemente no sea un problema en casi todos los casos. Espero.


Probé la versión de 32 bits de Ubuntu y mostró problemas de 2038, pero ejecutar la versión de 64 bits de Ubuntu no mostró signos de problema de 2038. No he probado ningún otro Unixes.
Jimmy Hedman

Sí, en la mayoría de las versiones de 32 bits verá el problema, pero no en la versión de 64 bits. Puede esperar no tener ningún sistema operativo de 32 bits en 2038.
radio

2
Esta es una suposición ridícula. Todavía usamos 16 (e incluso 8 bits) microprocesadores en el mundo de hoy, ¿qué quiere decir que los microprocesadores de 32 bits desaparecerán mágicamente en el futuro? Es justo decir que esto no afectará al usuario promedio, pero en casos extremos podría continuar siendo un problema.
Eli Frey

Bueno, las computadoras de 16 y 8 bits pueden 1. mover la fecha 0 (desde 1970-01-01 a, por ejemplo, 2010-01-01), sin embargo, rompería ciertas convenciones API / ABI 2. extender el campo del temporizador ( que en ciertos casos puede romper 'solo' ABI).
Maciej Piechotka

1

No es un gran problema.

Durante el primer bombardeo de Y2K, en el que se exigió a los proveedores de software y hardware que certificaran sus productos como "compatibles con Y2K" para poder venderlos (recuerdo que los cables de red en PC Connection estaban certificados como compatibles con Y2K) muchas empresas realizaron auditorías detalladas de todo , configurando relojes en el futuro y probando.

En ese momento, dado que el costo de las pruebas era tan alto, casi siempre probaban con varias fechas, como 1/1/99 (algunos desarrolladores pueden haber usado 99 como sentinal), 31/12/99, 1/1 / 00, el salto de 2000, 19/1/38, y muchos otros. Vea aquí para una lista tediosa.

Por lo tanto, creo que cualquier software importante que existiera en 1999 probablemente no tendrá 2038 errores, pero sí los nuevos programas escritos desde entonces por programadores ignorantes. Después de toda la debacle de Y2K, los programadores generalmente se hicieron mucho más conscientes de los problemas de codificación de fechas, por lo que es poco probable que tenga un impacto tan grande como el de Y2K (que, en sí mismo, fue algo anticlímax).


Excepto que este problema es causado por el tipo UNIX time_t que es de 32 bits.
Yuhong Bao

1

Los sistemas de 32 bits que todavía se ejecutan para entonces serán un problema


2
¿Podría dar más detalles al respecto para aclarar qué es exactamente el problema y cómo reaccionar ante eso?
Anthon

El problema es con el entero de 32 bits que se usa para calcular el tiempo. El tiempo se mide en número de segundos transcurridos desde el 01 de enero de 1970. Por ejemplo, después de un día, este contador estará en 86400. Por lo tanto, en 2038 este valor se desbordará, ya que mantendrá un valor que es mayor que el número que puede mantenerse en un entero de 32 bits sin signo. Un sistema de 64 bits que use 64 bits para la marca de tiempo no tendrá este problema, ya que podrá funcionar hasta las 15:30:08 del domingo 4 de diciembre de 292,277,026,596 (292 mil millones de años)
Rahul Kadukar

0
#include <time.h>
#include <stdio.h>

int main() {
  time_t t = (time_t)(1L << (sizeof(time_t)*8 - 9));
  printf("%d\n", sizeof(time_t));
}

debería ser 1 en lugar de 9 pero ctime no maneja una fecha más grande:

8 - Sun Jun 13 07:26:08 1141709097

El tiempo de mi sistema (64 bits, por supuesto) puede funcionar incluso 1 millón de años más. La solución es actualizar los sistemas a 64 bits.

El problema es que los programas pueden no manejarlo. Especialmente antiguo, propiedad y no mantenido. Los desarrolladores están acostumbrados a los siguientes hechos:

  • intson de 32 bits (de hecho, se conservan como 32 bits en sistemas de 64 bits, entre otros porque se suponía que siempre son de 32 bits)
  • La mayoría de los tipos (como por ejemplo time_t) se pueden usar de forma seguraint

En el popular software FLOSS, ambas cosas probablemente no pasarán por la revisión de 'muchos ojos'. En menos popular y propietario dependerá en gran medida del autor.

Supongo que en el mundo libre * nix, el 2038 pasará desapercibido mientras espero problemas en las plataformas "propietarias" (es decir, aquellas con gran cantidad de software propietario), especialmente si parte de la parte crutial no se mantendrá.


No es el 'sistema' o el 'SO'. La mayoría de los sistemas operativos anteriores de 32 bits (incluso los sistemas operativos de 16 bits) podrían hacer operaciones matemáticas de 64 bits. La profundidad de 64 bits en el nivel del sistema operativo es básicamente una referencia al modelo de memoria, no a la capacidad para hacer matemáticas. Y el tiempo se trata de matemáticas.
geoffc

Si y no. Es cierto que el sistema operativo de 32 bits y 64 bits puede realizar operaciones aritméticas de 64 bits (puede emular cualquier aritmética). Sin embargo time_t(o equivalente) en el sistema operativo de 32 bits tiene 32 bits, mientras que time_t(o equivalente) en el sistema operativo de 64 bits tiene 64 bits. Pensé que era lo suficientemente claro, aunque con cierta simplificación.
Maciej Piechotka

0

Si se parece a Y2K, algunas personas ya se han visto afectadas y están cambiando el software, pero la mayoría de los desarrolladores lo ignorarán hasta algún momento en la década de 2030, probablemente en 2035, momento en el que habrá mucho trabajo hecho, y cualquiera con la edad suficiente saber K&R C y aún no demasiado senil de repente podrá contratar por mucho dinero. La transición real mostrará muchas cosas que aún no se han hecho, probablemente ninguna tan importante.


-5

El problema del año 2000 fueron dos cartas que representaban el año en lugar de cuatro.

Muchos sistemas no tenían forma de distinguir entre 2000 y 1900, ya que solo almacenaban el '00'.

Casi todos los sistemas ahora usan 4 caracteres para almacenar el año, o usan una biblioteca de algún tipo.

Entonces, preocupémonos por el año 10000 (Y10K). Excepto por los escritores del sistema operativo y de la biblioteca ...


Probablemente nadie (bueno, prácticamente nadie) está almacenando la fecha en ese formato (es decir, DCD o cadena) ahora. El tiempo generalmente es manejado por objetos o entradas (por lo que solo el código de visualización debería actualizarse).
Maciej Piechotka

Sí, mi punto exactamente. Y2K efectivamente eliminó la idea de representar fechas como cadenas de longitud fija.
Stephen Jazdzewski

@Stephen: No en el mundo de COBOL, pero afortunadamente hay pocas implementaciones de COBOL en Unix / Linux.
David Thornley

@David: los programas COBOL fueron el problema Y2K en su mayor parte. ¿Los sistemas Linux / Unix, desde el punto de vista de los usuarios, alguna vez tuvieron un problema Y2K? La respuesta simple a la pregunta original es no.
Stephen Jazdzewski

44
El póster no pregunta sobre el problema de y2k; están preguntando sobre el problema y2k38, que es una bestia completamente diferente. Consulte en.wikipedia.org/wiki/Y2K38 para obtener una descripción.
Kevin M
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.