一个价值8.7亿刀的bug
有位老程序员前辈曾说:
没有经历过
p0
级bug
的职业生涯是不完整的
以上名言是我瞎编的。但是,作为程序员,对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 4
的16位整型
。
当这两部分代码组合使用时,会尝试将一个64位浮点数
赋值给16位整型
。
在火箭上升的前几秒,火箭加速度很低,所以这两个值之间的转换是成功的。
绝望的是,随着火箭加速度越来越高,当值超过16位整型
的可表示范围后,溢出发生了。
正常情况下,火箭引擎喷嘴接收的是飞行控制信息。但是溢出发生后,它接收到了一个诊断位模式
(表明溢出发生),导致喷嘴做出错误举动,最终悲剧发生......
后记
最终,欧洲航天局组建了一个团队,从散布在大约12平方公里的火箭残骸中寻找线索,恢复了事故发生时的数据。
这次事故可以说是印象深刻了。你有什么印象深刻的bug
,欢迎在评论区讨论。