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

事故始末

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

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

一个价值8.7亿刀的bug_浮点数

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

一个价值8.7亿刀的bug_整型_02

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

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

一个价值8.7亿刀的bug_赋值_03

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

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

一个价值8.7亿刀的bug_整型_04在附近海滩目睹火箭解体的居民

事故原因

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

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

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

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

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

一个价值8.7亿刀的bug_浮点数_05

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

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

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

后记

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