On 4 June 1996, the first Ariane 5 rocket took off from Kourou. About 40 seconds after the flight sequence began, at an altitude of about 3,700 m, it veered off its path, broke up and exploded.
Ariane 5 tracked its attitude with two Inertial Reference Systems (SRIs), small computers with their own sensors. One was active, the other a hot standby, with identical hardware and software, practically the same software as on Ariane 4.
One part of it, an alignment function, only did useful work before lift-off. It still ran for about 40 seconds of flight, a leftover requirement from Ariane 4 that Ariane 5 didn't need. Inside it, a value called BH (horizontal bias) was converted from a 64-bit floating-point number to a 16-bit signed integer. Ariane 5's early trajectory gives much higher horizontal speeds than Ariane 4's, so BH grew bigger than 16 bits can hold, and the conversion raised an error.
Engineers had found seven variables whose conversions could fail this way and protected four. BH was one of three left unprotected, on reasoning that, the Board wrote, "turned out to be faulty". The Ariane 5 trajectory wasn't in the SRI's requirements, and no test ran the SRI through it.
The specification said: on any exception, shut the processor down. The standby SRI hit the error and stopped. In the next 72-millisecond data cycle, about 0.05 seconds later, the active one did the same. The flight computer read the SRI's diagnostic output as flight data and swung the engine nozzles to full deflection.
The Board noted the shutdown rule was built for random hardware failures, which a backup can cover. A software bug sits in both copies: here it switched off two healthy units.
- About 40 seconds into the flight, at about 3,700 m
- A 64-bit value converted into a 16-bit integer
- 7 variables with risky conversions found, 4 protected, 3 not
- About 0.05 seconds (one 72 ms data cycle) between the two SRI failures
Why it matters: A backup only helps against independent failures; two copies of the same code fail together on the same input. Check reused code's limits against its new job.