Redian新闻
>
一行代码引发的“血案”:欧洲航天局价值 5 亿欧元的火箭,发射 40 秒后凌空爆炸

一行代码引发的“血案”:欧洲航天局价值 5 亿欧元的火箭,发射 40 秒后凌空爆炸

公众号新闻

作者 | Michael Stroe
译者 | 核子可乐
策划 | 刘燕

1996 年 6 月 4 日星期二,欧洲航天局计划首次发射新的阿丽亚娜(Ariane)5 型火箭。作为经过十年设计、测试和数十亿欧元投入的科技结晶,这枚运载火箭牵动着每位欧洲航天人的心。

准备发射的阿丽亚娜 5 型火箭

这枚火箭的设计目标非常简单,同时也承载着巨大风险。它需要将昂贵的大载荷送入太空,帮助欧洲完成一系列科学实验与商业项目。

火箭上没有搭载宇航员,最尊贵的“乘客”是 Cluster 航天器。这台设备由四颗昂贵的科学卫星组成,每颗重 2600 磅。

然而,就在起飞后短短 40 秒,阿丽亚娜 501 号就在发射区上空炸裂成无数金属残片和燃烧的碎块。对于欧洲航天局来说,这不仅是一次沉重的打击,更是一场令人震惊的灾难。

阿丽亚娜 501 号升空几秒后即发生爆炸

事故原因其实非常简单 — 一个本可以轻松避免的编码 bug。这个 bug 来自一段死代码(即不产生实际作用的代码),属于近十年前阿丽亚娜 4 型火箭的遗留产物。

阿丽亚娜 501 号火箭在脱离发射台后,会按照预定路径平稳加速并飞向太空。在内部,制导系统不断跟踪火箭轨迹并将数据发送至主机载计算机。为了完成数据传输,制导系统需要将速度读数从 64 位浮点数转换为 16 位带符号整数。

大家可以想想,这个转换过程究竟是怎么回事。使用 16 位无符号整数,我们可以存储 0 到 65535 之间的任意值。而如果把首位用来存放符号(正 / 负),那么 16 位有符号整数就能涵盖从 -32768 到 +32768 的任意值(实际可用数位只有 15 位)。任何超出这个范围的值都无法正常使用。

另一方面,浮点数的存储规则略有不同,强调的是在相同的位数中覆盖更大范围的数字。例如,即使是 16 位(双精度)浮点数,也能存储从 -1.8e+308 到 -2.2e-308 之间的大量值。可见,要把其中的某个值转换成 16 位有符号整数,则很可能会超出后者的支持范围。那如果是 64 位浮点数呢?结果只会更糟。

一旦这种不可避免的事态成真,会有怎样的后果?在使用 16 位有符号整数时,从浮点数到整数的转换会引发我们熟知的整数溢出。现在只剩最后一个问题了:整数溢出,对于火箭发射意味着什么?

制导系统会读取火箭的水平速度数据(64 位浮点数),并尝试将其转换为 16 位整数以发送至主计算机。但转换未能成功。

很明显,因为读数大于 16 位整数所能表示的最大值,所以转换失败。一般来讲,设计良好的系统会内置一个程序来处理溢出错误,并向主计算机发送一条合理的消息。但阿丽亚娜并不是这样……

制导系统会持续发送错误消息,于是主计算机不但接收不到正确的水平速度值,制导系统那边还被立即关闭了。

但有些朋友可能会问,应该有补救措施吧?火箭制导系统难道就没有后备吗?当然有,但后备系统的代码跟主系统完全相同,所以它也在尝试执行同样的转换、得到相同的错误,于是短短 72 毫秒后也崩溃了。

因为没有异常处理代码,主计算机将发来的数据解释成了真正的导航数据,认定火箭已经严重偏离航线。 为了消解这个根本就不存在的威胁,助推器点燃了全喷嘴偏转,巨大的空气动力压力立即开始撕裂火箭本体。

一名科学家站在多次执行阿丽亚娜发射任务的 HM-7B 火箭发动机旁

计算机意识到情况到了最危急的关头,于是决定触发自毁机制,把这枚当时造价约 5 亿欧元的火箭当成大炮仗给放了。

也就是说,这场灾难性且耗资巨大的飞行事故,其根源就是一行代码尝试将 64 位浮点数转换成有符号整数,整数溢出结果被直接传递给主计算机,最终被主计算机解释为真实数据。

同样的软件设计之前已经成功服务过多次发射,但那时候是在阿丽亚娜 4 型火箭上。4 型火箭体量较小,所以性能参数也远低于 5 型;新的阿丽亚娜 5 型火箭在显著升级之后,飞行速度超出了系统工程师当初编写代码时的取值区间。

可预定飞行速度可能导致溢出错误的事,应该不会逃过工程师的眼睛才对。

确实如此,前文提到,这个 bug 来自一段死代码。因为这部分只是发射台对齐过程中的一部分,在起飞后就不再需要了。但当时一个小小的故障将发射延迟了几秒钟,为了避免重置整个系统,软件工程师决定额外把整个代码序列运行一遍……

于是在升空 40 秒后,5 亿欧元和无数人的心血瞬间化为乌有。

原文链接:

https://jam.dev/blog/famous-bugs-rocket-launch

声明:本文为 InfoQ 翻译,未经许可禁止转载。

点击底部阅读原文访问 InfoQ 官网,获取更多精彩内容!

今日好文推荐

18.3 万美元offer到手!ChatGPT 通过谷歌 L3 面试:留给谷歌的时间不多了

我被微服务坑掉了CTO职位

微信全面支持“小号”;员工购买公司福利房,被裁员后遭巨额索赔;16岁少年孤身前往深圳腾讯总部解封QQ账号|Q资讯

现代软件越来越大、越来越慢、越来越烂!还有救吗?

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
火箭科学和官僚主义——2022年国外航天发射的一些事件回顾面对道德绑架苏联搞砸的火箭,马斯克干成了指南基金王军国:深耕新三板/北交所10余年,狙击式布局价值投资洼地(公司篇)俄称扎波罗热核电站人员遭袭;斐济因日本核污染水排海计划处于高度戒备;价值1.5亿欧元毒品被冲上法国北部海岸 | 每日大新闻《流浪地球》正版模型~行星发动机,领航员计划火箭,亲手搭出一部科幻大片!月球上几点了?欧洲航天局拟推动创建“月球时区”美国国家航空航天局首架电动飞机X-57将迎来第一次飞行立足工农大众的新秧歌运动掀起宇宙人(1233期)长四丙火箭成功发射遥感三十四号04星;马斯克:“其他国家都想抛弃美元”;猎鹰9号火箭第22发中止发射AIGC落地门槛被打下来了:硬件预算一口气降至1/46,低成本上手Stable Diffusion2.0,一行代码自动并行宇宙人(1215期)二级故障,日本H3火箭发射失败;朝宣称成功研制卫星运载火箭大功率引擎;印海军成功试射舰载布拉莫斯超声速导弹全球首枚3D打印火箭,要上天宇宙人(1205期)火箭院主导修订!运载火箭地面支持设备通用要求国际标准发布;神舟十四号航天员乘组举行记者见面会;日本发射失败指南基金王军国:深耕新三板/北交所10余年,狙击式布局价值投资洼地(观点篇)巴西队回家了!首枚液体火箭发射全败?浅议世界商业航天著名“魔咒”快速交付神器:阿里巴巴官方低代码引擎开源了!真是急死人了…现货不多!曾运载神舟飞船上天的CZ-2F火箭,现将残骸做成了邮票!关键时刻欧洲航天局“反水”?谁在背后使坏?唯一的航母着火、航天局长被炸,俄罗斯怎么了?指南基金王军国:深耕新三板/北交所10余年,狙击式布局价值投资洼地(投策篇)硬件预算最高直降46倍!低成本上手AIGC和千亿大模型,一行代码自动并行,Colossal-AI再升级入籍速度如火箭,墨尔本一地或是“澳人”增长最快区指南基金王军国:深耕新三板/北交所10余年,狙击式布局价值投资洼地造娃养娃,才知道有这特殊医疗保险-美洋插队生活实录(十六)马斯克的星舰要上天了!是人类最强运载火箭,还是又一朵大烟花?欧洲航天局:终止向中国天宫空间站派遣宇航员的计划乐乐茶或将开放加盟;LVMH市值破4000亿欧元;小红书加码短视频;6个中国零售品牌入选全球品牌价值500强|联商头条俄罗斯航母突发火灾!啥情况?印度大巴坠崖,已致7死35伤!火箭发射失败,欧洲航天计划受重挫60行代码就能构建GPT!网友:比之前的教程都要清晰|附代码首次本土发射火箭失败,英国航天发射何时能复兴?PyTorch 2.0正式版发布!一行代码提速2倍,100%向后兼容早报 | 爱马仕市值首次破2000亿欧元;Levi's第一季度利润大跌逾28%;Salomon经典鞋款转售价格翻倍引发抢购潮
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。