Что может случиться 19 января 2038 года и как нам этого избежать
«Проблема 2038 года» заложена в POSIX — стандарт для прикладных пользовательских интерфейсов для различных вариантов ОС Unix, появившийся на свет в 1985 году |
Скорее всего, день 19 января 2038 года пройдет еще менее болезненно, чем 1 января 2000 года, но шум, вызванный ошибкой Y2K, привлек внимание и к этой мине, заложенной в ОС Unix. Она называется Year 2038 problem. Проблема, с которой человечество столкнется через 34 года, может проявить себя в программах, написанных на Си и использующих стандартную библиотеку времени standard time library (time.h). В библиотеке time.h для внутреннего представления значений текущей даты и времени используется переменная time_t, где в формате целого числа хранится число секунд, накапливаемое с 0 часов 00 минут 00 секунд 1 января 1970 года по Гринвичу. С тех пор вот уже более 30 лет каждую секунду значение time_t увеличивается на единицу. Избранная разработчиками Unix форма представления времени в секундах без минут, часов, суток, месяцев и лет привлекательна тем, что для вычисления длительности интервала между двумя моментами достаточно одного арифметического действия. Но, приняв это вполне разумное решение, разработчики все же оказались не слишком дальновидны и допустили просчет, который должен проявиться через 74 года после запуска счетчика. Суть «Проблемы 2038» заключается в том, что для хранения значения времени используются 32 двоичных разряда, следовательно, максимальное значение переменной time_t равно 2 в 31-й степени минус 1, то есть 2 147 483 647. Момент, когда наступит переполнение time_t, выпадает на 19 января 2038 года.
Точнее говоря, «Проблема 2038 года» заложена в POSIX. Так называется набор стандартов, известный в США как IEEE 1003, его международное название — ISO/IEC 9945. POSIX (Portable Operating System Interface) служит стандартом для прикладных пользовательских интерфейсов с 1985 года для различных вариантов ОС Unix. Имя собственное POSIX было предложено Ричардом Столманом, являющимся одной из центральных фигур в движении за свободное ПО, основателем проектов GNU и Free Software Foundation. Имя было придумано по просьбе IEEE, хотелось иметь нечто запоминающееся. Нетрудно догадаться, что X в POSIX «наследует» X от Unix.
Итак, 19 января 2038 года в 3 часа 14 минут 8 секунд случится «катастрофа». Целое со знаком time_t по достижении значения 2 147 483 647 и будучи увеличенным на единицу превратится в -2 147 483 648, что соответствует 13 декабря 1901, 8:45:52. Если не принять профилактических мер, то на всех Unix-системах по всему миру после 19 января 2038 года наступит 13 января 1901 года и большинство функций, использующих time_t, выдадут код ошибки.
Для интервала времени с 1 января 1970 года по 19 января 2038 года придумано специальное название — «эпоха Unix» (Unix Epoch). Для того чтобы Unix-системы смогли безболезненно работать и после окончания «эпохи», их следует приспособить для работы в 64-разрядном режиме, что требует перекомпиляции файлов заголовков и определения time_t как 64-разрядного целого. При этом могут, чего нельзя исключить, возникнуть проблемы не менее серьезные, чем в случае «Ошибки Y2K», поскольку в каких-то программах содержатся неочевидные методы использования переменной time_t или же могут отсутствовать исходные коды, необходимые для перекомпиляции. Если же все необходимые процедуры выполнить правильно, то 64 разрядов хватит на следующие 300 млрд. лет, что примерно в 20 раз больше оцениваемого времени существования Вселенной, и «эпоха Unix» продолжится.
Судьба time_t
Суть «Проблемы 2038» заключается в том, что для хранения значения времени используются 32 двоичных разряда, следовательно, максимальное значение переменной time_t равно 2 в 31-й степени минус 1, то есть 2 147 483 647. Момент, когда наступит переполнение time_t, выпадает на 19 января 2038 года