Problema no ano 2038 [fechado]


Respostas:


17

Eu encontrei esse problema em um sistema Linux incorporado que precisava lidar com datas anteriores a 2038 em alguns certificados criptográficos de longo prazo, então eu diria que a similaridade disso depende do domínio do seu aplicativo.

Embora a maioria dos sistemas deva estar pronta bem antes de 2038, se você se encontra hoje calculando datas para o futuro, pode ter um problema.


Um bom! Eu não pensei nesse exemplo! O que o padrão PKI usa como sintaxe de tempo nos certificados? Eu nunca olhei!
geoffc

@geoffc, Na verdade, era um formato proprietário e tinha suas estruturas internas de data / hora, que eram grandes o suficiente para caber em datas anteriores a 2038, mas usava funções GLIBC para conversão de data / hora. Se bem me lembro, a mktimechamada falhou silenciosamente.
Alex B

13

Penso que este será um problema significativo, muito mais pernicioso do que os problemas do ano 2000/2000, porque o código afetado é geralmente de nível inferior (é CTIME) e, portanto, é mais difícil identificar locais onde o tempo está sendo armazenado dessa maneira.

Para complicar ainda mais as coisas, o fato de o Y2K ser considerado um bebê úmido tornará mais difícil chamar a atenção para o problema no período que antecede o evento.

Referências culturais:

Cory Doctorow estava experimentando um novo modelo para o comissionamento / publicação de histórias curtas sob licenças abertas, e eu sugeri um tema para 2038 para um deles, o que ele fez brilhantemente na época: http://craphound.com/?p=2337


Falando como alguém que estava trabalhando na questão na época, o Y2K fracassou por causa de muito trabalho e planejamento de antemão. A percepção úmida do nascimento de bebês foi reforçada por todos os exagerados palavrões da mídia. Espero que haja muito planejamento e trabalho a partir de 2035, mas se tivermos sorte, sentiremos falta da blitz da mídia.
David Thornley

Felicidades para o link Mark.
22411 Boehj

9

Alguns anos atrás, já havia relatos de problemas, em áreas como programas de hipotecas que calculavam empréstimos de 30 anos: 2008 + 30 = 2038.


8

Um sistema operacional de 64 bits é irrelevante para o problema de 2037. (O CTIME termina mais próximo de 2037 do que 2038).

A questão não é a profundidade de bits do sistema operacional, mas como o sistema operacional armazena o tempo. Ou como a coluna do banco de dados escolhe armazenar tempo. Ou como esse atributo de sintaxe de tempo dos serviços de diretório armazena o tempo no backend.

Esse é um problema muito maior do que as pessoas pensam, pois é muito endêmico e comum o uso de contadores de tempo de 32 bits.

Cada instância que armazena tempo precisa ser revisada, e todas as APIs atualizadas e todas as ferramentas que a utilizam também são atualizadas.

As camadas de abstração que permitem definir a hora através de um formato de hora legível por humanos, em vez dos dados brutos gravados, facilitam, mas esse é apenas um caso.

Eu suspeito que isso vai ser um negócio muito maior do que a maioria das pessoas pensa.


1
O maior problema que vejo são formatos e arquivos de arquivo. No entanto, o período para ext4 é 2514, vfat é 2107. O problema é com reiserfs (2038).
Maciej Piechotka

O ReiserFS também tem outros problemas. Eu ainda acho que há muito mais lugares escondidos do que as pessoas pensam naquele tempo de loja no CTIME. É um formato de hora fácil e útil. Obviamente, o CTIME não assinado não tem o problema 2037. Eu acho que é o caso do carimbo de data / hora 2107.
geoffc

1
Você está pensando no Apple HFS. O FAT não usa time_tnada. Ele armazena ano, mês e dia como campos em um valor de 16 bits: 5 bits por dia, 4 por mês, deixando 7 por ano. 2107 é 1980 (ano zero em terras FAT) + 2 ^ 7-1. Para mais diversão, o FAT armazena a hora do dia da mesma maneira em outro valor de 16 bits, mas se você fizer as contas, precisará de 17 bits para armazenar a hora do dia dessa maneira. O FAT contorna isso deixando cair um pouco de resolução por segundos; O FAT não pode distinguir alterações com menos de 2 segundos de diferença. Ah, Microsoft, que mundo chato seria esse sem suas incompatibilidades desnecessárias!
21811 Warren Young

8

Esta é minha opinião, mas esse problema é devido a um problema de contador de 32 bits, hoje a maioria dos sistemas operacionais é atualizada para lidar com o tempo em 64 bits (pelo menos em computadores de 64 bits), então acho que todo o SO e software estará pronto por muito tempo. antes de 2038, digamos 2020. Portanto, você poderá ter problemas apenas se, em 2038, continuar executando o software a partir de 2020.
Provavelmente não será um problema em quase todos os casos. Eu espero.


Eu tentei a versão de 32 bits do Ubuntu e ele mostrou problemas de 2038, mas a versão de 64 bits do Ubuntu não mostrou sinais de problema de 2038. Eu não tentei outros Unixes.
Jimmy Hedman

Sim, na maioria das versões de 32 bits, você verá o problema, mas não na versão de 64 bits. Você pode esperar não ter mais nenhum sistema operacional de 32 bits em 2038.
raio

2
Esta é uma suposição ridícula. Ainda usamos microprocessadores de 16 (e até 8 bits) no mundo de hoje, o que significa dizer que os microprocessadores de 32 bits desaparecerão magicamente no futuro? É justo dizer que isso não afetará o usuário médio, mas, em casos extremos, pode continuar a ser um problema.
Eli Frey

Bem - os computadores de 16 e 8 bits podem 1. mover a data 0 (de 01-01-2009 para, por exemplo, 01-01-2010) - no entanto, isso violaria certas convenções API / ABI 2. estender o campo do timer ( que podem, em certos casos, quebrar 'apenas' a ABI).
Maciej Piechotka 18/08/10

1

Não é grande coisa.

Durante a primeira blitz Y2K, na qual os fornecedores de software e hardware eram obrigados a certificar seus produtos como "compatíveis com Y2K" para serem vendidos (lembro-me de que os cabos de rede no PC Connection eram certificados como compatíveis com Y2K) muitas empresas fizeram auditorias detalhadas de tudo , definindo relógios no futuro e testando.

Na época, como o custo dos testes era muito alto, eles quase sempre eram testados com várias datas, como 1/1/99 (alguns desenvolvedores podem ter usado 99 como sentinal), 31/12/99, 1/1 / 1 / 00, o salto de 2000, 19/1/38, e muitos outros. Veja aqui uma lista tediosa.

Portanto, acredito que qualquer software importante que existia em 1999 provavelmente não terá 2038 erros, mas um novo software escrito desde então por programadores ignorantes. Depois que todo o programa de debacle do Y2K geralmente ficou muito mais ciente dos problemas de codificação de datas, é improvável que tenha um impacto tão grande quanto o Y2K (o que, por si só, era um anticlímax).


Exceto que esse problema é causado pelo tipo time_t do UNIX ser de 32 bits.
Yuhong Bao

1

Os sistemas de 32 bits ainda em execução até então serão um problema.


2
Você poderia elaborar isso, para deixar mais claro o que exatamente se torna o problema e como reagir a isso?
Anthon

O problema é com o número inteiro de 32 bits usado para calcular o tempo. O tempo é medido no número de segundos decorridos desde 01 de janeiro de 1970. Por exemplo, depois de um dia, esse contador será 86400. Portanto, em 2038, esse valor excederá, pois manterá um valor maior que o número que pode ser mantido em um inteiro de 32 bits não assinado. Um sistema de 64 bits usando 64 bits para o timestamp não terá este problema, uma vez que será capaz de trabalhar até 15:30:08 no domingo, 4 de dezembro 292,277,026,596 (292 mil milhões de anos)
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));
}

deve ser 1 em vez de 9, mas o ctime não lida com datas maiores:

8 - Sun Jun 13 07:26:08 1141709097

O tempo do meu sistema (64 bits, é claro) pode demorar até 1 milhão de anos a mais. A solução é atualizar os sistemas para 64 bits.

O problema é que os programas podem não lidar com isso. Especialmente antigo, proprietário e não mantido. Os desenvolvedores estão acostumados aos seguintes fatos:

  • intsão 32 bits (na verdade, eles são preservados como 32 bits em sistemas de 64 bits, entre outros porque se supunha que eles sempre fossem 32 bits)
  • A maioria dos tipos (como time_t) pode ser transmitida com segurança emint

No popular software FLOSS, ambas as coisas provavelmente não passarão pela revisão de 'muitos olhos'. Em menos popular e apropriado, dependerá amplamente do autor.

Eu acho que no mundo free * nix o 2038 passará despercebido enquanto espero problemas em plataformas "proprietárias" (ou seja, aquelas com grande número de softwares proprietários) - especialmente se parte da parte essencial não for mantida.


Não é o 'sistema' ou 'OS'. A maioria dos sistemas operacionais anteriores de 32 bits (até sistemas operacionais de 16 bits) poderia fazer cálculos de 64 bits. A profundidade de 64 bits no nível do sistema operacional é basicamente uma referência ao modelo de memória, não à capacidade de fazer contas. E o tempo é tudo sobre matemática.
geoffc

Sim e não. É verdade que o SO de 32 e 64 bits pode executar aritmética de 64 bits (você pode emular qualquer aritmética). No entanto time_t(ou equivalente) no sistema operacional de 32 bits possui 32 bits, enquanto time_t(ou equivalente) no sistema operacional de 64 bits possui 64 bits. Eu pensei que era suficientemente claro, mesmo com certa simplificação.
Maciej Piechotka 18/08/10

0

Se é algo como o Y2K, algumas pessoas já foram afetadas e estão mudando o software, mas a maioria dos desenvolvedores o ignorará até algum momento da década de 2030, provavelmente 2035, quando então haverá muito trabalho e alguém com idade suficiente. conhecer a K&R C e ainda não muito senil poderá repentinamente contratar muito dinheiro. A transição real mostrará muitas coisas ainda não feitas, provavelmente nenhuma tão importante.


-5

O problema do ano 2000 era de duas cartas representando o ano em vez de quatro.

Muitos sistemas não tinham como distinguir entre 2000 e 1900, pois apenas armazenavam o '00'.

Quase todos os sistemas agora usam 4 caracteres para armazenar o ano ou usam algum tipo de biblioteca.

Então, vamos todos se preocupar com o ano 10000 (Y10K). Exceto pelos escritores do SO e da Biblioteca ...


Provavelmente ninguém (praticamente ninguém) está armazenando a data com esse formato (isto é, DCD ou string) agora. O tempo geralmente é manipulado por objetos ou ints (portanto, apenas o código de exibição precisa ser atualizado).
Maciej Piechotka

Sim, meu ponto exatamente. O Y2K eliminou efetivamente a idéia de representar datas como cadeias de comprimento fixo.
Stephen Jazdzewski

@ Stephen: Não no mundo COBOL, mas felizmente existem poucas implementações COBOL no Unix / Linux.
David Thornley

@ David: Os programas COBOL eram o problema do ano 2000, em grande parte. Os sistemas Linux / Unix, do ponto de vista dos usuários, já tiveram um problema no Y2K? A resposta simples para a pergunta original é não.
Stephen Jazdzewski

4
O pôster não está perguntando sobre o problema do y2k; eles estão perguntando sobre o problema do y2k38, que é uma fera totalmente diferente. Verifique en.wikipedia.org/wiki/Y2K38 para obter uma descrição.
Kevin M
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.