Il bug da 370 milioni di dollari.
Sintesi dell'articoloCome un numero troppo grande ha distrutto Ariane 5 dopo 37 secondi di volo, e cosa insegna a chi scrive software.

Il 4 giugno 1996 l'Agenzia Spaziale Europea ha perso il suo razzo nuovo dopo 37 secondi di volo. Con lui sono andati persi quattro satelliti scientifici, per un danno di circa 370 milioni di dollari.
Il motore funzionava e il meteo era buono. A far cadere Ariane 5 è stata una riga di codice che copiava un numero grande in una casella troppo piccola. Qui sotto trovi com'è andata, secondo per secondo, e perché nessuno se n'era accorto prima.
Un razzo nuovo, e dieci anni di lavoro.
Ariane 5 doveva essere il razzo più potente mai costruito in Europa. Il programma era durato dieci anni ed era costato circa sette miliardi di dollari. Il suo compito era portare in orbita satelliti più pesanti di quelli che Ariane 4 riusciva a reggere.
Il primo volo, chiamato 501, partiva dalla base di Kourou, nella Guyana francese. A bordo c'era la missione Cluster, quattro satelliti che dovevano studiare come il vento solare interagisce con il campo magnetico della Terra. Il decollo è avvenuto alle 9:33 ora locale, ed era perfetto.
- 10
- gli anni di sviluppo del programma
- 4
- i satelliti scientifici a bordo
- 37 s
- i secondi di volo prima del guasto
Quello che succede in tre secondi.
Per 36 secondi il volo procede come previsto. Poi, in meno di tre secondi, succede tutto quello che la commissione d'inchiesta ha ricostruito nei mesi dopo.
Decollo
Il razzo lascia la rampa di Kourou e sale regolare.
H0
Il primo computer si spegne
Il sistema di navigazione di riserva va in errore durante una conversione e si ferma.
H0 + 36,7 s
Cade anche il secondo
Il sistema principale incontra lo stesso errore e si spegne a sua volta, cinque centesimi di secondo dopo.
H0 + 36,7 s
La sterzata
Il computer di bordo legge i messaggi d'errore come dati di volo e orienta gli ugelli al massimo.
H0 + 37 s
La rottura
Il razzo si piega oltre i 20 gradi, le forze dell'aria lo spezzano e scatta l'autodistruzione.
H0 + 39 s
L'esplosione avviene a circa 3.700 metri d'altezza. I rottami cadono su circa dodici chilometri quadrati di palude e savana a est della rampa, e vengono recuperati per le analisi.

Un numero che non ci stava.
Il sistema di navigazione calcolava un valore chiamato «horizontal bias», legato alla velocità orizzontale del razzo. Il programma era scritto in Ada, e quel valore era un numero decimale a 64 bit.
A un certo punto il codice lo convertiva in un numero intero a 16 bit con segno. È una casella molto più piccola, che arriva al massimo a 32.767. Finché il valore restava sotto quella soglia la conversione funzionava, e su Ariane 4 era sempre stato così.
Ariane 5 però accelerava molto di più, e la sua velocità orizzontale cresceva cinque volte più in fretta. Dopo 36 secondi il valore ha superato 32.767. La conversione è andata in overflow, cioè ha prodotto un risultato che la casella non poteva contenere, e il programma ha sollevato un'eccezione.
Sette variabili a rischio, tre senza protezione.
Il punto che il carosello non racconta è che i progettisti il rischio l'avevano visto. Nel codice c'erano sette variabili che potevano sforare durante una conversione, e quattro erano protette da un controllo.
Le altre tre erano rimaste scoperte per una ragione precisa. Il computer del sistema di navigazione non doveva mai lavorare oltre l'80% della sua capacità, e ogni controllo in più consumava calcolo. Per quelle tre variabili si era deciso che i valori non potessero crescere abbastanza da creare problemi.
Il ragionamento era giusto, ma valeva per le traiettorie di Ariane 4. Nessuno lo ha rifatto con quelle di Ariane 5, perché i dati di volo del razzo nuovo non erano stati inseriti nelle specifiche del sistema di navigazione.
Il codice che non serviva più.
La conversione stava dentro una funzione di allineamento, che serve a orientare il sistema di navigazione prima del decollo. Una volta partito il razzo non ha più nessuna utilità, eppure su Ariane 5 restava accesa per circa quaranta secondi dopo il decollo.
Il motivo stava tutto in Ariane 4. Se il conto alla rovescia si fermava negli ultimi secondi, quella funzione accesa permetteva di ripartire subito. Rifare l'allineamento da capo richiedeva infatti 45 minuti o più, e la finestra di lancio intanto si chiudeva.
La funzione di allineamento dopo il decollo
Su Ariane 4 serve a ripartire dopo un arrestoSu Ariane 5 non serve, resta accesa per uniformità
Il valore del «horizontal bias»
Su Ariane 4 resta sotto 32.767Su Ariane 5 supera 32.767 dopo 36 secondi
Ariane 5 si preparava al lancio in un altro modo e quel requisito non aveva senso. La funzione è rimasta lo stesso, per tenere uguale il software dei due razzi. Quindi il razzo è caduto per un calcolo che nessuno aveva bisogno di fare.
Due computer uguali cadono insieme.
Il sistema di navigazione era doppio, come si fa su tutto quello che vola. Uno lavorava, l'altro restava pronto a subentrare in caso di guasto. Il problema è che i due computer erano identici, con lo stesso hardware e lo stesso software.
La ridondanza protegge dai guasti fisici, come un componente che si brucia in uno solo dei due. Un errore di programma invece si ripete uguale su entrambi, perché entrambi fanno lo stesso calcolo con gli stessi dati. Il computer di riserva è caduto per primo, e quello principale lo ha seguito un istante dopo.
Anche la reazione all'errore era pensata per i guasti fisici. Il sistema doveva segnalare il problema e spegnersi, lasciando il posto al gemello. Il computer di bordo però ha ricevuto quella segnalazione come se fosse un dato di volo, e ha corretto la rotta in base a numeri che non significavano niente.
Cosa è successo dopo.
L'ESA e l'agenzia spaziale francese hanno nominato una commissione d'inchiesta, guidata dal matematico Jacques-Louis Lions. Il rapporto è uscito il 19 luglio 1996, sei settimane dopo il lancio, ed è diventato uno dei documenti più studiati nei corsi di ingegneria del software.
- Le specifiche del sistema di navigazione dovevano includere le traiettorie vere di Ariane 5.
- Le funzioni che non servono in volo andavano spente subito dopo il decollo.
- I test dovevano usare i componenti veri in una simulazione completa, e non loro imitazioni.
- Il codice riusato andava riesaminato con i limiti del nuovo razzo, uno per uno.
La missione Cluster è stata ricostruita e i nuovi satelliti sono partiti nell'estate del 2000, su due razzi Soyuz. Ariane 5 ha volato ancora per ventisette anni, con 117 lanci in tutto. Nel 2021 ha portato in orbita il telescopio James Webb, e l'ultimo volo è stato nel luglio 2023.
Perché ne parliamo noi.
Un sito o un gestionale non esplode a 3.700 metri. Il meccanismo però è lo stesso che vediamo spesso, quando un pezzo di codice che funzionava altrove viene portato in un posto nuovo senza essere riguardato.
Succede con il modulo di contatto copiato dal sito vecchio, che nessuno ha provato con i campi nuovi. Succede con il foglio di calcolo che regge cento righe e si pianta alla millesima. E succede con il campo del codice cliente che a cinque cifre andava bene, finché i clienti non sono diventati centomila.
Il software fallisce dove hai smesso di guardare.
Per questo, quando costruiamo uno strumento su misura, lo proviamo con i numeri veri dell'azienda e non con tre righe di esempio. E quando riusiamo un pezzo di codice nostro, controlliamo che i suoi limiti vadano bene anche per il lavoro nuovo.
