一個(gè)價(jià)值8.7億刀的bug
有位老程序員前輩曾說(shuō):
沒(méi)有經(jīng)歷過(guò)
p0級(jí)bug的職業(yè)生涯是不完整的
以上名言是我瞎編的。但是,作為程序員,對(duì)bug肯定見(jiàn)怪不怪了。
你經(jīng)歷的bug為公司造成了多少損失呢?本文我們來(lái)看一個(gè)造成8.7億刀損失的bug。
事故始末
1996年6月4日,第一枚Ariane 5號(hào)火箭在法屬圭亞那海岸發(fā)射升空。
本次發(fā)射耗資3.7億刀,火箭載有價(jià)值5億刀的通信衛(wèi)星,總投入8.7億刀。

起飛37秒后,火箭向錯(cuò)誤的方向翻轉(zhuǎn)了90度,助推器在空中撕裂,飛船被巨大的液態(tài)氫火球吞噬。

在爆炸發(fā)生的瞬間,工程師甚至還在用法語(yǔ)匯報(bào):“所有設(shè)置正常,軌道正常”。
總控室面色凝重的工程師和后面騷動(dòng)的人群預(yù)示著這一切發(fā)生的太突然了。

這次災(zāi)難性的事故引發(fā)了公眾調(diào)查,并且由于火箭搭載的衛(wèi)星損毀,對(duì)地球磁層運(yùn)作的科學(xué)研究推遲了近4年。
Ariane 5事故被廣泛認(rèn)為是歷史上最昂貴的bug之一。

事故原因
這次事故的起因是「一個(gè)浮點(diǎn)數(shù)溢出造成的」。
Ariane系列火箭的應(yīng)用中包含一個(gè)用于「確定火箭是向上還是向下」的變量,被稱為「水平偏差」,后文簡(jiǎn)寫為BH。
在設(shè)計(jì)Ariane 5的上一代火箭Ariane 4時(shí),工程師詳細(xì)分析了BH的邊界情況,確定其絕不會(huì)超過(guò)一個(gè)16位整型的表示范圍(-32768~32767)后,將該變量定義為16位整型。
但是到了Ariane 5,由于火箭性能提升,在應(yīng)用的絕大部分中BH被定義為64位浮點(diǎn)數(shù),而一些部分由于疏忽,還使用Ariane 4的16位整型。
當(dāng)這兩部分代碼組合使用時(shí),會(huì)嘗試將一個(gè)64位浮點(diǎn)數(shù)賦值給16位整型。

在火箭上升的前幾秒,火箭加速度很低,所以這兩個(gè)值之間的轉(zhuǎn)換是成功的。
絕望的是,隨著火箭加速度越來(lái)越高,當(dāng)值超過(guò)16位整型的可表示范圍后,溢出發(fā)生了。
正常情況下,火箭引擎噴嘴接收的是飛行控制信息。但是溢出發(fā)生后,它接收到了一個(gè)診斷位模式(表明溢出發(fā)生),導(dǎo)致噴嘴做出錯(cuò)誤舉動(dòng),最終悲劇發(fā)生......
后記
最終,歐洲航天局組建了一個(gè)團(tuán)隊(duì),從散布在大約12平方公里的火箭殘骸中尋找線索,恢復(fù)了事故發(fā)生時(shí)的數(shù)據(jù)。
這次事故可以說(shuō)是印象深刻了。你有什么印象深刻的bug,歡迎在評(píng)論區(qū)討論。
