Взрыв ракеты Ariane 5 вызвала ошибка переполнения


4 июня 1996 г., меньше чем через минуту после своего первого старта, французская ракета Ariane 5 самоликвидировалась. Для расследования этого происшествия была назначена комиссия из сотрудников CNES (Национальный Центр космических исследований) и ESA (Европейское Космическое Агентство) под председательством специалиста по прикладной математике Jacques-Louis Lions. История раскрытия программной ошибки, которая привела к аварии, изложена на основе английского перевода отчета комиссии за N 146.

Согласно документации и информации, доступной комиссии, погода на стартовой площадке в Kourou, Французская Гвиана, утром 4 июня 1996г. была приемлема для старта. В частности, не было никакого риска молнии, так как напряженность электрического поля, измеряемого на стартовой площадке, была незначительна. Единственная неопределенность была в соответствии погоды требованиям по видимости.

Обратный отсчет шел гладко до 7-й минуты перед планируемым стартом, когда старт был задержан, потому что видимость не соответствовала необходимым критериям. Однако в соответствии с прогнозом условия видимости улучшились, и пуск был начат. Зажигание двигателя Vulcain и двух твердотопливных стартовых ускорителей прошло нормально, и ракета стартовала. Полет продолжался нормально 37 секунд после старта. Далее ракета внезапно изменила направление полета и взорвалась. Предварительное исследование данных полета показало.

Происхождение сбоя было, таким образом, быстро локализовано и оказалось в системе управления полетом, а более точно - в двух инерциальных системах ориентации, которые прекратили функционирование почти одновременно приблизительно на 36.7-й секунде полета.

Информация, доступная комиссии, включала данные телеметрии, получаемые на земле до 42-й секунды после старта, данные траектории по радарам, оптические наблюдения (инфракрасная камера, пленки) и результаты исследования обломков.

Самоликвидация произошла на высоте приблизительно 4000 метров. Сбор обломков, которые были рассеяны над областью около 12 кв. километров, оказался затруднительным, так как эта область практически вся является мангровыми болотами или саванной. Тем не менее, оказалось возможным собрать и восстановить обе SRI из обломков. Особенно интересной была та SRI, которая работала в активном режиме и прекратила функционирование последней, и для которой поэтому часть информации не была доступна в данных телеметрии (передача этой информации на землю прекращается вне зависимости от того, какая SRI отказала первой).

Результаты исследования активной SRI были очень полезны при анализе последовательности сбоев.


Анализ сбоя

В общих чертах система управления полетом Ariane 5 имеет стандартную конструкцию. Положение и движения ракеты в пространстве измеряется SRI. SRI имеет собственный внутренний компьютер, в котором углы и скорости вычисляются на основе информации от лазерных гироскопов и акселерометров. Данные из SRI передаются через шину данных в бортовой компьютер (on-board computer - OBC), который выполняет программу полета и управляет соплами твердотопливных ускорителей и криогенного двигателя Vulcain через сервораспределители и гидроприводы.

Для повышения надежности имеется значительная избыточность на уровне оборудования. Две SRI функционируют параллельно с идентичными аппаратными средствами и программным обеспечением. Одна SRI является активной, а другая находится в горячем резерве; если OBC обнаруживает, что активная SRI отказала, он немедленно переключается на другую, что обеспечивает правильное функционирование системы. Аналогично имеются два OBC, а также дублирован ряд других модулей в системе управления полета.

Конструкция SRI, используемая в Ariane 5, почти идентична SRI в Ariane 4, особенно в плане ПО. На основе документации и данных, ставших достоянием комиссии, была установлена следующая цепочка событий, начинающихся с самоликвидации ракеты и прослеженная обратно во времени к первичной причине.

Ракета-носитель начала разламываться приблизительно на 39-й секунде из-за высоких аэродинамических нагрузок, появившихся вследствие увеличения угла атаки до величины больше, чем 20 градусов. Это привело к отделению ускорителей от самой ракеты, что, в свою очередь, включило самоликвидацию ракеты-носителя.

Такой угол атаки был вызван полным отклонением сопел твердотопливных ускорителей и главного двигателя Vulcain.

Отклонения сопел управлялись ПО бортового компьютера (OBC) на основе данных активной SRI (SRI 2). Часть данных в течение этого времени состояла не из нормальных данных полета, а представляла диагностический набор данных компьютера SRI 2, который интерпретировался как данные полета.

SRI 2 не посылала правильные данные положения, потому что система определила сбой из-за возникновения исключительного состояния при выполнении вычислений.

OBC не смог переключиться на резервную SRI (SRI 1), потому что эта система уже прекратила функционировать в течение предыдущего цикла обработки данных (период в 72 миллисекунд) по той же самой причине, что и SRI 2.

Внутреннее исключительное состояние при выполнении вычислений в ПО SRI произошло во время выполнения преобразования данных из 64-битового числа с плавающей запятой в 16-битовое целое число со знаком. Значение числа с плавающей запятой было большим, чем то, что могло бы быть представлено 16-битовым целым числом со знаком. В результате, возникла ошибка операнда. Эти команды преобразования данных (в тексте программы на языке Ада) не были защищены от ошибок операнда, хотя другие преобразования подобных переменных в том же самом месте в тексте программы были защищены.

Ошибка произошла в той части ПО, которое управляет только выравниванием платформы системы инерциальной навигации. Результаты, вычисленные этим программным модулем, имеют значение только до старта. После старта результаты работы этого модуля не используются. Функция выравнивания работает в течение 50 секунд после начала режима полета для SRI (3 секунды перед стартом для Ariane 5). Следовательно, после старта эта функция выполняется приблизительно в течение 40 секунд полета. Эта временная последовательность основана на требованиях Ariane 4, которые не относятся к Ariane 5.

Ошибка операнда произошла из-за непредвиденно высокого значения результата функции внутреннего выравнивания, называемого BH (горизонтальное смещение), который имеет отношение к горизонтальной скорости платформы SRI. Это значение вычисляется для определения точности выравнивания. Значение BH было намного выше ожидаемого, т.к. начальный участок траектории Ariane 5 отличается от подобного участка для Ariane 4 и приводит к значительно большим значениям горизонтальной скорости.

Внутренние события в SRI, которые привели к сбою, были воспроизведены при моделировании вычислений. Более того, оба SRI были восстановлены в ходе исследований комиссии и состояние системы на момент сбоя было точно определено посредством считывания памяти. Кроме того, комиссия изучила программный код, который, как было показано, не противоречил сценарию сбоя.

Комиссия постановила, что достоверно установлена последовательность событий, отражающих технические причины сбоя.


Комментарии сценария сбоя

Согласно сценарию сбоя, первичной технической причиной стала ошибка операнда, которая произошла в преобразовании переменной BH горизонтального смещения, и отсутствие защиты этого преобразования, которое заставило компьютер SRI остановиться.

Комиссии сообщили, что не все преобразования были защищены, потому что для компьютера SRI была установлена максимальная рабочая нагрузка в 80%. Чтобы определить уязвимость незащищенного кода, при разработке выполнялся анализ для каждой операции, которая могла бы вызывать исключительное состояние, включая ошибку операнда. В частности, было проанализировано преобразование чисел с плавающей запятой в целые числа, и найдены семь переменных, действия с которыми могли привести к ошибкам операнда. В результате этого была добавлена защита для четырех переменных. Однако три переменные были оставлены незащищенными. Никаких прямых ссылок на оправдание этого решения не было найдена в исходном коде.

Три остающихся переменных, включая ту, что обозначала горизонтальное смещение, были не защищены. Это было сделано на основе рассуждений, которые показывали, что значения этих переменных были физически ограничены или имелся большой запас по безопасности - рассуждения, которые для переменной BH оказались ошибочными.

Не имеется никаких доказательств, что какие-либо данные о траекториях использовались для анализа поведения незащищенных переменных. Более того, важно отметить, что существовало совместное соглашение о невключении данных траектории Ariane 5 в требования и спецификации SRI.

Хотя источник ошибки операнда был идентифицирован, само по себе это исключительное состояние не приводило к отказу. Отказу способствовала и специфика механизма обработки особых ситуаций: в случае любого вида исключительной ситуации, согласно спецификации системы, сбой должен быть отражен на шине данных, состояние системы на момент сбоя должно быть сохранено в памяти ЭСППЗУ (которое было найдено и прочитано в случае с Ariane 5) и, в заключение, процессор SRI должен быть остановлен.

Решение об остановке процессора и оказалось фатальным. Рестарт системы невозможен, так как повторное вычисление положения слишком трудно после остановки процессора - следовательно, SRI становится бесполезной. Причина принятия таких радикальных мер [остановки системы] лежит в том, что в требованиях к программе Ariane учитывалась возможность только случайных аппаратных сбоев. С этой точки зрения, в качестве механизма обработки ошибок и исключительных ситуаций, разработанного для защиты от случайных сбоев оборудования, весьма рационально применить резервирование систем.

Хотя, в данном случае, сбой и явился следствием систематической ошибки ПО, могли бы быть предложены механизмы решения этого типа проблем. Например, компьютеры внутри модулей SRI могли бы продолжать работать и выдавать наиболее близкие оценки значений требуемой информации о положении. Существуют причины, по которым следует опасаться реализаций, когда исключительное состояние может или даже должно вызвать останов системы при работе в режиме реального времени. Потеря функционирования ПО рискованна, потому что то же самое ПО исполняется в обеих SRI. В случае ракеты-носителя Ariane 5, это привело к выключению двух еще исправных критически важных систем.

Первоначальное требование непрерывного функционирования ПО выравнивания после старта было выдвинуто больше, чем 10 лет назад для более ранних моделей Ariane, для того, чтобы справиться с довольно маловероятным событием задержки при обратном отсчете перед стартом, например, между 9-й секундой, когда режим полета включается в SRI Ariane 4, и 5-й секундой, когда отмена некоторых процессов, инициализированных в ракете, потребовала бы несколько часов. Период, выбранный для этой операции выравнивания - 50 секунд после начала режима полета - основан на времени, необходимом наземной аппаратуре для восстановления полного управления в случае задержки.

Эта особенность делала возможным в более ранних версиях Ariane перезапуск обратного отсчета без ожидания нормального выравнивания, которое потребовало бы 45 минут или больше, так, чтобы короткое временное "окно" для старта можно было бы все еще использовать. Фактически, это свойство использовалось один раз - в 1989 г.

Подобная особенность не имеет отношения к Ariane 5, которая имеет другую последовательность подготовки к старту, и поддерживается из общих соображений о том, что если не доказана необходимость изменений, не надо ничего трогать в ПО, которое хорошо работало на Ariane 4.

Даже в случае, когда выполняются отмеченные выше условия, сомнительно, что функция выравнивания должна действовать после старта. Выравнивание платформы требует применения сложных математических функций фильтрации для правильной установки оси "X" по отношению к направлению силы тяжести и нахождения направления на север из данных о вращении земли. Предположение о предполетном выравнивании состоит в том, что ракета установлена в известной и фиксированной позиции. Поэтому работа функции выравнивания полностью нарушается в течение полета: движения ракеты интерпретируются как смещения датчика.

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

Основным лейтмотивом в разработке Ariane 5 было намерение уменьшить возможность случайного сбоя. Поставщик SRI следовал спецификациям, которые обуславливали, что в случае любой обнаруженной исключительной ситуации процессор должен был быть остановлен. Исключительная ситуация, которая произошла, относилась не к произвольному сбою, а была ошибкой разработки. Исключительная ситуация была обнаружена, но была обработана неподобающим образом, потому что было принято считать, что ПО должно рассматриваться, как правильное, пока не доказано обратное. Комиссия имеет основания предполагать, что этот же принцип лежит в основе и других разработок ПО для Ariane 5. Комиссия придерживается противоположной точки зрения - что ПО должно изначально считаться содержащим ошибки, пока использование принятых в настоящее время самых лучших практических методов не докажет, что оно правильное.

Это значит, что, критически важное ПО - в смысле, что сбой этого ПО подвергает опасности все задание - должно исследоваться с очень высоким уровнем детализации, и что стратегия дублирования должна принимать во внимание программные сбои.

1996 Общество Индустриальной и Прикладной Математики SIAM Новости, Vol. 29. #8, октябрь 1996 г.


КОМПЬЮТЕР-ИНФОРМ