1996 年 6 月 4 日,阿丽亚娜 5 号的首飞在升空 37 秒后终结。惯性基准系统里的一个软件异常,把诊断数据当成飞行数据喂给了飞行计算机;计算机照做了,把发动机喷管猛地偏转过去。火箭俯仰角超过 20 度攻角,气动载荷把助推器撕脱,自动自毁启动——摧毁了这枚火箭和它搭载的四颗 Cluster 科学卫星。

根源被追溯到一段从更老的阿丽亚娜 4 号系统复用来的软件。在飞行的第一阶段,水平速度偏差 (BV) 比阿丽亚娜 4 号高得多。代码试图把这个 64 位浮点数转换成一个 16 位有符号整数。因为这个值超过了 16 位整数的上限,发生了一次算术溢出。

最残酷的细节是:溢出的那段程序是一个只在升空前才需要的对准功能。它之所以一直运行到飞行中,纯粹是因为它在阿丽亚娜 4 号上一直这么运行——而那枚火箭更平缓的轨迹让这个值小到能装得下。两个冗余的惯性基准单元运行着完全相同的代码,所以备份在和主单元同一毫秒里失效了。

3.7 亿美元的火箭

一个 64 位浮点数在没有范围检查的情况下被转换成 16 位整数,引发了一次算术溢出异常。

这个软件模块从阿丽亚娜 4 号继承而来,却从没针对阿丽亚娜 5 号不同的飞行剖面做过验证。

关键的冗余被废掉了:两个惯性基准单元 (SRI) 运行相同的代码,所以同时失效。

溢出的那个对准程序在升空后毫无用处——一段死代码,却上了膛在运行。

如果运行环境变了,跨系统复用代码就很危险。要验证每一个假设在新环境里都还成立。

这一事件促使欧洲航天局 (ESA) 对软件认证流程进行了大规模改革。它成为软件工程学院的经典案例,说明“它以前能用”这一假设的灾难性代价,以及严格边界测试的必要性。

从这里,追溯依据

参考来源

  1. Ariane flight V88 — Wikipedia en.wikipedia.org
  2. ARIANE 5 Flight 501 Failure: Report by the Inquiry Board (1996) esamultimedia.esa.int