«Ошибка-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 сентября может быть связан с тем, что юниксоидно-настроенные системные администраторы будут активно праздновать «миллиардную секунду» с применением алкоголя.

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