Почему дата зависит от одного числа

Многие старые программы хранят время как число секунд, прошедших с 1 января 1970 года. Такой способ удобен: чтобы узнать дату, достаточно прибавить к начальной точке нужное количество секунд. Но в некоторых 32-битных системах для этого числа отведено всего 32 бита — фиксированная ячейка памяти.

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

Что происходит при переполнении

Если программа продолжит считать в таком формате, значение может перескочить с максимального положительного числа на отрицательное. Для часов это способно выглядеть так, будто наступила дата в декабре 1901 года. Само устройство не «забывает» время: ошибка возникает, когда старый программный код неверно интерпретирует переполнившееся число.

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

Почему проблема не означает сбой всех компьютеров

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

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