盤點那些造成“大災難”的Bug
對于程序員來說,從寫代碼開始,Bug幾乎就是一個如影隨形的東西。正如Bug的英文原義——小蟲子,在我們的生活中無所不在。
一個小小的Bug,輕則影響和戶體驗,重則會“勞民傷財”,甚至造成死傷的“大災難”。
接下來,就讓我們來盤點下那些曾經造成“大災難”,讓人追悔莫及的Bug。
一、0.000000095帶來的愛國者之殤
1991年2月25日,海灣戰爭期間,在沙特阿拉伯的達蘭,美國的“愛國者”系統未能追蹤并攔截一枚伊拉克飛毛腿導彈。
“愛國者”導彈防御系統工作流程是:探索階段、驗證階段、跟蹤階段,在跟蹤階段會等對方的導彈進行攔截。但如果“愛國者”持續工作超過8小時,射程就會偏離正常位置20%;這雖然是個已知的bug,但美國軍方不認為“愛國者”導彈會持續工作超過8小時,但那時實際運行時間已持續約100小時。
系統每1/10秒就進行一次乘以1/10的運算,1/10的二進制就是0.00011001100110011001100………,但在愛國者的24位固定小數點寄存器里就只保存到小數點后第24位。每次計算就會舍去0.0000000000000000000000011001100(十進制約0.000000095)。
愛國者工作時間約100小時,按0.000000095 x 100(小時)x 60(分) x 60(秒)x 10(每秒進行的除法運算)=0.34秒;飛毛腿導彈速度約1676米/秒,按0.34(秒)x1676(米/秒),導彈飛行距離早就超過了半公里;這點距離已足夠能讓導彈飛到愛國者追蹤攔截的范圍之外了。
這枚導彈襲擊了美國軍營,造成了28名士兵死亡,約100人受傷。
二、代碼沒有更新,導致火箭墜毀
阿麗亞娜火箭墜毀居然是因為軟件代碼沒有測試、更新?!
1996年6月4日,阿麗亞娜5型運載火箭原計劃將運送4顆太陽風觀察衛星到預定軌道,但因軟件問題,火箭在發射后偏軌激活了自我摧毀裝置。就在剎那間,阿5型火箭和其他衛星燃為灰燼。
然而事故的原因卻是:代碼重用!
在二者的飛行條件截然不同的情況下,阿5型的發射系統代碼仍然直接重用了阿4型的相應代碼。雖然該代碼在阿4型上是完美運行,但卻從未在阿5型上進行過測試。
事實證明,阿4型往舊軟件(SRI)輸入的是16位元整數數據,阿5型往SRI 輸入的是64位元浮點數數據,數據轉換時溢出。
此次事故損失3.7億美元。
三、一個小小的用戶行為造成整個銀行系統崩潰
加拿大信托銀行的ATM機可以接受銀行卡,但是如果你沒有帶卡你也可以鍵入你的賬戶信息,通過這種方式執行你的銀行業務。機器會問你:“您是否攜帶銀行卡?”隨之會有一個按鈕為是,另一個按鈕為否。
程序員們花費了幾個月的時間去調試系統,追蹤每一個錯誤,預判每一個客戶可能會做出的每一個稀奇古怪的決定……這一切都是為了要確保系統會在運行時保持穩定。
終于到了機器開始運營服務的那一天。
運營的第一個小時里,安大略南部某處的某位客戶,對“您是否攜帶銀行卡”這一問題選擇了“否”后,把他的銀行卡強插進了卡槽里。
然后,這整個系統,整個安大略的系統,都……崩了。
四、一個“/”鍵,損失了30億美元
2010年1月31日,Google 封鎖了整個互聯網。
Google 向來都保護著我們免受惡意軟件和病毒感染的網站的侵擾;它與stopbadware合作,監視著危險的惡意軟件/病毒/軟件,并時刻更新標記網站列表。
而這一次,將站點添加到標記的列表程序員在本該輸入URL的位置,不小心地輸了“/”。
因為這一疏漏,互聯網上所有的網站都被標記為危險。
故障持續了40分鐘,損失30億美元。