Проблема 2038 года [закрыто]


28

Какова вероятность того, что проблема 2038 года будет очень проблематичной?


7
Я уже запасаю гранаты со слезоточивым газом и воду в бутылках! : P
Кевин Канту

Ответы:


17

Я столкнулся с этой проблемой во встроенной системе Linux, которая должна была обрабатывать даты после 2038 года в некоторых долгосрочных криптографических сертификатах, поэтому я бы сказал, что вероятность этого зависит от области вашего приложения.

Хотя большинство систем должно быть готово задолго до 2038 года, если вы сегодня рассчитываете даты в будущем, у вас могут возникнуть проблемы.


Хороший! Я не думал об этом примере! Что стандарт PKI использует в качестве синтаксиса времени внутри сертификатов? Я никогда не смотрел!
Geoffc

@geoffc, на самом деле это был проприетарный формат и имел свои внутренние структуры даты / времени, которые сами были достаточно большими, чтобы соответствовать датам после 2038 года, но в нем использовались функции GLIBC для преобразования даты / времени. Если я правильно помню, mktimeзвонок молчал.
Алекс Б

13

Я думаю, что это будет серьезной проблемой, гораздо более пагубной, чем проблемы 2000 года 1999/2000 года, потому что уязвимый код обычно является более низким уровнем (это CTIME), и поэтому труднее определить места, где время хранится таким образом.

Чтобы еще больше усложнить ситуацию, тот факт, что Y2K воспринимался как влажный болван, затруднит привлечение внимания к проблеме в преддверии события.

Культурные ссылки:

Кори Доктороу пробовал новую модель для ввода / публикации коротких рассказов под открытыми лицензиями, и я предложил тему 2038 года для одной из них, которую он блестяще сделал в эпоху: http://craphound.com/?p=2337


Говоря как кто-то, кто работал над проблемой в то время, Y2K потерпели неудачу из-за большой работы и планирования заранее. Восприятие сырой болтовни было подкреплено всеми преувеличенными высказываниями в СМИ. Я ожидаю, что с 2035 года будет много планирования и работы, но если нам повезет, мы пропустим блиц-репортажи.
Дэвид Торнли

Ура за ссылку марки.
Boehj

9

Несколько лет назад уже были сообщения о проблемах в таких областях, как ипотечные программы, производящие расчеты по 30-летним кредитам: 2008 + 30 = 2038.


8

64-битная ОС в конечном итоге не имеет отношения к проблеме 2037 года. (CTIME заканчивается ближе к 2037 году, чем к 2038 году).

Вопрос не в глубине операционной системы, а в том, как ОС хранит время. Или как столбец базы данных выбрать для хранения времени. Или как этот атрибут времени службы синтаксиса справочника хранит время на сервере.

Это гораздо более серьезная проблема, чем думают люди, поскольку она настолько распространена и распространена, что используются 32-битные счетчики времени.

Каждый экземпляр, который хранит время, необходимо пересмотреть, обновить все API и все инструменты, которые его используют.

Слои абстракции, которые позволяют вам устанавливать время в удобочитаемом формате времени вместо записанных необработанных данных, делают это проще, но это только один случай.

Я подозреваю, что это будет гораздо большее дело, чем думает большинство людей.


1
Самая большая проблема, которую я вижу, - это форматы файлов и файловые системы. Однако диапазон дат для ext4 - 2514, vfat - 2107. Проблема с reiserfs (2038).
Мацей Пехотка

У ReiserFS есть и другие проблемы. Я все еще думаю, что есть гораздо больше скрытых мест, чем люди думают о том времени магазина в CTIME. Это чертовски простой и полезный формат времени. Конечно, без знака CTIME не имеет проблемы 2037 года. Я думаю, что это случай с отметкой времени 2107.
Geoffc

1
Ты думаешь об Apple HFS. Жир не использует time_tвообще. Он хранит год, месяц и день в виде полей в одном 16-битном значении: 5 бит для дня, 4 для месяца, оставляя 7 для года. 2107 - это 1980 год (нулевой год в FAT) + 2 ^ 7-1. Для большего удовольствия FAT хранит время дня таким же образом в другом 16-битном значении, но если вы посчитаете, вы обнаружите, что вам нужно 17 бит для хранения времени дня таким образом. FAT справляется с этим, отбрасывая один бит разрешения на секунды; FAT не может различить изменения менее чем за 2 секунды. Ах, Microsoft, что за скучный мир был бы без вашей ненужной несовместимости!
Уоррен Янг

8

Это мое мнение, но эта проблема связана с проблемой 32-битного счетчика, сегодня большинство ОС обновлены для обработки времени на 64-битных (по крайней мере, на 64-битных компьютерах), поэтому я предполагаю, что все ОС и программное обеспечение будет готово долго время до 2038 года, скажем, до 2020 года. Таким образом, у вас могут возникнуть проблемы, только если в 2038 году вы все еще будете использовать программное обеспечение с 2020 года.
Скорее всего, это не будет проблемой почти во всех случаях. Я надеюсь.


Я попробовал 32-битную версию Ubuntu, и она показала 2038 проблем, но при запуске 64-битной версии Ubuntu не было никаких признаков проблемы 2038. Я не пробовал никаких других Unixes.
Джимми Хедман

Да, в большинстве 32-битных версий вы увидите проблему, но не в 64-битной версии. Вы можете ожидать , чтобы иметь больше не какие - либо 32 - битные ОС в 2038
радиусе

2
Это нелепое предположение. Мы по-прежнему используем 16 (и даже 8-битные) микропроцессоры в современном мире, что значит 32-битные микропроцессоры волшебным образом исчезнут в будущем? Справедливо сказать, что это не повлияет на среднего пользователя, но в крайних случаях это может оставаться проблемой.
Эли Фрей

Что ж, 16-битные и 8-битные компьютеры могут: 1. переместить дату 0 (с 1970-01-01, например, на 2010-01-01) - однако это нарушит определенные соглашения API / ABI 2. расширит поле таймера ( который может в некоторых случаях нарушать «только» ABI).
Мацей Печотка

1

Не такое уж большое дело.

Во время первого блиц-выпуска 2000 года, когда поставщики программного и аппаратного обеспечения должны были сертифицировать свои продукты как «совместимые с Y2K», чтобы их можно было продать (я помню, сетевые кабели на подключении к ПК были сертифицированы как совместимые с Y2K), многие компании провели подробный аудит всего , установив часы на будущее и протестировав.

В то время, когда стоимость тестирования была так высока, они почти всегда тестировались с несколькими датами, такими как 1/1/99 (некоторые разработчики могли использовать 99 в качестве часового), 31.12.99, 1/1 / 00, скачок 2000 года, 19.01.38 и многие другие. Смотрите здесь для утомительного списка.

Таким образом, я считаю, что любое важное программное обеспечение, появившееся в 1999 году, вероятно, не будет содержать ошибок 2038, но новое программное обеспечение, написанное с тех пор невежественными программистами, может. После целого фиаско Y2K программисты, как правило, стали гораздо больше осведомлены о проблемах кодирования дат, так что вряд ли это окажет такое же большое влияние, как Y2K (что само по себе было чем-то вроде антиклимакса).


За исключением того, что эта проблема вызвана 32-разрядным типом UNIX time_t.
Юйхонг Бао

1

32-битные системы, работающие к тому времени, будут проблемой.


2
Не могли бы вы подробнее остановиться на этом, чтобы было более понятно, что именно становится проблемой и как на нее реагировать?
Anthon

Проблема связана с 32-разрядным целым числом, которое используется для вычисления времени. Время измеряется в количестве секунд, прошедших с 01 января 1970 года. Например, после одного дня этот счетчик будет на 86400. Таким образом, в 2038 году это значение будет переполнено, поскольку оно будет содержать значение, которое больше, чем число, которое может храниться в 32-разрядное целое число без знака. 64-битная система, использующая 64-битную метку времени, не будет иметь этой проблемы, поскольку она сможет работать до 15:30:08 в воскресенье, 4 декабря, 292,277,026,596 (292 миллиарда лет)
Рахул Кадукар,

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));
}

это должно быть 1 вместо 9, но ctime не обрабатывает большую дату:

8 - Sun Jun 13 07:26:08 1141709097

Моя система (конечно, 64-битная) может работать даже на 1 миллион лет больше. Решение состоит в том, чтобы обновить системы до 64 бит.

Подвох в том, что программы могут не справиться с этим. Особенно старый, свойственный и не обслуживаемый. Разработчики привыкли к следующим фактам:

  • int32-битные (на самом деле они сохраняются как 32-битные в 64-битных системах среди прочих, потому что предполагалось, что они 32-битные всегда)
  • Большинство типов (таких как time_t) могут быть безопасно брошены наint

В популярном программном обеспечении FLOSS обе вещи, вероятно, не пройдут через обзор «многими глазами». От менее популярного и проповеднического он будет зависеть от автора.

Я предполагаю, что в мире free * nix 2038 будет «незамеченным», в то время как я ожидаю проблем на «правильных» платформах (т. Е. С большим количеством правильного программного обеспечения) - особенно если не будет поддерживаться какая-либо важная часть.


Это не «система» или «ОС». Большинство любых предыдущих 32-битных ОС (черт возьми, даже 16-битные ОС) могут выполнять 64-битные вычисления. Глубина 64 бита на уровне ОС - это, в основном, ссылка на модель памяти, а не умение делать математику. И время все о математике.
Geoffc

Да и нет. Это правда, что 32-битная и 64-битная ОС могут выполнять 64-битную арифметику (вы можете эмулировать любую арифметику). Однако time_t(или эквивалент) в 32-битной ОС имеет 32 бита, в то время как time_t(или эквивалент) в 64-битной ОС 64-битный. Я думал, что это было достаточно ясно, даже с некоторым упрощением.
Мацей Пехотка

0

Если это что-то вроде Y2K, то некоторые люди уже пострадали и меняют программное обеспечение, но большинство разработчиков будут игнорировать его до 2030-х годов, возможно, до 2035 года, когда будет много работы, и кто-нибудь достаточно взрослый знать K & R C и еще не слишком старческий может внезапно заключить контракт за большие деньги. Фактический переход покажет многое из того, что еще не сделано, вероятно, не так уж важно.


-5

Проблема 2000 года заключалась в том, что вместо четырех были представлены два чартера.

Многие системы не могли отличить 2000 от 1900 года, так как они сохраняли только «00».

Почти все системы либо теперь используют 4 символа для хранения года, либо используют какую-то библиотеку.

Так что давайте все будем беспокоиться о 10000 году (Y10K). За исключением писателей ОС и библиотек ...


Вероятно, никто (ну практически никто) не хранит дату в таком формате (т.е. DCD или строка) сейчас. Время обычно обрабатывается объектами или целочисленными значениями (поэтому необходимо обновлять только отображаемый код).
Мацей Печотка

Да, моя точка зрения точно. Y2K фактически убил идею представления дат в виде строк фиксированной длины.
Стивен Яздевски

@Stephen: Не в мире COBOL, но, к счастью, в Unix / Linux есть несколько реализаций COBOL.
Дэвид Торнли

@ Дэвид: программы на языке COBOL были большей частью проблемой 2000 года. У систем Linux / Unix, с точки зрения пользователей, когда-либо была проблема 2000 года? Простой ответ на оригинальный вопрос - нет.
Стивен Яздевски

4
Постер не спрашивает о проблеме 2000 года; они спрашивают о проблеме y2k38, которая является совершенно другим зверем. Проверьте en.wikipedia.org/wiki/Y2K38 для описания.
Кевин М,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.