OpenQuality.ru

Качество программного обеспечения

Качество программного обеспечения: в главных ролях

Лента  Радар  Блог  Опыт  
Разум  Видео  Заметки  Эпизоды


2038. Набат из прошлого

Времена не выбирают.

Все персонажи вымышленные. Совпадения случайны.

16 января 2038 года

Медвежий угол в Пенсильвании к западу от реки Делавэр. Неприметное серое здание и тесный двор за железобетонным периметром. Глухая одиночная камера с отсыревшими болотными стенами и замазанным известкой окном. Здесь нет помилования и реабилитации, но есть надежда, шанс на спасение. Ждать осталось недолго.

Джеймс Сантос был схвачен и заточен в каменный мешок двадцать с лишним лет назад. Скандальные материалы о вторжении в Сирию, нелегальном обороте наркотиков и руткитах в Microsoft Windows могли обрушить американскую экономику, и без того изнемогавшую от бремени внешнего долга. Независимый журналист-исследователь исчез со всех радаров мировых СМИ, и лишь несколько человек в администрации Президента знали, что бывший хакер, собиравшийся всколыхнуть мир своими публикациями, был арестован в Швеции и нелегально доставлен в самую секретную тюрьму оплота западной демократии. Неделю имя пропавшего Сантоса не сходило с полос газет, выдвигались десятки версий его исчезновения. А потом о нем забыли – новые герои и события заняли пустующую нишу…

*****

Кейт Бланш, основательница дерзкого стартапа Naxos, бросившего вызов Google, готовилась ко встрече с инвесторами. Naxos вышел на рынок с интеллектуальным поиском: роботы-пауки Naxos могли пройти по всем закоулкам теневого Интернета, традиционно скрытого от поисковых машин: заброшенным блогам, платным библиотекам, закрытым форумам, разномастным базам данных на архивных серверах. И не просто пройти, но обработать и проиндексировать крупицы знаний так, что информационный хлам оказывался в стороне, а на свет выступали тенденции: что происходит в мире сейчас и что произойдет в ближайшей и долгосрочной перспективе.

Красота Кейт была ее сокровищем и проклятием. Густые волосы цвета пчелиного меда, бездонные зелено-синие глаза, высокая, упругая грудь, осиная талия и гитарный овал бедер заставляли мужчин цепенеть и забывать обо всем на свете. Услышат ли они ее идеи и алгоритмы, оценят ли влияние, которое может обрести Naxos, получив следующий транш? Кейт пробежала глазами по черновику выступления. Что-то мешало сосредоточиться. Необъяснимая тревога, гнездившаяся в подсознании, рвалась наружу…

*****

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

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

*****

Алекс Рассказов сидел на покрытом засохшими водорослями бревне, когда-то выброшенном на берег волнами неспокойного Японского моря, и прокручивал в памяти минувший год, в который раз удивляясь, как изменилась его жизнь. Системный программист и эксперт по информационной безопасности, двенадцать лет отдавший банковской сфере, он глубоко разочаровался в своей профессии. Алчная погоня за прибылью сюрреалистично уживалась с халатностью и показухой. “Быстрее, дешевле, помпезней” – такой была оборотная сторона информационных систем, в разработке которых он участвовал. “Движуха” шла вразрез с его знаниями и принципами, и однажды Алекс решился: последнее прости, вечеринка с друзьями – и путь на Дальний Восток. Здесь, в проливе Лаперуза, покоились останки японских кораблей, сраженных китайскими ракетами в кровопролитной войне за брошенный Россией Сахалин.

Задача международного водолазного отряда под эгидой миротворческих сил ООН состояла в обезвреживании ядерных боеголовок на крейсерах, затонувших семь лет назад. В эпоху технологической предсингулярности с обнаружением ракет легко справлялись специализированные роботы-автоматы, но допускать их к деактивации боеголовок строжайше запрещалось Шанхайским пактом о защите человеческой расы…

*****

19 января 2038 года часть компьютерных систем неверно вычислит дату в приложениях, где она без сбоев вычислялась десятки лет.

Проблема 2038 года связана с представлением времени по стандарту POSIX и разрядной сеткой 32-битных систем. Согласно POSIX, моментом отсчета времени в Unix считается 1 января 1970 года. Текущее время вычисляется по количеству секунд, прошедших с этой даты. Такой способ представления времени удобен при операциях с временными отрезками – например, при хранении и сравнении двух точек во времени. Предположим, нам нужно сравнить два события: X и Y. Если годы, месяцы, дни, часы, минуты и секунды хранятся раздельно, то нам понадобится несколько операций сравнения. Или другой пример: если к некой дате добавлять один день, то надо заботиться о количестве дней в месяце и месяцев в годе. Гораздо удобнее оперировать секундами и превращать их в “человеческие” даты при показе пользователю.

В 32-битных системах используется тип данных time_t для хранения секунд в виде 32-битного целого со знаком (signed int). Первый бит определяет знак целого числа (положительное или отрицательное), а оставшиеся 31 бит хранят его значение. Наибольшее число, которое может храниться в этих битах, составляет 231 − 1 = 2 147 483 647. Соответственно, самая поздняя дата, которая может быть представлена в стандарте POSIX — это 03:14:07 AM, вторник, 19 января 2038 года по GMT.

Процессор, выполняющий операции с целым числом со знаком, действует вразрез с общепринятыми представлениями из повседневной жизни. Если автомобиль проехал 99 999 километров, то еще через километр его 5-знаковый одометр покажет 00 000 километров. Но если целое со знаком достигает своего максимального значения и затем увеличивается на единицу, то оно преобразуется к наименьшему отрицательному значению. Это означает, что 32-битное целое со знаком становится равным −2 147 483 648 и переводит время к пятнице, 13 декабря 1901 года 8:45:52 PM GMT ( 1 января 1970 года 00:00:00 GMT минус 231 секунды). Пятница, 13 число!

В некоторых функциях, работающих с time_t, отрицательное значение не обрабатывается с момента написания кода. Если в приложении, использующем такие функции, не анализируется код возврата, оно может “упасть” при получении отрицательного значения.

В начале века проблема, казалось, не стоила выеденного яйца. Человечество успешно преодолело опасности 2000 года. Спутники не сошли с орбит, веерного отключения питания не произошло, связь не терялась. Технологии развивались настолько стремительно, что через тридцать с лишним лет от скелетов в шкафу 32-битных систем не должно было остаться ни слуху, ни духу. Во-первых, “предупрежден – значит вооружен”. В код, работающий с типом данных time_t, можно было внести изменения, корректно обрабатывающие 2038 год, либо ввести новый тип данных. Во-вторых, переход на 64- и тем более 128-битные системы, казалось, автоматически устранял ложку дегтя в бочке меда. Но на деле все оказалось не так.

1. Переход на 32-битные целые без знака (unsigned int) может добавить еще один бит к представлению даты, но приводит к нежелательным побочным эффектам. В одних приложениях теряется возможность корректно работать с датами до 1970 года, поскольку эти даты были представлены отрицательными значениями. В других приложениях тип time_t используется для хранения разницы между двумя датами, которая может быть отрицательной. Таким образом, отказ от отрицательных значений исправляет один баг и открывает непредсказуемое множество новых.

2. Переход к 64-битной структуре time_t может нарушить бинарную совместимость программ и данных. Приложения, полагающиеся на 32-битную структуру, не будут работать в системе с 64-битным представлением time_t. Два файла данных – по “старой” и “новой” вере – будут использовать разные комбинации нулей и единиц для хранения одних и тех же значений.

3. Переход с 32-битных на 64-битные системы и приложения неминуем (закон Мура и его вариации), но окончательная победа 64 бит может затянуться на многие годы. Во-первых, “работает – не трогай” и “старый конь борозды не испортит”. Если система исправна и нет необходимости вносить изменения в ее работу, то шевелить ее никто не будет. Обработка статистических данных, метеопрогнозы, военные системы – в них вложено столько усилий, что кардинальные изменения им не грозят. К примеру, работа с кассой и складом в некоторых торговых точках в 2011 году осуществляется на системах с MS-DOS 6.22 и оболочкой Norton Commander. Во-вторых, подавляющее большинство систем не создаются “с нуля”. Производство ПО – трудоемкий процесс, а результат нужен быстро. Поэтому в новых системах разработчики стремятся задействовать старый код, написанный их предшественниками. А проверяли они код возврата? Шерстить legacy-код никто не будет.

4. Решение “в лоб” – переписать все функции работы с датой так, чтобы даже в 32-битных системах даты старше 2037 года обрабатывались корректно. Например, использовать для хранения данных не unsigned int, а double float. Но даже при наличии общедоступных библиотек потребуется пересобрать все программы, которые работают с time_t. Многие компании-разработчики не выделят на это время и бюджет.

Чем быстрее идет переход к 64 битам, тем меньше внимания уделяется проблемам в 32-битных системах. Между тем, 2038 год всплывает уже сейчас. Вот три примера:

1) После 10 января 2004 года вычисление среднего значения между двумя датами (t1 + t2)/2) может привести к переполнению разрядной сетки. t1/2 + t2/2 может привести к ошибке округления, поэтому лучше использовать, к примеру, (((double) t1 + t2) / 2).

2) 12 мая 2006 года наблюдались массовые зависания web-сервера AOLServer. Выяснилось, что значения параметров MaxIdle и MaxOpen в файле конфигурации по умолчанию были равны 1 миллиарду секунд (109). Предполагалось, что запрос к базе данных не должен завершаться по тайм-ауту, и в качестве “бесконечной” продолжительности запроса выбиралось текущее время + миллиард секунд. В мае 2006 года полученная таким образом дата выходила за 19 января 2038 года. Время тайм-аута оказывалось в прошлом, что приводило к падению сервера.

3) Люди берут ссуду на 30 лет, и дата окончания выплат выходит за пределы 2038 года.

*****

Название POSIX ( Portable Operating System Interface for Unix) было предложено Ричардом Столлманом в 1988 году. Выбирая единый способ произношения “POSIX”, инициативная группа остановилась на “pahz-icks” (сходное с “positive” – положительный, позитивный) и даже придумала мотто “I’m positive about Posix” . Представление времени в стандарте POSIX служило верой и правдой почти полвека и через три дня должно пройти самое серьезное испытание на прочность…

Продолжение следует.

Отправить в Twitter, Facebook, ВКонтакте | Опубликовано 22.08.2011 в рубрике "Приложения"

Комментарии (2)

  1. Автор комментария : trololonah | August 22, 2011

    про ссуды подтверждаю) уже перешли на 64

    [Ответить]


  2. Автор комментария : Aquary | August 24, 2011

    Апокалиптичино-обречённо. Отлично, в общем :)

    [Ответить]



Добавить комментарий

Пожалуйста, исправьте результат: дважды два равно



КРАТКОЕ СОДЕРЖАНИЕ

Что такое качество программного обеспечения и как его улучшить: теория и практика, задачи и решения, подводные камни и обходные пути.


ПУТЕВОДИТЕЛЬ

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

ПОДПИСКА

Доступ к самым интересным материалам по электропочте и RSS. Подробности.

ИЩЕЙКА