Ariane 5, рейс 501: как одно переполнение взорвало ракету за 40 секунд
4 июня 1996 года ракета Ariane 5 в первом же полёте развалилась и самоликвидировалась через 37 секунд после старта. На борту — четыре научных спутника, суммарно около полумиллиарда долларов, а вся разработка ракеты стоила миллиарды. Причина — не физика и не двигатели. Причина — одна конвертация числа в софте, которую никто толком не протестировал. Это один из самых поучительных кейсов в истории тестирования — разберём, что случилось и какие уроки забирает QA.
Что произошло
В Ariane 5 стояла инерциальная система отсчёта (SRI) — она вычисляет положение и скорость ракеты. Её софт почти без изменений взяли с предыдущей ракеты, Ariane 4. Внутри был кусок кода, который переводил горизонтальную скорость из 64-битного числа с плавающей точкой в 16-битное целое.
Ariane 5 стартовала мощнее и по более крутой траектории, чем Ariane 4. Горизонтальная скорость оказалась выше, чем предполагалось — и при конвертации число не влезло в 16 бит: произошло переполнение. Код не был защищён от этого: возникло необработанное исключение. SRI, вместо аккуратной обработки, выдала диагностический код ошибки — а система управления приняла эти биты за реальные полётные данные. Ракета резко отклонилась, начала разрушаться от аэродинамических нагрузок и сработала автоматическая самоликвидация. 37 секунд.
Почему дублирование не спасло
На борту было две SRI — основная и резервная, для надёжности. Но на них стоял один и тот же софт. Резервная упала на той же строке от того же переполнения за доли секунды до основной. Дублирование одинаковых блоков не защищает от ошибки в самом коде — оба экземпляра содержат один и тот же баг.
Вишенка: этот расчёт был вообще не нужен
Самое обидное: код, который упал, отвечал за выравнивание платформы перед стартом. После отрыва он не был нужен вовсе — но по наследству от Ariane 4 продолжал крутиться ещё несколько секунд после старта «на всякий случай». То есть ракету взорвал функционал, который в полёте не выполнял никакой полезной работы.
Уроки для QA
- Переиспользованный код — не значит проверенный. Он был валидирован под полётный конверт Ariane 4, а не Ariane 5. При реюзе компонента в новом контексте его надо перетестировать под НОВЫЕ входные данные и условия, а не считать «раз работало — работает».
- Тестируй границы и переполнения. Конвертацию float→int оставили без защиты сознательно — на основе предположений старой ракеты. Любое сужение типа (64→16 бит) — это граница, которую надо бить максимальными/невозможными значениями.
- Мёртвый и лишний функционал — это риск. Расчёт, который после старта не нужен, продолжал работать и убил ракету. Код, который «просто на всякий случай крутится», должен либо иметь причину, либо быть выключен.
- Дублирование с одинаковым софтом ≠ отказоустойчивость. Идентичные копии падают идентично. Настоящая избыточность требует разнообразия (другой алгоритм/реализация) — или хотя бы понимания, что от программных багов «второй такой же» не спасает.
- Обработка ошибок и fail-safe. Исключение привело к выдаче мусора, принятого за данные. Система должна деградировать безопасно, а не «падать в диагностику», которую кто-то интерпретирует как рабочий сигнал.
- Тест в реальной конфигурации и на реальных данных. SRI ни разу не прогнали с настоящей траекторией Ariane 5 — только с предположениями Ariane 4. Это классическая дыра системного/интеграционного тестирования: компонент по отдельности «работает», но в реальном окружении с реальными входами — нет.
Коротко — что забрать с собой
- Ракету за $370 млн уронила одна незащищённая конвертация числа — не железо, а софт.
- Переиспользованный код надо перетестировать в новом контексте; «раньше работало» — не аргумент.
- Сужение типов = граница: бей максимумом, переполнением, невозможными значениями.
- Мёртвый функционал, крутящийся «на всякий случай», — источник риска.
- Дублирование одинаковым софтом не защищает от бага в этом софте.
- Тестируй в реальной конфигурации и на реальных данных, а не на предположениях.
Почитать: Ariane flight V88 (Wikipedia) · Отчёт комиссии по расследованию (Inquiry Board) · Ariane 5 report — зеркало