“Ошибка-2001” сломает скрипты 9 сентября

Author:

Алексей Андреев

Рано утром 9 сентября в Unix-системах отсчет времени перевалит за миллиардную секунду. Некоторые СМИ уже назвали этот перевальный пункт “проблемой-2001”. И даже специалисты расходятся во мнении о том, насколько эта проблема серьезна.

Как заявил в интервью “Нетоскопу” Алексей Выскубов, работающий в исследовательском центре Nokia в Финляндии, проблема является “шуточной”. Время в Unix-системах отсчитывается от так называемого Epoch: 00:00 01.01.1970. При этом время считается в секундах, а под счетчик в большинстве систем выделено 4 байта. В байте 8 бит, так что переполнение произойдет, когда число достигнет “2 в степени 32” (то есть на 4294967296-ой секунде), а не в случае “10 в степени 9” (то есть на миллиардной).

“С точки зрения компьютеров число 10 в степени 9 ничем не замечательно”, – полагает Алексей Выскубов. Он также рассказал, что новость об этой очередной “ошибке-2000” в качестве шутки запущена в СМИ научным руководителем одного его знакомого, вычислившим эту миллиардную секунду.

Между тем, по данным “Нетоскопа”, уже в пятницу некоторые веб-серверы стали испытывать сбои, связанные с “миллиардной секундой”. Например, сбои, случившиеся в работе сайта Lenta.ru, выразились в неправильной работе некоторых программ сортировки новостей. И связана эта проблема вовсе не с переполнением счетчика. Вот как комментирует ситуацию программист Максим Мошков:

“Как известно, дата хранится в виде числа секунд, прошедших с 1970-го года. Например, сейчас это 999867871. А послезавтра это число перевалит за
1000000000 и в нем добавится еще один разряд. Ничего криминального в этом нет, но у программистов на Perl в связи с этим может возникнуть неприятность в операциях сравнения времен (например – времени модификации файлов, или даты постинга)”.

По мнению Мошкова, ошибка может случиться, например, если в программе стоит списанная с учебника типовая операция сортировки массива по дате:


@FILES=sort{ $FILEtime{$b} cmp $FILEtime{$a}} (@FILES);

В данном определении используется “cmp” – операция символьного сравнения, а не числового. А в символьном сравнении 1000000000 меньше, чем 999867871. Поэтому при такой сортировке результат окажется прямо противоположным ожидаемому.

Естественно, если программист с самого начала использовал корректную сортировку (не “cmp”, a “<=>”), то ничего не случится. Но кто может поручиться, что во всех его скриптах повсюду использованы корректные виды сравнений и сортировок?

Как полагает Мошков, проблема является вполне реальной с учетом того, что многие скрипты писались в пору обучения языку Perl, когда разница между “cmp” и “<=>” была просто неизвестна авторам этих скриптов. А многие веб-мастера вообще используют чужие скрипты, сгруженные из Интернета. Поэтому “глюки ожидают нас всех в самых неожиданных местах”.

Таким образом, у интернетчиков остались еще сутки для того, чтобы почистить код и встретить 1000000000-ю секунду от 1-го января 1970-го года во всеоружии.

Кроме того, как сообщают источники “Нетоскопа”, еще ряд проблем 9 сентября может быть связан с тем, что юниксоидно-настроенные системные администраторы будут активно праздновать “миллиардную секунду” с применением алкоголя.

Союз Журналистов