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