ОБЗОРЫ

11 февраля 2007 г. 12 истребителей-"невидимок" F-22 перелетали с военной базы США на Гавайях в Японию. В момент пересечения международной временной границы на всех машинах из-за программной ошибки отказали бортовые компьютеры. Как сообщило CNN, самолетам пришлось развернуться и пилоты вели машины обратно на ручном управлении, в условиях отсутствия навигационных сигналов и связи. Если бы погода была ненастной, то последствия отказа могли стать трагическими.

В серьезных проектах для предотвращения подобных случаев принято обрабатывать временные данные исключительно в формате Universal Time Code (всемирное время по Гринвичу), который, впрочем, из-за нюансов реализации в популярных компиляторах и библиотеках может вызвать проблемы при переходе от 2049-го к 2050-му году. Известны также случаи, когда вследствие программной ошибки истребители F-16 в режиме автопилотирования переворачивались "вверх ногами" при преодолении экватора. Но случай с F-22 показателен прежде всего тем, что в ответственных проектах, как и 50 лет назад, увы, не реализуются простые действия по противодействию дефектам, вызывающим заметное отклонение системы от нормального функционирования.

Program errors на Земле и в космосе

За последние 15 лет в истории ИТ зафиксировано, пожалуй, наибольшее число серьезных программных ошибок, хотя первый случай планетарного масштаба, связанный с эксплуатацией не проверенного до конца ПО, произошел еще в СССР. Тогда в поставки канадской АСУ для транссибирского трубопровода по инициативе ЦРУ были включены чипы, которые успешно прошли контрольные проверки, однако в условиях промышленной эксплуатации выдавали неправильные значения. Трубы не выдержали реального давления, и в 1982 г. на трубопроводе произошел крупнейший в мировой истории неядерный взрыв. Правда, по этому поводу существует альтернативное мнение: компьютерные системы в те годы на отечественных трубопроводах вообще не использовались, а взрыв произошел из-за элементарного невыполнения проектных норм.

Печально известны события с системой радиационной терапии Therac-25, которая была создана в Канаде, а эксплуатировалась также в США. Она иногда генерировала сверхдозы облучения, в сотни раз превышавшие максимально допустимые, и в середине 1980-х годов из-за этого погибло пять человек, хотя сбойную ситуацию долгое время не удавалось повторно воспроизвести. В системе использовалась самодельная и никем не сертифицированная мультизадачная ОС, которая в ряде случаев некорректно синхронизировала параллельные процессы.

Программные ошибки традиционно преследуют межпланетные проекты. В 1962 г. межпланетная станция Mariner 1, нацеленная на Венеру, еще во время старта сбилась с курса из-за ошибки в Фортран-программе. Советский "Космос-419" был в мае 1971 г. выведен на орбиту Земли, откуда он должен был стартовать к Марсу, однако в бортовой компьютер было введено ошибочное значение времени запуска двигателя - в формате не минут, а часов, что привело к потере аппарата. Буквально через неделю произошло второе ЧП - бортовая система отечественной станции "Марс 2" в момент отстыковки от корабля-матки, расположившегося на орбите Красной планеты, получила ошибочные данные о параметрах приземления и не смогла выполнить задание.

Зонд Mars Global Surveyor прекратил

работу из-за ошибки в обновленном ПО

В 1999 г. американский аппарат Mars Climate Orbiter сгорел во время посадки на Марс из-за ошибки в навигационном ПО, а через пять лет едва не был потерян марсоход Spirit, который неожиданно принялся безостановочно перезагружать бортовую ОС. Перезагрузка была умышленно предусмотрена проектировщиками - она должна была выполняться в случае подозрительных сбоев, и Spirit, зафиксировавший неполадки в бортовом комплексе, подал команду на перезагрузку. Однако разработчики не учли ситуацию, когда неполадка фиксируется непосредственно во время перезагрузки. В итоге Spirit принялся непрерывно формировать команды на перезагрузку и едва не "зациклился". К счастью, такой вариант допускался, и принудительной командой с Земли ряд периферийных устройств аппарата, провоцировавших неполадки, был временно отключен. Причина дефекта, как оказалось, скрывалась в одном из программных модулей, разработчики которого забыли организовать корректное закрытие файлов, в результате чего внешняя флэш-память постоянно переполнялась, что фиксировалось как сбой оборудования. Но архитектура Spirit допускала дистанционную замену софта, и вскоре работоспособность устройства была восстановлена.

Меньше повезло американскому аппарату Mars Global Surveyor, прибывшему к Красной планете еще в 1997 г. Аппарат прекратил функционирование в ноябре 2006 г., но он проработал значительно дольше запланированного срока (до конца 2001 г.) и, возможно, мог не менее успешно действовать и дальше, если бы НАСА не вздумало обновить летом 2006 г. его бортовое ПО. Несмотря на существенно улучшившиеся за последние 15 лет средства разработки, включающие защиту от типовых ошибок и средства автоматического тестирования, новый софт вскоре дал сбой. Ошибки обращения по неверному адресу памяти (выходу адреса за допустимые границы), пожалуй, самые типичные при использовании языков Си и С++, на которых часто создается бортовое ПО, и меры противодействия им предпринимаются в первую очередь. Однако в данном случае ошибка адресации спровоцировала перегрев батареи и последующий цепной отказ других элементов устройства.

В декабре 2006 г. НАСА выполняло экстренное обновление ПО шаттла "Дискавери", в котором была обнаружена проблема, схожая с недоработкой в авионике F-22. Некорректный анализ времени и дат, как официально сообщалось, напоминал пресловутую проблему Y2K. Разработка бортового ПО шаттла началась 30 лет назад, и несмотря на масштабные переделки перед 2000 г., оно по-прежнему оказалось неготовым к смене дат между годами. Инженеры опасались, что 1 января 2007 г. будет воспринято системой как 366-й день 2006-го, что привело бы к непредсказуемым последствиям. Для установки нормальной даты компьютеры шаттла пришлось бы перезагружать непосредственно во время полета. По этим причинам запуск аппарата был перенесен на неделю раньше, на 6 декабря, чтобы он вернулся на Землю до Нового года. В этом же месяце был отложен запуск и военного спутника TacSat-2 - специалисты Пентагона выяснили, что его ПО не способно корректно ориентировать солнечные батареи. А в январе 2007 г. вновь, как и семь лет назад, потерпела аварию ракета-носитель "Зенит", созданная украинским "Южмашзаводом". В первый раз причиной неудачи стал сбой в компьютерной системе управления рулевым двигателем второй ступени, причина нынешней аварии выясняется.

В 1991 г. ракетная установка MIM-104 Patriot не заметила вражескую ракету Scud, которая уничтожила в казарме г. Дахрен (Судовская Аравия) 28 американских солдат. Бортовая система Patriot работает с накапливаемой ошибкой в системных часах, и в процессе длительного нахождения на боевом дежурстве погрешность достигла 0,3 с, что привело к пропуску быстро двигавшейся ракеты. В 1994 г. погибло 29 человек в результате аварии английского военного вертолета Chinook, который разбился из-за сбоя в бортовой навигационной системе, неверно определившей высоту полета. В 1996 г. катастрофа ракеты Ariane 5 Европейского космического агентства побила все рекорды по убыткам, которые в данном случае составили полмиллиарда долларов. Интересно, что предыдущие модели Ariane 4 успешно запускались десятки раз, а вот пятая версия взрывалась семь раз, однако европейцы с завидным упорством продолжали ее эксплуатацию. Причиной аварии, как выяснилось позже, стала ошибка в преобразовании 64-разрядного дробного числа в 16-разрядное целое, хотя даже по условиям спецификации дробные числа в соответствующем контексте не должны были использоваться. Причем эта ошибка существовала еще в навигационном модуле для ракеты Ariane 4, однако не проявляла себя, потому что траектория разгона Ariane 4 отличалась от траектории новой версии. Удивительно, но бортовое ПО было перенесено на новую ракету без каких-либо модификаций.

В корпоративных и федеральных КИС ошибок, по всей видимости, еще больше. Однако самые продвинутые создатели систем оперативно признают недоработки. Так, в феврале ФНС России издала приказ N ММ-3-13/53@, в котором исправляется опечатка в кодах реквизитов, используемых при отсылке налоговых отчетов в электронной форме. А вот прославившаяся багами и принесшая множество убытков система по контролю за спиртсодержащей продукцией ЕГАИС, авторы которой до сих пор заявляют, что она ни при чем и во всем виноваты пользователи, так и не реализована в полном масштабе. Недаром правительство приняло в конце 2006 г. поправки о выводе ряда производств из-под ее контроля.

Иногда компьютерные дефекты втягиваются и в политические игры. Так, в ответ на недавние претензии Россвязьнадзора к "Совинтелу" по поводу недопустимости несанкционированной трансляции IP-трафика через зарубежных цифровых операторов представители связистов заявили, что причиной такого события стал случайный сбой на программном коммутаторе.

Выход - в интеллектуализации

Причина ошибок в крупных проектах кроется в их объективно высокой сложности, которая пока не позволяет задействовать некий универсальный метод программирования, гарантирующий отсутствие дефектов. Однако при анализе известных программных сбоев почти всегда выявлялись прежде всего организационные недоработки. Работа велась с несертифицированным системным ПО, плохо готовилась документация, заданные спецификации не выдерживались, тестирование в нужном объеме не выполнялось, верификаторы кода не использовались и даже не применялись простые методы контроля за допустимыми значениями. Попутно отметим общедоступные верификаторы Си-кода: Splint (splint.org), Flawfinder (www.dwheeler.com/ flawfinder/), аналогичную утилиту для языка Java - FindBugs (findbugs.sourceforge.net). Правда, верификаторами, согласно статистике отечественных поисковиков, ежемесячно интересуется всего 40 человек из многотысячного отечественного сообщества программистов.

При анализе известных программных сбоев почти всегда выявлялись организационные

недоработки.

Косвенное влияние на число дефектов в ПО оказывают сами потребители. О причинах общего снижения качества софта, как корпоративного, так и массового, в интервью изданию Technology Review поведал Бьерн Страуструп, создатель языка С++. Он отметил, что срок разработки более-менее сложной программной системы достаточно велик, но пользователи постоянно требуют все новые и новые приложения и цифровые устройства. При этом они не хотят изучать оригинальные интерфейсы управления, не желают ожидать завершения длительных циклов производства и при этом не намерены доплачивать за высокие качество и надежность. В результате софт-производителям приходится выпускать на рынок сырые продукты и либо выдумывать экзотические меры для достижения приемлемого качества, либо задействовать в критических системах далеко не лучшие технологии. Так, подразделение компьютерной безопасности iDefense Labs сетевой компании VeriSign обещает выплачивать по 8000 долл. за найденную уязвимость в ОС Windows Vista и браузере Internet Explorer 7. А английская фирма Insyte объявила, что ОС Windows 2000 выбрана в качестве стандартного решения при разработке бортовых систем для военных кораблей, - ранее такая идея долго обсуждалась во властных структурах Великобритании. Windows задействуется в эсминцах Type 45, для которых, впрочем, данное решение прогрессивно - на более старых кораблях Type 42 использовались ископаемые машины с процессорами 1 МГц и ОЗУ 25 Кб. В перспективе Windows будет установлена на атомных субмаринах Torbay с ядерными ракетами Trident.

К стратегической тенденции по снижению числа дефектов в ПО следует отнести внедрение систем автоматизации всех аспектов разработки, связанных с качеством: генерации кода, верификации, отладки, тестирования, формального доказательства корректности. В критически важных системах будет задействовано надежное системное ПО, сертифицированное независимыми структурами, которое не допустит краха всей системы из-за прикладного сбоя и сможет при необходимости перезапустить приложение. Повысится роль интеллектуального софта, который станет самостоятельно принимать решения по предотвращению последствий возникающих ошибок. В некоторых прикладных проектах для этого, в частности, используются системы интеллектуальных агентов, которые следят за качеством выдаваемых результатов, и если они сильно отклоняются от разумных значений, предпринимают корректирующие действия. Эффективность подобных систем продемонстрировала февральская биржевая паника - резкий обвал котировок случился во многом из-за того, что при первых серьезных колебаниях на рынке страховочные программы-трейдеры принялись спешно закрывать убыточные позиции (так называемый стоп-лосс), дабы сохранить деньги клиентов. Людям подобная оперативность не всегда под силу. Правда, и в этом случае не обошлось без компьютерного сбоя - из-за большой активности на Нью-Йоркской бирже пришлось подключать запасной сервер, но он не смог сразу вступить в работу, и вследствие возникшей паузы финансовая паника лишь возросла.

Версия для печати