summary
1996-06-04,欧洲航天局 Ariane 5 首飞(501)在起飞后约 37 秒(主引擎点火序列后 37s)因惯性基准系统(SRI)软件异常失去全部制导与姿态信息,火箭偏离航向、在空中解体爆炸,搭载的 4 颗 Cluster 卫星与火箭本身(约 5 亿美元)损毁。这是软件工程史上最著名的算术边界灾难之一。
timeline
发射后约 30s(升空),SRI 的对齐功能(仅升空前有意为之、升空后仍运行,系自 Ariane 4 复用的遗留)将一个 64 位浮点水平速度值转换为 16 位有符号整数。因 Ariane 5 水平速度远超 Ariane 4,值超过 32767,转换溢出且未捕获。约 36s 两个 SRI 同时失效;主用先瘫,热备 72ms 后以相同原因瘫。制导计算机收到诊断位模式误当飞行数据,命令喷管偏转到极限,火箭气动解体。
root_cause
SRI 软件将对齐例程中一个 64 位浮点水平速度值转换为 16 位有符号整数,未做溢出保护。该代码从 Ariane 4 复用,在 Ariane 4 上数值不会溢出,但 Ariane 5 速度更快、数值超界;转换溢出抛出异常,而异常处理缺省动作是关闭系统,导致 SRI 关闭并向计算机发送错误数据。
amplifiers
① 复用未重分析:为省钱复用 Ariane 4 代码却未针对新轨迹重新验证。② 无异常捕获:溢出未设陷阱,异常默认关系统。③ 同源冗余:主备 SRI 运行完全相同软件,备份以同样方式失败,冗余形同虚设。④ 下游信任:制导计算机把诊断位模式当作真实飞行数据,发出致命指令。
mitigation
ESA 调查后:升空后关闭/抑制对齐功能;SRI 处理在检测故障时不再关闭处理器;对所有嵌入式软件关键重审;改进测试代表性(用真实设备与真实轨迹仿真);增加逐级测试重叠与冗余。
lessons
复用代码必须针对新环境重分析;安全关键系统禁止无保护的类型转换;冗余必须真正独立(不同实现)而非同源副本;异常必须被显式处理而非默认关系统。
checklist
① 所有数值转换加边界检查与异常捕获。② 复用组件强制重做影响分析与测试。③ 关键冗余采用异质实现。④ 故障模式默认 fail-safe 而非 fail-silent/关闭。