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

2天前 (03-21 23:18)阅读1回复0
路亚哦哦哦
路亚哦哦哦
  • 管理员
  • 注册排名7
  • 经验值130775
  • 级别管理员
  • 主题26155
  • 回复0
楼主

做者 | Michael Stroe

译者 | 核子可乐

筹谋 | 刘燕

1996 年 6 月 4 日礼拜二,欧洲航天局方案初次发射新的阿丽亚娜(Ariane)5 型火箭。做为颠末十年设想、测试和数十亿欧元投进的科技结晶,那枚运载火箭牵动着每位欧洲航天人的心。

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

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

那枚火箭的设想目标十分简单,同时也承载着浩荡风险。它需要将高贵的大载荷送进太空,搀扶帮助欧洲完成一系列科学尝试与贸易项目。

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

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

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

展开全文

阿丽亚娜 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 毫秒后也瓦解了。

因为没有反常处置代码,主计算机将发来的数据阐明成了实正的导航数据,认定火箭已经严峻偏离航路。为了消解那个底子就不存在的威胁,助推器点燃了全喷嘴偏转,浩荡的空气动力压力立即起头扯破火箭本体。

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

一名科学家站在屡次施行阿丽亚娜发射使命的 HM-7B 火箭策动机旁

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

也就是说,那场灾难性且耗资浩荡的飞翔变乱,其根源就是一行代码测验考试将 64 位浮点数转换成有符号整数,整数溢出成果被间接传递给主计算机,最末被主计算机阐明为实在数据。

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

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

确实如斯,前文提到,那个 bug 来自一段死代码。因为那部门只是发射台对齐过程中的一部门,在起飞后就不再需要了。但其时一个小小的毛病将发射延迟了几秒钟,为了制止重置整个系统,软件工程师决定额外把整个代码序列运行一边……

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

原文链接:

声明:本文为 InfoQ 翻译,未经答应制止转载。

点击底部阅读原文拜候 InfoQ 官网,获取更多超卓内容!

今日好文选举

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

我被微办事坑掉了CTO职位

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

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

0
回帖

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

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息