Читаем Мифы о безопасном ПО - уроки знаменитых катастроф полностью

В конце концов, было бы странно, если бы тривиальная ошибка переполнения (даже если она и возникла) была бы столь фатальной, что с ней невозможно бороться. Почему же программный код (написанный на таком оснащенном всеми необходимыми для обеспечения надежности средствами языке, как Ада) оказался незащищеным до такой степени, что наступили столь катастрофические последствия?

Расследование показало, что в данном программном модуле присутствовало целых семь переменных, вовлеченных в операции преобразования типов. Оказалось, что разработчики проводили анализ всех операций, способных потенциально генерировать исключение, на уязвимость. И это было их вполне сознательным решением добавить надлежащую защиту к четырем переменным, а три включая BH, оставить незащищенными. Основанием для такого решения была уверенность в том, что для этих трех переменных возникновение ситуации переполнения невозможно в принципе. Уверенность эта была подкреплена расчетами, показывающими, что ожидаемый диапазон физических полетных параметров, на основании которых определяются величины упомянутых переменных, таков, что к нежелательной ситуации привести не может. И это было верно но для траектории, рассчитанной для модели Ariane 4. А ракета нового поколения Ariane 5 стартовала по совсем другой траектории, для которой никаких оценок не выполнялось. Между тем она (вкупе с высоким начальным ускорением) была такова, что "горизонтальная скорость" превзошла расчетную (для Ariane 4) более чем в пять раз.

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

Этот механизм предусматривал следующие три основных действия. Прежде всего, информация о возникновении нештатной ситуации должна быть передана по шине на бортовой компьютер OBC; параллельно она вместе со всем контекстом записывалась в перепрограммируемую память EEPROM (которую во время расследования удалось восстановить и прочесть ее содержимое), и наконец, работа процессора IRS должна была аварийно завершиться. Последнее действие и оказалось фатальным именно оно, случившееся в ситуации, которая на самом деле была нормальной (несмотря на сгенерированное из-за незащищенного переполнения программное исключение), и привело к катастрофе.

Осмысление

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

Ж.-М. Жезекель (J.-M. Jezequel) и Б.Мейер (B.Meyer) [2] пришли к совершенно однозначному выводу: допущенная (и так и не выявленная) программная ошибка носит, по их мнению, чисто технический характер и коренится в некорректной практике повторного использования ПО. Более точная формулировка: роковую роль сыграло отсутствие точной спецификации повторно-используемого модуля.

Расследование показало, что обнаружить требование, устанавливающее максимальную величину BH (вмещающуюся в 16 битов), можно было с большим трудом: оно затерялось в приложениях к основному спецификационному документу. Мало того, в самом коде на этот счет не было никаких комментариев, не говоря уже о ссылке на документ с обоснованием этого требования.

В качестве панацеи в такого рода ситуациях авторы предложили задействовать принцип "Контрактного Проектирования" (что и неудивительно, ибо его разработчиком как раз и является Мейер [3]). Именно "контракт" в духе языка Eiffel, явным образом (с помощью пред- и пост-условий) устанавливающий для любого программного компонента ограничения на входные и выходные параметры, и мог бы предотратить катастрофическое развитие событий. Был приведен и набросок такого контракта:

convert (horizontal_bias:INTEGER): INTEGER is require horizontal_bias "= Maximum_bias do ...

ensure ...

end

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

Перейти на страницу:

Похожие книги

100 великих загадок современности
100 великих загадок современности

Новая книга из серии «100 великих» посвящена ряду загадок отечественной и всемирной истории XX и начала XXI века. Порой кажется, что столетие, лишь недавно канувшее в Лету, дает нам поводов для размышлений и материала для исследований больше, чем все прошедшие века и тысячелетия человеческой истории. Две мировые войны, множество локальных военных конфликтов, революции и гражданские войны, заговоры, путчи и перевороты, экономические «чудеса» и тяжелейшие кризисы, выдающиеся достижения культуры и великие научные открытия, взлеты и падения человеческого духа – все это уместилось на относительно небольшом хронологическом отрезке. Читателю предлагаются оригинальные версии, результаты исследований ученых, краеведов, журналистов.

Николай Николаевич Непомнящий

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

Гравитационные волны были предсказаны еще Эйнштейном, но обнаружить их удалось совсем недавно. В отдаленной области Вселенной коллапсировали и слились две черные дыры. Проделав путь, превышающий 1 миллиард световых лет, в сентябре 2015 года они достигли Земли. Два гигантских детектора LIGO зарегистрировали мельчайшую дрожь. Момент первой регистрации гравитационных волн признан сегодня научным прорывом века, открывшим ученым новое понимание процессов, лежавших в основе формирования Вселенной. Книга Говерта Шиллинга – захватывающее повествование о том, как ученые всего мира пытались зафиксировать эту неуловимую рябь космоса: десятилетия исследований, перипетии судеб ученых и проектов, провалы и победы. Автор описывает на первый взгляд фантастические технологии, позволяющие обнаружить гравитационные волны, вызванные столкновением черных дыр далеко за пределами нашей Галактики. Доступным языком объясняя такие понятия, как «общая теория относительности», «нейтронные звезды», «взрывы сверхновых», «черные дыры», «темная энергия», «Большой взрыв» и многие другие, Шиллинг постепенно подводит читателя к пониманию явлений, положивших начало эре гравитационно-волновой астрономии, и рассказывает о ближайшем будущем науки, которая только готовится открыть многие тайны Вселенной.

Говерт Шиллинг

Научная литература / Прочая научная литература / Образование и наука