案例库 · 软件与 IT · 技术决策 · 1996
阿丽亚娜 5 号升空 37 秒后爆炸——因为一个软件溢出错误
一个 64 位浮点数被强转成 16 位整数。结果溢出了,计算机崩溃了,那枚 3.7 亿美元的火箭自毁了。
ESA · 阿丽亚娜航天公司 · 1996-06-04
怎么回事
1996 年 6 月 4 日,阿丽亚娜 5 号的首飞在升空 37 秒后终结。惯性基准系统里的一个软件异常,把诊断数据当成飞行数据喂给了飞行计算机;计算机照做了,把发动机喷管猛地偏转过去。火箭俯仰角超过 20 度攻角,气动载荷把助推器撕脱,自动自毁启动——摧毁了这枚火箭和它搭载的四颗 Cluster 科学卫星。
根源被追溯到一段从更老的阿丽亚娜 4 号系统复用来的软件。在飞行的第一阶段,水平速度偏差 (BV) 比阿丽亚娜 4 号高得多。代码试图把这个 64 位浮点数转换成一个 16 位有符号整数。因为这个值超过了 16 位整数的上限,发生了一次算术溢出。
最残酷的细节是:溢出的那段程序是一个只在升空前才需要的对准功能。它之所以一直运行到飞行中,纯粹是因为它在阿丽亚娜 4 号上一直这么运行——而那枚火箭更平缓的轨迹让这个值小到能装得下。两个冗余的惯性基准单元运行着完全相同的代码,所以备份在和主单元同一毫秒里失效了。
为什么会这样
- 一个 64 位浮点数在没有范围检查的情况下被转换成 16 位整数,引发了一次算术溢出异常。
- 这个软件模块从阿丽亚娜 4 号继承而来,却从没针对阿丽亚娜 5 号不同的飞行剖面做过验证。
- 关键的冗余被废掉了:两个惯性基准单元 (SRI) 运行相同的代码,所以同时失效。
- 溢出的那个对准程序在升空后毫无用处——一段死代码,却上了膛在运行。
代价3.7 亿美元的火箭代价高昂
教训
如果运行环境变了,跨系统复用代码就很危险。要验证每一个假设在新环境里都还成立。
后来呢
这一事件促使欧洲航天局 (ESA) 对软件认证流程进行了大规模改革。它成为软件工程学院的经典案例,说明“它以前能用”这一假设的灾难性代价,以及严格边界测试的必要性。
资料来源
发现哪里写错了?告诉我们。
类似的案例
这家公司栽倒的地方,别处有人漂亮地解开过。 第二意见 →

Comments · 0
登录 后就能评论。