【QCon】精华内容上线92%,全面覆盖“人工智能+”的典型案例!>>> 了解详情
写点什么

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

  • 2023-02-06
    北京
  • 本文字数:1673 字

    阅读完需:约 5 分钟

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

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

公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2023-02-06 14:207229
用户头像
刘燕 InfoQ高级技术编辑

发布了 1112 篇内容, 共 489.3 次阅读, 收获喜欢 1965 次。

关注

评论 1 条评论

发布
用户头像
仿真测试的覆盖率设计有问题。
2023-02-07 09:42 · 江苏
回复
没有更多了
发现更多内容

TiDB 6.0 新特性解读丨 Collation 规则

PingCAP

【国产】自动化运维ETL统一调度平台TASKCTL流程触发方式

TASKCTL

DevOps 分布式 数据仓库 ETL 自动化运维

1024程序员节特别篇:Linux三十年的发展历程以及未来的走向

爱好编程进阶

Java 程序员 后端开发

数据增强(三)-Batch Augmentation

AIWeker

人工智能 深度学习 数据增强 5月月更

6个月的开发,来面试居然要18K,我一问连5K都不值

爱好编程进阶

Java 程序员 后端开发

Carina 全新版本 V0.10发布 :支持裸盘作为存储卷

BoCloud博云

开源 本地存储

《2022微隔离技术与安全用例研究报告》重磅发布 | 附PDF全文下载

青藤云安全

Batman+joker乱谈

爱好编程进阶

Java 程序员 后端开发

博云:Kubernetes 近年影响最大版本发布,这几点值得关注

BoCloud博云

Kubetnetes

盲盒系统开发盲盒源码搭建需要多长时间

WDL22119

15个经典面试问题及回答思路,很多人死在了最后一个问题上

爱好编程进阶

Java 程序员 后端开发

线程通信

急需上岸的小谢

5月月更

告诉你使用预约小程序的9个理由

天天预约

小程序 SaaS 企业服务 预约工具

直播预告|争夺存量用户关键战,助力企业构建完美标签体系

袋鼠云数栈

大数据 数据中台

09-条件查询器Wrapper

爱好编程进阶

Java 程序员 后端开发

2021-06-05# Java基础(dayFourteen):锁的两种方式

爱好编程进阶

Java 程序员 后端开发

CentOS7各个版本镜像下载地址

爱好编程进阶

Java 程序员 后端开发

让客户实现 AI 算力“自由”,博云与趋动科技完成算力调度容器化验证

BoCloud博云

AI

BATJ互联网月薪38K的Java岗面试题首曝光,掌握这些大厂Offer指定跑不了

爱好编程进阶

Java 程序员 后端开发

C++类和对象详解

爱好编程进阶

Java 程序员 后端开发

90后码农:我面试了很多80后程序员,他们大多技术深度都不够

爱好编程进阶

Java 程序员 后端开发

2021-09-17 dynamic addres list(File Edition)

爱好编程进阶

Java 程序员

2021备战金三银四必刷的1000道Java面试真题

爱好编程进阶

Java 程序员 后端开发

2022年最新Java后端薪资统计出炉,看看你有没有拖后腿

爱好编程进阶

Java 程序员 后端开发

5分钟学会 Vim 分屏操作方方面面

爱好编程进阶

Java 程序员 后端开发

ansible 模块:blockinfile

ghostwritten

ansible

如何真正将企业知识管理做出价值?

小炮

企业知识管理

gRPC三种客户端类型实践【Java版】

FunTester

2021年最新基于Spring Cloud的微服务架构分析

爱好编程进阶

Java 程序员 后端开发

3分钟教你搞定服务器上架信息收集

爱好编程进阶

Java 程序员 后端开发

记一次存储系统IOPS翻倍的性能优化

Vincent

性能优化 存储系统

一行代码引发的“血案”:价值5亿欧元的火箭,发射40秒后凌空爆炸_AI&大模型_Michael Stroe_InfoQ精选文章