Помилка Аріан 5

Помилка у програмному забезпеченні ракети-носія Аріан 5 — помилка у програмному забезпеченні бортового комп'ютера, яка призвела до аварії ракети-носія Аріан-5 під час першого запуску 4 червня 1996 року. Ця помилка відома як одна з найдорожчих помилок в історії програмування[1].

Перший запуск
Зовнішній вигляд ракетоносія

Результати

Ракету розробляли десять років, витративши 7 мільярдів доларів.

Ракета виводила на орбіту чотири супутники для дослідження магнітосфери Землі, загальною вартістю 370 мільйонів доларів. Місію цих супутників завершили лише в двохтисячному за допомогою ракетоносія «Союз».

Це спричинило сплеск у дослідженнях формальних методів проектування комп'ютерних систем, оскільки зацікавленість у них і, відповідно, фінансування збільшились.

Причина невдачі

У програмі керування польотом ракети Аріан 5 використовувались фрагменти програмного забезпечення Аріан 4. Тестування роботи цього модуля було вирішено не проводити, оскільки він був запозичений з перевіреної, робочої програми. Проте під час переносу програмного забезпечення на нову ракету розробники врахували не всі особливості. Ракета мала дещо іншу траєкторію виходу на орбіту (більше прискорення), тому горизонтальна швидкість ракети вийшла за межі, які могла обробляти програма.

А саме, у програмі сталася помилка під час перетворення 64-розрядного числа з рухомою комою у 16-розрядне ціле. Надто велике значення дійсного числа не вмістилося в 16 розрядах, що спричинило переповнення.

Основний і резервний комп'ютери інерційної навігації мали однакову програму, таке резервування розраховане на захист від випадкових збоїв програм та несправностей апаратного забезпечення. Позаяк обидві програми працювали однаково, переповнення було отримане в обох комп'ютерах, після чого сопла повернулися під неправильним кутом. Сильні аеродинамічні тиски зруйнували корпус ракети, після чого спрацювала автоматична система самознищення.

Код

Код[2] написаний на мові Ада:

...
declare
 vertical_veloc_sensor: float;
 horizontal_veloc_sensor: float;
 vertical_veloc_bias: integer;
 horizontal_veloc_bias: integer;
 ...
begin
 declare
 pragma suppress(numeric_error, horizontal_veloc_bias);     -- UBW aus
 begin
 sensor_get(vertical_veloc_sensor);
 sensor_get(horizontal_veloc_sensor);
 vertical_veloc_bias := integer(vertical_veloc_sensor);
 horizontal_veloc_bias := integer(horizontal_veloc_sensor); -- Оператор, що спричинив помилку
 ...
 exception
   when numeric_error => calculate_vertical_veloc();        -- код обробки помилки
   when others => use_irs1();                               -- у цьому випадку виконується...
 end;
end irs2;

Примітки

  1. http://www.ima.umn.edu/~arnold/disasters/disasters.html
  2. Архівована копія. Архів оригіналу за 17 серпня 2008. Процитовано 16 травня 2010.

Посилання

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.