Poketto

阿丽亚娜 5 号首飞 37 秒自毁:一个被“复用”的旧程序,把火箭送进了烟花

目录

文章主题概念插画

配图:AI 生成的概念示意图,非论文原图、真实现场或实验数据。

TL;DR:1996 年 6 月 4 日,欧洲新一代火箭阿丽亚娜 5 号(Ariane 5)首飞,升空约 37 秒后解体自毁。调查委员会认定的直接原因是惯性导航软件把一个 64 位浮点数塞进 16 位整数,数值超限触发异常,两套导航计算机相继停机。这段软件基本沿用自旧型号阿丽亚娜 4 号,而新火箭的飞行轨迹让数值远超旧值。报告没有给出损失金额;业内常引用的“约 3.7 亿美元”来自二手资料。

这是 1996 年的旧事,不是今天的新闻。但它至今仍是软件工程课上的常客。

一次很贵的“首秀”

阿丽亚娜 5 号是欧洲航天局为取代阿丽亚娜 4 号研制的新火箭,推力更大,载荷更重。首飞编号 Flight 501,当地时间 1996 年 6 月 4 日 9 点 33 分 59 秒从法属圭亚那库鲁发射场起飞,箭上载着 Cluster 科学卫星。

起飞后大约 36.7 秒,备份惯性参考系统先失效,主系统约 0.05 秒后也跟着失效。随后火箭姿态失控,攻角超过 20 度,空气动力把它撕碎,约 39 秒时箭上的自毁装置按设计启动。解体发生在约 4 公里高度,离发射台只有约 1 公里。

凶手:一个没被保护的转换

惯性参考系统负责告诉火箭“我现在朝哪、多快”。它的对准程序会算出一个叫“水平偏差”(BH)的变量,与水平速度相关。阿丽亚娜 5 号的早期轨迹会比阿丽亚娜 4 号更快积累水平速度,BH 因此远超预期。

程序把 64 位浮点的 BH 转成 16 位有符号整数,数值放不下,产生操作数错误。按系统设计,这类错误会让处理器直接停机。

更讽刺的是,这段对准功能在阿丽亚娜 5 号上根本没有用。它在旧火箭上是为了倒计时临时中断后能快速重启,为了“保持一致”被原样保留,还在起飞后继续跑了约 40 秒。

为什么没人发现

报告提到,设计里有七个变量存在转换溢出风险,其中四个加了保护,三个没加,BH 就在没加的那三个里。理由是它受物理限制,或者安全余量足够。这个判断对旧火箭成立,对新火箭不成立。

关键在于,阿丽亚娜 5 号的轨迹数据没有写进导航系统的需求和测试里,所以这个隐含假设从没被检验过。备份系统运行同样的软件,于是主备同时倒下,冗余在“同一个 bug”面前形同虚设。

停机的导航系统还把诊断信息发给飞行控制计算机,后者把它当成真实的飞行数据,导致喷管大幅偏转,这才是解体的直接推手。

后果与教训

调查委员会在 1996 年 7 月 19 日提交报告,给出 14 条建议,包括:起飞后关闭不需要的软件、做尽量接近真实设备的闭环系统测试、把轨迹数据纳入需求和测试、检查所有飞行软件里的隐含假设和变量范围,以及让外部人员实质参与评审。

这次事故常被总结为“代码复用不等于安全”:旧代码是在旧条件下被验证过的,换了环境,它的每个假设都得重新问一遍。损失方面,Cluster 的四颗卫星随箭而去,常见说法是总损失约 3.7 亿美元,但这个数字不出自官方调查报告,仅供参考。

来源:Ariane 5 Flight 501 Failure 调查委员会报告(转载)

关注这个空间,它的新文章会出现在你的关注动态里。