一個價值8.7億刀的bug

卡頌發表於2021-11-05

大家好,我卡頌。

有位老程式設計師前輩曾說:

沒有經歷過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,歡迎在評論區討論。

歡迎加入人類高質量前端框架研究群,帶飛

相關文章