Помилка Аріан 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. 

Посилання[ред. | ред. код]