NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

一行代码引发的“血案”:价值 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

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2023-02-06 14:207447
用户头像
刘燕 InfoQ高级技术编辑

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

关注

评论 1 条评论

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

什么是数据库分片?

Java架构历程

Java 数据库 三周年连更

KubeVela 稳定性及可扩展性评估

阿里巴巴云原生

阿里云 开源 云原生 KubeVela

声网 Token 鉴权机制,以及常见的问题

声网

查询最新汽车新闻资讯

DS小龙哥

三周年连更

appuploader 入门使用

雪奈椰子

公开下载 | 300页《Java面试宝典》,收藏近万,多位翰林院成员推荐

Java你猿哥

Java MySQL spring 面试 ssm

Mac M1 安装SD不折腾版本

IT蜗壳-Tango

三周年连更

云原生底座之上,这些企业领跑行业的秘密

阿里巴巴云原生

阿里云 容器 微服务 云原生

Alibaba内网“疯狂”传阅的P8开源出的SpringBoot入门到进阶小册

做梦都在改BUG

Java spring 微服务 Spring Boot 框架

爆赞!GitHub上久经不衰的经典教程:Springboot精髓参考指南手册

做梦都在改BUG

Java spring 微服务 Spring Boot 框架

如何使用nobelium 1小时快速搭建你的私人博客

黑微狗‮‮

Blog nobelium

【Python实战】Python采集热搜数据

BROKEN

三周年连更

新手如何学习挖漏洞?看这篇就够了【网络安全】

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

五张图带你看透Redis数据结构

做梦都在改BUG

三种常用的以太网端口链路类型:Access、Hybrid和Trunk

wljslmz

网络 三周年连更

AI 作画火了,如何用 Serverless 函数计算部署 Stable Diffusion?

阿里巴巴云原生

阿里云 Serverless 云原生 AIGC

一文了解 Zebec Labs 投资的 Coral Finance,空投计划或在不久推出

股市老人

2023-05-03:给你一棵 二叉树 的根节点 root ,树中有 n 个节点 每个节点都可以被分配一个从 1 到 n 且互不相同的值 另给你一个长度为 m 的数组 queries 你必须在树上执行

福大大架构师每日一题

Go 算法 福大大

一文看懂:StopWatch 源码解读

后台技术汇

三周年连更

C++智能指针和内存管理:使用指南和技巧

小万哥

c++ 后端 开发 内存管理 智能指针

面试官:一千万的数据,你是怎么查询的?

做梦都在改BUG

一文了解获得 Zebec Labs 投资的 Coral Finance,空投计划或在不久推出

西柚子

K8s 安全是云安全的未来

HummerCloud

Kubernetes k8s

ZooKeeper 避坑指南: ZooKeeper 3.6.4 版本 BUG 导致的数据不一致问题

阿里巴巴云原生

zookeeper 阿里云 开源 云原生

一文了解获得 Zebec Labs 投资的 Coral Finance,空投计划或在不久推出

EOSdreamer111

GitHub爆赞!阿里P9架构师的JDK源码笔记也太强了!

做梦都在改BUG

Java 源码 jdk 高并发

云原生技术实践营「微服务X消息队列专场」

阿里巴巴云原生

阿里云 微服务 云原生 消息队列

“双智天花板”闪耀鹏城,问界M5智驾版深圳首场尊享品鉴会成功举办

Geek_2d6073

针对容器层的五种攻击手段

穿过生命散发芬芳

容器安全 三周年连更

Flink应用框架层

阿泽🧸

flink 三周年连更

【web 开发】PHP 特殊的对象引用 "$this"(62)

迷彩

php 面向对象 this指针 三周年连更

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