程式碼歷史上最昂貴的 7 個錯誤

陳琦聊測試發表於2022-05-05

演算法或程式中的一個小技術錯誤就可能造成數百萬美元的損失。本文帶大家看看迄今為止歷史上因程式錯誤而帶來後果最為昂貴的 7 個錯誤。

美國宇航局火星氣候軌道器:1.93 億美元


1999年,美國宇航局的火星氣候軌道飛行器進入了一個過低的軌道,導致航天器在大氣層中燃燒。這一失敗最終追溯至一次換算錯誤——英制磅秒單位沒有轉換成標準公制牛頓秒。

美國宇航局的火星軌道器是其火星勘測者計劃中的第二個探測器,其中還包括 1996 年 11 月發射的火星全球勘測者和 1999 年 1 月發射的火星極地著陸器。 它們被設計成大致同時到達,對火星的表面、氣候和大氣進行實驗。它原定於 1999 年 9 月 23 日到達軌道。美國宇航局的科學家們希望,一旦航天器到達火星,它將幫助他們重建氣候歷史,並在地表找到水的跡象。本次任務結束後,它還將作為未來火星任務的通訊中繼。

1999年9月23日,火星氣候軌道器按計劃開始入軌燃燒。飛船原定在經過火星後重新建立聯絡,然後傳送訊號,但不幸的是,飛船沒有收到任何訊號。 在TCM-4及進入軌道的一個禮拜間,導航團隊認為探測器的高度有可能比預期的還要低得多,大約位於150至170公里。

火星氣候探測者號任務失敗的主要原因是人為因素,因為火星氣候探測者號上的飛行系統軟體使用英制單位磅力計算推進器動力,而地面人員輸入的方向校正量和推進器引數則使用公制單位牛頓,導致探測器進入大氣層的高度有誤,最終瓦解碎裂。

水手 1號:1850 萬美元


水手1號事件,也被稱為人類歷史上最昂貴的連字元,是美國宇航局的另一個失誤,雖然很小,但導致公司損失了數百萬美元。

水手號的計劃中發射了一系列為探索火星、金星、水星等而設計的無人太空船。這個計劃奪得多項第一,包括:第一次跨星系星際飛越、第一個行星探測器以及第一個以重力加速航行的太空船。

水手 1 號於 1962 年 7 月 22 日上午 9 點 21 分發射,距離發射不到 5 分鐘,任務被迫中止;人類歷史上最具歷史意義的一次飛行墜毀於地面,而這只是因為數學程式碼中的一個小錯誤。

美國宇航局在其網站上引述道:“靶場安全官檢測到計劃外的偏航提升動作之前,助推器的表現都是讓人滿意。但引導命令的錯誤應用導致無法轉向,並將導致航天器墜毀,可能墜毀於北大西洋航道或有人居住的區域,因而‘一名靶場安全官隨後下令進行破壞性中止’。”

事故發生幾天後,《紐約時報》發表了一篇文章,解釋了墜機的原因。它說這個錯誤是“在一些數學資料中遺漏了一個連字元”的結果。據稱,美國宇航局的一名程式設計師在將“大量編碼資訊”輸入計算機系統時遺漏了這個符號。

幾天後,美國宇航局官員理查德·莫里森向國會提交了銷燬火箭的案例,並強調了微小遺漏的重要性:“連字元提示航天器在恢復雷達聯絡前,需忽略計算機提供的資料。當該連字元被省略時,虛假資訊被輸入航天器控制系統。在這種情況下,計算機將火箭向左轉,機頭朝下,火箭服從該命令並墜毀。”

阿麗亞娜 5 號航班 501:800 萬美元


1996 年 6 月 4 日,歐洲航天局發射的無人駕駛的阿麗亞娜 5 號火箭在從法屬蓋亞那庫魯升空僅 40 秒後爆炸。這枚火箭在耗資數百萬美元的開發十年後開始了它的第一次航行。

調查委員會調查了爆炸的原因,並在兩週內釋出了一份報告。原來,失敗的原因是慣性參考系統中的軟體錯誤。阿麗亞娜 5 上安裝的軟體最初是為 阿麗亞娜 4 開發的。阿麗亞娜 5 有一個更強大的引擎,這導致了以前版本不可能出現的錯誤。

與火箭相對於平臺的水平速度相關的64位浮點數被轉換為16位有符號整數。該數字大於這是可儲存在16位有符號整數中的最大整數32767,因此轉換失敗。因此,在第39秒,火箭在空氣動力的作用下開始崩潰和自毀。

奔騰處理器漏洞:4.75 億美元


Pentium FDIV 漏洞是最著名、或者說是最臭名昭著的英特爾微處理器漏洞。它旨在變得更快、更準確,但結果卻被竊聽並導致作為英特爾 SRT 演算法一部分的查詢表出現錯誤。

為了將浮點標量程式碼的執行速度提高 3 倍,向量程式碼的執行速度提高 5 倍,與 486DX 晶片相比,英特爾決定使用 SRT 演算法,該演算法可以在每個時鐘週期生成兩個商位,而傳統的 486 移位和減法演算法每個週期僅生成一個商位。此 SRT 演算法使用查詢表來計算浮點除法所需的中間商。Intel 的查詢表由 1066 個表條目組成,其中由於程式設計錯誤,有五個沒有下載到可程式設計邏輯陣列 (PLA) 中。當浮點單元 (FPU) 訪問這五個單元中的任何一個時,它 (FPU) 取零而不是 +2,這應該包含在“缺失”單元中。

在最壞的情況下,此錯誤的發生率可能高達十進位制數的第四位有效數字,但發生這種情況的可能性為 3600 億分之一。錯誤出現在第 9 位或第 10 位十進位制數字中是最常見的,這種情況發生的機率為 90 億分之一。然而,心懷不滿的客戶認為每個使用者都應該得到正常工作的硬體並要求更換。

莫里斯蠕蟲:1 億美元


如果說一個試圖解決問題的學生不小心建立了惡意軟體,導致價值 1 億美元的損失來彌補損失,你會相信嗎?可確實如此,這正是 1988 年 11 月 2 日發生的事情。康奈爾大學的研究生羅伯特·泰潘·莫里斯不小心建立了一個惡意軟體程式。起初,它是程式中的一個無害實驗,但程式碼中有一個小錯誤。該惡意軟體開始迅速傳播,隨後摧毀了數千臺計算機。

羅伯特莫里斯被指控犯有網路犯罪,並因此被罰款 10000 美元。然而,惡意軟體總共導致了 1 億美元的花費來修復受影響的計算機。

莫里斯的律師聲稱,該蠕蟲有助於提高網路安全,因為它有助於開發防病毒軟體,並在未來讓使用者意識到此類惡意軟體。後來,莫里斯成為了 Y Combinator 的聯合創始人。他是麻省理工學院的副教授。帶有惡意軟體原始碼的軟盤儲存在波士頓大學。讓我們只希望它不會變異。

而比事件影響更大、更深遠的是:黑客從此真正變黑,黑客倫理失去約束,黑客傳統開始中斷。大眾對黑客的印象永遠不可能回覆。而且,計算機病毒從此步入主流。

Knight 破產:4.4 億美元


如果美國股票市場的一個關鍵利益相關者開始以高價買入,以低價賣出,會怎麼樣?聽起來不是一個好的貿易策略,對吧?這正是發生在奈特身上的事情,差點導致他們破產。

2012年8月1日上午,發生了一件任何一位CEO都會做的噩夢。花了17年時間才建成的建築在幾個小時內幾乎倒塌。一些新的交易軟體中有一個bug,只有在紐約證券交易所當天開市時才被啟用。這個錯誤的軟體讓Knight掀起了一場收購狂潮,很快,該公司就在交易的第一個小時內購買了約150家不同公司的股票,價值約70億美元。

2012 年 8 月 1 日上午,發生了對任何一位 CEO 都是噩夢的事情:花了 17 年的時間建造的東西幾乎在幾個小時內就崩潰了。一些新的交易軟體有一個bug,該bug在當天紐約證券交易所開盤時才被啟用。這個錯誤的軟體讓Knight掀起了一場收購狂潮,很快,該公司就在交易的第一個小時內購買了約150家不同公司的股票,價值約70億美元。

Knight 試圖取消交易,但美國證券交易委員會 (SEC) 主席 Mary Schapiro 拒絕了。除六支股票的交易被撤銷,Knight的其他購買狂潮並未達到取消門檻——使所購股票的價格上漲超過 30%。在其他情況下,交易成立。

這對Knight來說是個壞訊息,一旦明確交易會成立,Knight別無選擇,只能拋售它購買的股票。就像早上的瘋狂購買推高了這些股票的價格一樣,大規模的市場拋售很可能會迫使價格下跌,可能會跌至Knight無法彌補損失的地步。

高盛(Goldman Sachs)介入,以花費Knight4.4億美元的價格收購了Knight不想要的全部頭寸。

千年蟲:5000 億美元


一位數能帶來什麼危害?早在 1999 年,它就耗資 5000 億美元。Y2K 錯誤,也稱為千禧年錯誤,是一種計算機缺陷。由於其中的年份只使用兩位十進位制數來表示,因此當系統進行跨世紀的日期處理運算時(如1999 年 12 月 31 日之後的日期),就會出現錯誤的結果,進而引發各種各樣的系統功能紊亂甚至崩潰。

在 1960 年代到 1980 年代編寫複雜的計算機程式時,計算機工程師使用兩位數的程式碼來表示年份。“19”被排除在外。日期不是 1970 年,而是 70。計算機工程師縮短了日期,因為在那個時代,計算機中的資料儲存成本高昂並且佔用大量空間。

隨著 2000 年的臨近,計算機程式設計師意識到計算機可能不會將 00 解釋為 2000,而是將其解釋為 1900。每天或每年程式設計的所有活動都會受到損壞或有缺陷。當1999年12月31日變成2000年1月1日時,計算機會將1999年12月31日解釋為變成1900年1月1日。

每天計算利率的銀行和其他金融機構面臨著實際問題。計算機將計算負 100 年的利率,而不是一天的利率。發電廠、交通運輸和許多其他部門也將受到這一變化的影響。

美國政府通過了《2000年資訊和準備披露法》為此次活動做準備,併成立了一個由政府高階官員和聯邦應急管理局(FEMA)等機構官員組成的總統委員會,監督私營公司為活動準備系統的工作。研究公司Gartner估計,避免千年蟲的全球成本可能高達6000億美元。

吸取了上述七個教訓,要記得務必在初始階段測試軟體,以避免損壞和修復的高成本。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978795/viewspace-2890727/,如需轉載,請註明出處,否則將追究法律責任。

相關文章