世界上最著名的幾個 bug
今天我們聊一聊世界歷史上,最經(jīng)典且讓人摸不著頭腦的著名 bug。
整數(shù)溢出
1996 年 6 月 4 日,歐洲空間局(European Space Agency,ESA)發(fā)射的亞利安 5 號(Ariane 5)運載火箭在法屬圭亞那的庫魯發(fā)射場發(fā)射后僅 40 秒就爆炸了。這枚火箭經(jīng)過長達(dá)十年的研發(fā),耗資 80 億美元后進(jìn)行首飛,但這一 Bug 的結(jié)果導(dǎo)致了 3.7 億美元的損失。
首飛失敗的原因是整數(shù)溢出,這是計算機(jī)編程中一個普遍存在的錯誤。在本例中,有人試圖在 16 位空間中設(shè)置 64 位數(shù)字。
另外,PayPal 也犯過錯。PayPal 意外向某人支付 92 千萬億美元。
當(dāng) Chris Reynolds 打開他的 PayPal 電子郵件對賬單時,這位賓夕法尼亞州公關(guān)主管的賬戶余額顯示為 92,233,720,368,547,800 美元。
在 64 位數(shù)字的世界里,這個數(shù)字太過龐大,意味著存在編程錯誤。所幸這一錯誤很快就被發(fā)現(xiàn),當(dāng)他再次登錄時,他的賬戶已經(jīng)歸零。
PayPal 表示愿意為 Reynolds 選擇的事業(yè)捐贈一筆數(shù)額不詳?shù)馁Y金。
Windows 98 演示中的藍(lán)屏死機(jī)
BSOD 或藍(lán)屏死機(jī)(Blue Screen of Death),是 Windows 系統(tǒng)發(fā)生致命系統(tǒng)錯誤后顯示的藍(lán)色錯誤屏幕。它顯示了系統(tǒng)已崩潰,此時操作系統(tǒng)已經(jīng)處于無法可靠地運行的狀態(tài)。這是由幾個不同問題引起的,例如關(guān)鍵進(jìn)程意外終止或一般硬件故障。
在 Windows 98 或 Windows 95 中,當(dāng)系統(tǒng)嘗試訪問硬盤上的文件 c:\aux\aux 或 c:\con\con 時,就會發(fā)生藍(lán)屏死機(jī)。
電子郵件無法發(fā)送到 500 英里以外
這是 Bug 界最經(jīng)典的傳奇之一。
我在做校園的郵件系統(tǒng)管理員的時候,有用戶向我抱怨說:他們不能發(fā)送超過 500 英里距離的 email… 如果你之前沒有聽過這個故事。如果你就是這個管理員。此刻是否一臉懵逼。補(bǔ)充材料:用戶中有位地理統(tǒng)計人員,還添油加醋地制作了一張郵件發(fā)送失敗地圖,地圖上顯示,她郵件的送達(dá)區(qū)域半徑比 500 英里就多那么一點點:半徑內(nèi)的收件人,全收到了,之外的,全失敗了。
請給出你的 debug plan。別說是郵票沒貼夠。
真相:一次軟件升級導(dǎo)致遠(yuǎn)程服務(wù)器超時時間被設(shè)為 0。在一個具有典型負(fù)載的特定機(jī)器上,零超時意味著如果連接時間稍微超過 3 毫秒,服務(wù)器就會終止連接。而以光速傳播的電信號,在 3 毫秒的時間內(nèi)所能到達(dá)的距離大約是:
0.003 * c (光速) = 558.84719 miles
只有在星期三才會崩潰的系統(tǒng)
這是 Bug 界最經(jīng)典的傳奇之二。
一家醫(yī)院用來監(jiān)控病人健康的數(shù)據(jù)庫,每到周三,會自己崩潰。我在周三的時候通常也會崩潰。因為那天有組會。但我感覺這應(yīng)該不是這道問題的答案。補(bǔ)充材料:該事件中,最大的難度在于,一周只有一天有機(jī)會 debug。該系統(tǒng)記錄日志是用 C 風(fēng)格的代碼編寫的,把日志字符串記錄到了一個固定長度的緩沖區(qū)中,其中日志時間一欄,格式例如Monday, July 17, 1997, 10:38:47.123。請給出你的debug plan。
真相:
因為周三的日志的時間一欄,緩沖區(qū)恰好溢出了。(就差一個字節(jié)寫不下)不會有來自星星的 bug 也沒有哪個 bug 是太陽的后裔所有那些你認(rèn)為的、不惜穿越過時空,來與你情定今生的 bug 都特么是你曾經(jīng)的二比惹的禍。
當(dāng)我坐在窗邊的時候,內(nèi)存讀寫就會失敗
這是 Bug 界最經(jīng)典的傳奇之三。
給一個自己設(shè)計的 SD 卡控制器寫驅(qū)動,從五月開始調(diào)試,一直很順利,到了七月份突然開始出現(xiàn)間歇性的 SD 卡讀寫失敗,而且越靠近窗戶,失敗頻率越高。搜索公眾號互聯(lián)網(wǎng)架構(gòu)師,關(guān)注后回復(fù)9有驚喜!
真相:電路板上芯片的正常工作溫度有限,當(dāng)超過一定的溫度時它就帶不動負(fù)載了,而7月的正午,太陽正好會通過窗戶會照到板子,導(dǎo)致溫度過高。
搖動游戲手柄的時候,游戲存檔就會失敗
這是 Bug 界最經(jīng)典的傳奇之四。
在開發(fā) PS1 游戲“袋鼠大進(jìn)擊”這款游戲的存檔/讀檔時候遇到的。Bug 的癥狀是每隔一段時間存檔/讀檔都會超時失敗。并且十分隨機(jī)。像我這種游戲從來都是一命通關(guān)的人其實不是很在乎能不能存檔的補(bǔ)充材料:該事件中的難點在于重現(xiàn) bug。當(dāng)開發(fā)人員把可能出錯的代碼已經(jīng)注釋到了四大皆空的時候,bug 依然隨機(jī)出現(xiàn)。偶然間,測試發(fā)現(xiàn)了快速重現(xiàn) Bug 的方法:一邊擺動手柄,一邊存檔。請給出你的 debug plan。
真相:PS 的時鐘在高頻率下運行時,會影響到主板旁邊的晶振,造成手柄控制器的內(nèi)存卡控制器之間的串?dāng)_。手柄上一有信號,內(nèi)存就被干擾了。
千年蟲 bug
這是 Bug 界最經(jīng)典的傳奇之五。
這個千年問題是由 Bob Bemer(美國,ASCII 之父)在 1958 年第一次提出的。在其后的二十年里,他用了很大的努力,希望政府、企業(yè)和國際組織(如 IBM 和 ISO)來關(guān)注這個問題,但反響寥寥。直到 2000 年將要到來的時候,人們才感覺到兩千年問題的緊迫性。于是社會和政府都投入了大量的人力和物力來避免發(fā)生大規(guī)模的計算機(jī)災(zāi)難。而從現(xiàn)在來看,這些努力也取得了相應(yīng)的成果。
“千年蟲”還包括以下兩個方面的問題:一個是在一些計算機(jī)系統(tǒng)中,對于閏年的計算和識別出現(xiàn)問題,不能把 2000 年識別為閏年,即在該計算機(jī)系統(tǒng)的日歷中沒有 2000 年 2 月 29 日這一天,而是直接由 2000 年 2 月 28 日過渡到了 2000 年 3 月 1 日;另一個是在一些比較老的計算機(jī)系統(tǒng)中,在程序中使用了數(shù)字串 99(或 99/99 等)來表示文件結(jié)束、永久性過期、刪除等一些特殊意義的自動操作,這樣當(dāng) 1999 年 9 月 9 日(或 1999 年 4 月 9 日即 1999 年的第 99 天)來臨時,計算機(jī)系統(tǒng)在處理到內(nèi)容中有日期的文件時,就會遇到 99 或 99/99 等數(shù)字串,從而將文件誤認(rèn)為已經(jīng)過期或者將文件刪除等錯誤操作,引發(fā)系統(tǒng)混亂甚至崩潰等故障。
Y2K 問題,或者 Y2k 問題是兩千年問題的一個通常叫法。其中 Y 表示"year"也就是年,而 K 則表示拉丁前綴"kilo",表示 1000。Y2K 或者 Y2k 就是指 2000 年。
