哪些臭名昭彰的軟體 bug 名留青史?

作者 | 發布日期 2015 年 12 月 06 日 12:00 | 分類 科技趣聞 , 網路 , 軟體、系統 follow us in feedly

在現今數位年代,電腦 bug 不但困擾著每個程式設計師,更會無可避免影響我們的生活,小到每個人的衣食住行,大到國家經濟、世界局勢。隨著我們的生活方式漸漸的數位化、網路化,數位世界的找蟲和殺蟲就變得越來越重要。



軟體史上有哪些著名的 bug 呢?讓我們一起來回顧一下:

 

1. 萬「蟲」之母,史上留名

雷鋒網配圖

▲ 軟體史上第一蟲。

1947 年 9 月 9 日下午 3 點 45 分,Grace Murray Hopper 在她的筆記本上記下了史上第一個電腦 bug ——在 Harvard Mark II 電腦裡找到的一隻飛蛾,她把飛蛾貼在日記本上,並寫道「First actual case of bug being found」。這個發現奠定了 Bug 這個詞在電腦世界的地位,變成無數苦逼程式設計師的噩夢。 從那以後,bug 這個詞在電腦世界表示電腦程式中的錯誤或者疏漏,它們會使程式計算出莫名其妙的結果,甚至引起程式的崩潰。Grace Murray Hopper 是歷史上最早一批程式設計師,而且還是個女程式設計師,服役於美國海軍,官至準將。

這是流傳最廣的關於電腦 bug 的故事,可是歷史的真相是,bug 這個詞早在發明家湯瑪斯·愛迪生的年代就被廣泛用於指機器的故障,這在愛迪生本人的 1870 年左右的筆記裡面也能看得到。而電氣電子工程師學會 IEEE 也將 bug 這一詞的引入歸功於愛迪生。

 

2. 千禧蟲,炒作的狂歡

雷鋒網配圖

▲ 1999 年給了嘩眾取寵的雜誌小報極好的題材。

在上個世紀,軟體業者從來沒想過他們的代碼和產品會跨入新千年。因此,很多軟體業者為了節省記憶體省略掉代表年份的前兩位元數字「19」,或者預設前兩位為「19」。

而當日曆越來越接近 1999 年 12 月 31 日時,人們越來越擔心在千禧年的新年夜,大家的電腦系統都會崩潰,因為系統日期會更新為 1900 年 1 月 1 日而不是 2000 年 1 月 1 日,這樣可能意味著無數的災難事件,甚至是世界末日。

到今天,我們可以調侃這個滑稽的故事,因為核導彈並沒有自動發射,飛機也沒有失控從天上掉下來,銀行也沒有把國家和使用者的大筆存款弄丟。

千禧蟲 bug 是真實的,全球花了上億的美元用來升級系統。而且,也發生了一些小事故:

在西班牙,停車場計費表壞了;法國氣象局公布了 19100 年 1 月 1 日的天氣預報;在澳洲,公共汽車驗票系統崩潰。就這樣而已。最後盤點的結果是軟體公司賺了大錢、八卦小報銷量大增、很多程式設計師的千禧跨年夜 party 泡湯了、幾個中國文盲老太太被人騙了養老金,不可謂不嚴重。

 

3. 達蘭導彈事件,毫秒的誤差

在 1991 年 2 月的第一次海灣戰爭中,一枚伊拉克發射的飛毛腿導彈準確擊中美國在沙地阿拉伯的達蘭基地(Dhahran),當場炸死 28 個美國士兵,炸傷 100 多人,造成美軍波斯灣戰爭中唯一一次傷亡超過百人的損失。

在後來的調查中發現,由於一個簡單的電腦 bug,使基地的愛國者反導彈系統失效,未能在空中攔截飛毛腿導彈。當時,負責防衛該基地的愛國者反導彈系統已經連續工作了 100 個小時,每工作一個小時,系統內的時鐘會有一個微小的毫秒級延遲,這就是這個失效悲劇的根源。愛國者反導彈系統的時鐘暫存器設計為 24 位元,因而時間的精度也只限於 24 位元的精度。在長時間的工作後,這個微小的精度誤差被漸漸放大。在工作了 100 小時後,系統時間的延遲是三分之一秒。

對一般人人來說,0.33 秒是微不足道的。但是對一個需要跟蹤並摧毀一枚空中飛彈的雷達系統來說,這是災難性的——侯賽因飛毛腿導彈空速達 4.2 馬赫(每秒 1.5 公里),這個「微不足道」的 0.33 秒相當於大約 600 公尺的誤差。在達蘭導彈事件中,雷達在空中發現了導彈,但是由於時鐘誤差沒有能夠準確地跟蹤它,因此基地的反導彈並沒有發射。

雷鋒網配圖

▲ 達蘭導彈事件圖解。

4. 公尺還是英尺?火星氣候探測者號的星際迷航

火星氣候探測者號在 1997 年發射,目的為研究火星氣候,但是它沒有能夠達成這項花費 3 億多美元的使命。

探測者號在太空中飛行幾個月以後,由於導航錯誤,最終在火星大氣層解體。探測器的控制團隊使用英制單位來發送導航指令,而探測器的軟體系統使用公制來讀取指令。這一錯誤大大改變了導航控制的路徑。最後探測器進入過低的火星軌道(大約 100 公里誤差),在過大的火星大氣壓力和摩擦下解體。

雷鋒網配圖

▲ 公尺還是英尺?偏離 100 公里!

亞利安 5 號運載火箭,昂貴的簡單複製

程式設計師在程式設計時必須定義程式用到的變數,以及這些變數所需的電腦記憶體,這些記憶體用比特位元定義。

一個 16 位元的變數可以代表 -32,768 到 32,767 中間的值。而一個 64 位元的變數可以代表 −9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 中間的值。

1996 年 6 月 4 日,亞利安 5 號(Ariane 5)運載火箭的首次發射點火後,火箭開始偏離路線,最終被逼引爆自毀,整個過程只有短短 30 秒。亞利安 5 號運載火箭基於前一代 4 型火箭開發。在 4 號火箭系統中,對一個水準速率的測量值使用了 16 位元的變數及記憶體,因為在 4 型火箭系統中反覆驗證過,這一值不會超過 16 位元的變數,而 5 號火箭的開發人員簡單複製了這部份程式,卻沒有對新火箭進行數值的驗證,結果發生了致命的數值溢出。發射後這個 64 位元帶小數點的變數,被轉換成 16 位元不帶小數點的變數,引發了一系列的錯誤,從而影響了火箭上所有的電腦和硬體,癱瘓了整個系統,不得不選擇自毀,4 億美元因而變成一個巨大的煙花。

雷鋒網配圖

▲ 花費 4 億美元的亞利安 5 號煙花,軟體 bug 出品。

(本文由 雷鋒網 授權轉載;首圖來源:Flickr/Surian Soosay CC BY 2.0) 

關鍵字: , ,

發表迴響