Русский

Инструменты разработчика · Конвертер временных меток Unix

Проблема года 2038: что происходит при переполнении 32-битного time_t

· Фон

временные метки Unix-время отладка

Знаковый 32-битный счетчик достигает верхней границы рядом с продолжающейся временной шкалой.
Оригинальная векторная иллюстрация ToolAcre

19 января 2038 в 03:14:07 UTC второй счетчик со знаком 32 переводится в 1901. В этом посте объясняется арифметика, где все еще скрывается 32-битное время, и как распознать систему, которая будет затронута.

Дата, которая ближе, чем кажется — ипотека, сертификаты и встроенное ПО уже рассчитывают дату после 2038.

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

Практический вопрос аудита заключается в том, хранит ли какая-либо граница секунды Unix в подписанном 32-битном целом числе. Современный браузер, успешно форматирующий будущую дату, ничего не говорит о более узком поле ниже по течению. Отслеживайте сериализацию и постоянство, а не только пользовательский интерфейс.

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

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

Максимум знакового 32-битного целого числа — 2³¹−1 или 2,147,483,647. Тесты устанавливают, что через много секунд после эпохи это `2038-01-19T03:14:07.000Z`. Еще одна математическая секунда должна быть 03:14:08, а ToolAcre отображает ее, поскольку JavaScript Число и Дата могут нести значение.

Для переноса в отрицательное значение требуется внешняя 32-битная операция со знаком; `fromEpoch` не выполняет его. Часто цитируемый декабрьский результат 1901 может быть получен для переноса с дополнением до двух, но утверждение, что каждая затронутая система выполняет перенос, а не отвергает, насыщает или повреждает, превзошло бы доказательства. Проверьте фактическую границу.

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

Точный верхний момент проверен; поведение переноса зависит от внешней целочисленной операции

Найдите схемы, определения протоколов и двоичные макеты для 32-битных полей со знаком, которые содержат секунды эпохи. Столбец SQL с именем INTEGER не является достаточным доказательством для всех механизмов, и встроенная платформа не затрагивается автоматически. Определите ширину, знаковость, единицу измерения и код преобразования для каждого пути.

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

Найдите подписанные 32-битные поля эпохи, проверив фактические схемы и форматы.

Концептуальное исправление — это представление, диапазон которого включает необходимые даты, обычно более широкий знак или соответствующий временной тип. Ядро книги, libc и описание миграции формата находятся за пределами этих исходных файлов. Каждая система имеет свою собственную совместимость и работу по развертыванию.

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

Планирование миграции должно включать откат и поведение смешанных версий. Новый писатель, создающий широкие значения, может сломать старого читателя еще до того, как какая-либо сохранившаяся дата достигнет границы календаря.

Расширение представления является основным решением; миграция ядра и формата зависит от системы

Преобразуйте 2,147,483,647 в секунды, чтобы получить `2038-01-19T03:14:07.000Z`; преобразуйте 2,147,483,648 в `2038-01-19T03:14:08.000Z`. Плавный шаг в одну секунду доказывает, что путь ToolAcre не имеет 32-битного обрыва при этом значении.

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

Это сравнение также демонстрирует, почему конвертер является диагностическим, а не уязвимым: явный выбор единиц измерения определяет масштаб, в то время как более широкое представление браузера содержит оба значения.

Рабочий пример: конвертер пересекает границу, потому что JavaScript Дата не подписана 32-битных секунд

Репозиторий также проверяет 4,294,967,295 секунд как `2106-02-07T06:28:15.000Z`, максимальное количество беззнаковых 32-бит. Он не проверяет смену недели GPS и не указывает подписанный 64-битный миллисекундный скачок, поэтому названные темы опускаются, а не обобщаются.

Граничный анализ должен точно соответствовать используемому типу. Переключение со знака на без знака расширяет одно направление, но удаляет отрицательные даты и по-прежнему создает верхний край. Более широкое подписанное изображение обычно сохраняет оба направления в зависимости от диапазона дат потребителя.

Каждый утес нуждается в собственном выводе из ширины, знака и единицы измерения. Группирование несвязанных ролловеров под «2038» скрывает, какое двоичное поле действительно требует изменения.

Проверяется беззнаковая граница 32 бит; другие названные скалы являются доказательствами за пределами хранилища.

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

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

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

Вывод: эпоха в порядке, целочисленная ширина — проблема, и как конвертер временных меток Unix позволяет проверять любое граничное значение в UTC и местном времени.

Проблема года 2038 — это граница целочисленной ширины, а не дефект арифметики эпохи Unix. Успешное преобразование ToolAcre с обеих сторон делает это разделение видимым. Внешняя система дает сбой только в том случае, если одно из ее представлений не может выдержать следующий счетчик.

Используйте 2,147,483,647 и 2,147,483,648 в качестве соседних тестовых векторов, проверяйте точную устойчивость и документируйте единицу измерения и подпись. Доказательства на каждом этапе более ценны, чем общий контрольный список предположительно уязвимых технологий.

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