37 секунд полёта: как ошибка уничтожила ракету Ariane 5
37 секунд полёта: как ошибка уничтожила ракету Ariane 5
4 июня 1996 года новая Ariane 5 потеряла управление и разрушилась через 37 секунд. Как переполнение одного числа превратилось в провал всей системы и почему важно обращать внимание на мелочи.
4 июня 1996 года с космодрома во Французской Гвиане стартовала первая ракета Ariane 5. На борту находились четыре научных спутника Cluster, над которыми работали около десяти лет.
Первые секунды всё шло нормально. Затем ракета резко отклонилась от курса, начала разрушаться из-за аэродинамических нагрузок и запустила систему самоуничтожения. От начала стартовой последовательности прошло около 37 секунд.
Причиной оказался не отказ двигателя и не повреждённый датчик. Ракету погубило число, которое не поместилось в выделенную для него переменную.
Старый код установили на новую ракету
Ariane 5 создавалась как замена успешной Ariane 4. Разработчики решили повторно использовать часть проверенного программного обеспечения, включая код инерциальной системы навигации.
Само по себе повторное использование кода — нормальная практика. Переписывать работающую систему с нуля обычно опаснее, чем взять уже испытанное решение. Но у Ariane 5 была другая траектория и более высокая горизонтальная скорость.
Код сохранили, а старые предположения о допустимых значениях данных — не пересмотрели. Более того, проблемная функция отвечала за выравнивание платформы перед запуском. После отрыва ракеты она уже не была нужна, однако продолжала работать ещё около сорока секунд.
Число оказалось слишком большим
Внутри программы значение, связанное с горизонтальной скоростью, преобразовывалось из 64-битного числа с плавающей точкой в 16-битное знаковое целое.
Такой целый тип может хранить значения только от -32768 до 32767. Для траектории Ariane 4 этого диапазона хватало. Ariane 5 разгонялась иначе, поэтому значение вышло за допустимую границу.
Упрощённо опасная операция выглядела бы примерно так:
Horizontal_Value : Float; Converted_Value : Integer_16; Converted_Value := Integer_16(Horizontal_Value);
Если Horizontal_Value оказывается больше максимума для Integer_16, происходит переполнение. В бортовой программе оно вызвало исключение, после которого инерциальная система прекратила работу.
Проверки диапазона для этой переменной не было. Разработчики считали, что она физически не сможет получить слишком большое значение. Для Ariane 4 предположение было верным. Для новой ракеты — уже нет.
Почему не спас резервный компьютер
У Ariane 5 была резервная инерциальная система. Казалось бы, после отказа основного блока управление должно было автоматически переключиться на неё.
Но резервный блок использовал такое же программное обеспечение и обрабатывал те же данные. Он столкнулся с тем же переполнением практически в тот же момент.
Резервирование защитило бы от случайной поломки оборудования, но не от общей ошибки в коде. Два одинаковых компьютера с одинаковой программой не дают независимую защиту от неверного предположения разработчиков.
Сообщение об ошибке приняли за данные полёта
После сбоя инерциальная система отправила диагностическую информацию. Бортовой компьютер воспринял её не как сообщение об отказе, а как обычные данные о положении ракеты.
На основании этих чисел система управления решила, что Ariane 5 сильно отклонилась от курса. Она резко повернула сопла двигателей, пытаясь исправить несуществующую ошибку.
Настоящее отклонение возникло уже после этой команды. Ракета повернулась под слишком большим углом, аэродинамические нагрузки начали разрушать корпус, после чего сработала автоматическая система уничтожения.
Получилась неприятная цепочка: ненужная функция обработала неожиданное значение, два одинаковых блока остановились, диагностические данные попали в систему управления, а исправная ракета начала выполнять опасные команды.
Ошибка была не в одной строке
Историю Ariane 5 часто пересказывают как пример одной неправильной конвертации типов. Технически переполнение действительно запустило аварию. Но свести всё к неосторожному программисту было бы слишком удобно.
Код перенесли на ракету с другой траекторией. Диапазоны входных значений не пересмотрели. Ненужную после запуска функцию не отключили. Основная и резервная системы содержали одинаковую ошибку. А полное тестирование с реальными параметрами полёта Ariane 5 не провели.
Комиссия установила, что подробная системная симуляция могла обнаружить проблему до запуска. Однако во время испытаний использовали смоделированный выход инерциальной системы, а не её полную программную реализацию.
Чему эта авария учит разработчиков?
Первый вывод довольно приземлённый: проверенный код не становится универсальным. Если меняются входные данные, окружение или требования, старые гарантии перестают действовать.
Второй урок касается ошибок. Критическая система не должна полностью останавливаться из-за одного некорректного значения, если существует безопасный способ продолжить работу с ограниченной точностью или перейти в резервный режим.
И наконец, резервная копия той же ошибки остаётся той же ошибкой. Настоящая отказоустойчивость требует анализа общих причин сбоя, а не только установки второго одинакового блока.
Оцените материал:
Похожие записи
Главный ИТ-форум страны «Цифровые решения — 2026» впервые получил международный статус и собрал в НЦ «Россия» около 20 тысяч участников, включая представителей более 100 стран
16.10.2026
Tesla представила Roadster, работающий на энергии SpaceX, который летает и падает со стилем.
16.10.2026
Google разрешила устанавливать на Android приложения, созданные с помощью AI Studio, без публикации в Google Play
16.10.2026Присоединяйтесь и подпишитесь на рассылку самых свежих новостей по Email
Получайте свежие новости и идеи на почту. Без спама — только самое интересное.
Нажимая «Подписаться», вы соглашаетесь с политикой конфиденциальности.
