2
头图

大家好,我卡颂。

有位老程序员前辈曾说:

没有经历过p0bug的职业生涯是不完整的

以上名言是我瞎编的。但是,作为程序员,对bug肯定见怪不怪了。

你经历的bug为公司造成了多少损失呢?本文我们来看一个造成8.7亿刀损失的bug

事故始末

1996年6月4日,第一枚Ariane 5号火箭在法属圭亚那海岸发射升空。

本次发射耗资3.7亿刀,火箭载有价值5亿刀的通信卫星,总投入8.7亿刀。

起飞37秒后,火箭向错误的方向翻转了90度,助推器在空中撕裂,飞船被巨大的液态氢火球吞噬。

火箭爆炸

在爆炸发生的瞬间,工程师甚至还在用法语汇报:“所有设置正常,轨道正常”。

总控室面色凝重的工程师和后面骚动的人群预示着这一切发生的太突然了。

这次灾难性的事故引发了公众调查,并且由于火箭搭载的卫星损毁,对地球磁层运作的科学研究推迟了近4年。

Ariane 5事故被广泛认为是历史上最昂贵的bug之一。

在附近海滩目睹火箭解体的居民

事故原因

这次事故的起因是一个浮点数溢出造成的

Ariane系列火箭的应用中包含一个用于确定火箭是向上还是向下的变量,被称为水平偏差,后文简写为BH

在设计Ariane 5的上一代火箭Ariane 4时,工程师详细分析了BH的边界情况,确定其绝不会超过一个16位整型的表示范围(-32768~32767)后,将该变量定义为16位整型

但是到了Ariane 5,由于火箭性能提升,在应用的绝大部分中BH被定义为64位浮点数,而一些部分由于疏忽,还使用
Ariane 416位整型

当这两部分代码组合使用时,会尝试将一个64位浮点数赋值给
16位整型

在火箭上升的前几秒,火箭加速度很低,所以这两个值之间的转换是成功的。

绝望的是,随着火箭加速度越来越高,当值超过16位整型的可表示范围后,溢出发生了。

正常情况下,火箭引擎喷嘴接收的是飞行控制信息。但是溢出发生后,它接收到了一个诊断位模式(表明溢出发生),导致喷嘴做出错误举动,最终悲剧发生......

后记

最终,欧洲航天局组建了一个团队,从散布在大约12平方公里的火箭残骸中寻找线索,恢复了事故发生时的数据。

这次事故可以说是印象深刻了。你有什么印象深刻的bug,欢迎在评论区讨论。

欢迎加入人类高质量前端框架研究群,带飞


卡颂
3.1k 声望16.7k 粉丝