Fusée Ariane 5 —
Que s'est-il passé ?

Par Matt Flecher
10 octobre 2020
Photo Article

La fusée Ariane 5 a explosé le 4 juin 1996 à 9h33 (GMT-3) seulement 36,7 secondes après son décollage du centre spatial de Kourou en Guyane à cause d’un dysfonctionnement logiciel (bug).

Le problème proviendrait d’une erreur du système de référence inertielle (SRI) qui permet de calculer la position exacte de la fusée lors du décollage. Ce système transmet les informations aux moteurs qui permettent de maintenir l’altitude et la direction.

Or, 37 secondes après la séquence d’allumage du moteur principal, le SRI rencontre une erreur (exception) lorsqu’il tente de convertir une variable de type floating-point d’une taille de 64 bits en un integer signé de 16 bits, un integer overflow. Le logiciel ne comportant pas de error handler (gestionnaire d’erreur) pour cette conversion, elle cause la fermeture du logiciel et la transmission d’informations de diagnostic au calculateur principal qui les interprète comme des données de vol et ordonne une correction importante de la trajectoire de vol. Suite à cette brutale déviation, les boosters (accélérateurs latéraux) sont arrachés, ce qui cause le déclenchement du mécanisme d’autodestruction préventif et l’explosion de la fusée.

Les problèmes du logiciel seraient liés à la réutilisation du code de la fusée Ariane 4 pour laquelle un overflow n’aurait pas été possible lors du lancement. En effet, l'accélération horizontale de Ariane 5 était près de cinq fois supérieure à celle de son prédécesseur et dépassait la limite d'un entier signé stockable sur 16 bits (32 767). De plus, cette partie du code n’étant pas nécessaire pour Ariane 5, aucun test n’avait été réalisé sur celle-ci.

Le code utilisé

 1: declare
 2:   vertical_veloc_sensor: float;
 3:   horizontal_veloc_sensor: float;
 4:   vertical_veloc_bias: integer;
 5:   horizontal_veloc_bias: integer;
 6:   ...
 7: begin
 8:   declare
 9:     pragma suppress(numeric_error, horizontal_veloc_bias);
10:   begin
11:    sensor_get(vertical_veloc_sensor);
12:    sensor_get(horizontal_veloc_sensor);
13:    vertical_veloc_bias := integer(vertical_veloc_sensor);
14:    horizontal_veloc_bias := integer(horizontal_veloc_sensor);
15:    ...
16:   exception
17:     when numeric_error => calculate_vertical_veloc();
18:     when others => use_irs1();
19:   end;
20: end irs2;

Les vélocités horizontales et verticales sont déclarées comme des variables de type float (lignes 2 et 3). La conversion est effectuée aux lignes 13 et 14.

Conclusions de l'Agence Spatiale Européenne