大家好,我卡颂。
有位老程序员前辈曾说:
没有经验过
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
,欢送在评论区探讨。
欢送退出人类高质量前端框架钻研群,带飞