技術中(zhōng)心

這裏象征着我(wǒ)(wǒ)們的态度和能力

程序員(yuán)最恐怖的夢魇是什麽?
發布者:admin    信息來源:本站原創    發布時間:2015-12-29      浏覽次數:10305
分(fēn)享到:

  曾經有位心理學的博士雇我(wǒ)(wǒ)查一(yī)個BUG,程序是他的一(yī)個學生(shēng)寫的,經常會出現奇怪的輸出。程序的功能是,從文件中(zhōng)讀取數據,提出50個問題,進行一(yī)系列計算,然後基于這位博士的研究來得出一(yī)個分(fēn)數。程序跑在大(dà)學的一(yī)台3B2上。他給我(wǒ)(wǒ)演示了程序,确認這個Bug可以重現——每次在問題之間切換的時候,總會閃出一(yī)些奇怪的字符。我(wǒ)(wǒ)覺得這應該很簡單,所以答應了他,并且我(wǒ)(wǒ)們同意按小(xiǎo)時付費(fèi)。

  Day1
  我(wǒ)(wǒ)來到這台3B2面前,用那個學生(shēng)的帳号登錄,找到了用C寫的源代碼,并開(kāi)始測試。代碼可讀性非常差,所有的代碼都寫在了一(yī)行,變量名都是三個字母,而且還是随機組合的!真慶幸我(wǒ)(wǒ)當初選擇按小(xiǎo)時收費(fèi)。我(wǒ)(wǒ)把代碼格式化爲習慣的風格,這樣看起來多少還能讀。
  做完之後,我(wǒ)(wǒ)用curses庫移到屏幕上一(yī)個點,打印一(yī)個問題和答案,然後等待回應。但是在打印出第一(yī)行之後,出現了一(yī)些亂碼,過了大(dà)約1/2秒之後,亂碼被問題覆蓋掉。這個問題應該很容易解決,隻有五個地方需要打印信息,所有的地方都出現了一(yī)閃而過的亂碼。小(xiǎo)意思,隻要删掉mvpwintw()應該就ok了。我(wǒ)(wǒ)删掉之後開(kāi)始編譯,覺得問題差不多解決了。但是運行的時候,幹擾信息又(yòu)出現了!隻是亂碼變了,但是症狀還是一(yī)樣!
  我(wǒ)(wǒ)檢查了一(yī)下(xià)代碼,發現竟然回到了我(wǒ)(wǒ)改之前的樣子!15個文件,混亂的格式,三個字母的變量。當初爲什麽不備份一(yī)下(xià)代碼呢,真想射自己一(yī)槍。我(wǒ)(wǒ)再一(yī)次格式化它們,這次把代碼放(fàng)到三個文件中(zhōng),以不同的名字命名。然後備份了整個文件夾,并且将權限設置爲隻讀。編譯之後,一(yī)切正常。一(yī)運行,這個文件夾中(zhōng)又(yòu)出現了15個文件!我(wǒ)(wǒ)改過之後的源代碼沒有被删除,然後幹擾信息又(yòu)回來了。
  我(wǒ)(wǒ)明白(bái)了,這一(yī)定是在硬盤的某個地方的代碼,在編譯的時候會将程序添加到我(wǒ)(wǒ)修改的代碼中(zhōng)去(qù)。所以我(wǒ)(wǒ)準備搜索一(yī)下(xià)include區域(/usr/include),因爲我(wǒ)(wǒ)們用的是研究的版本,所以除了kernel别的代碼都在機器上。頭文件太多了,所以在3B2上搜索需要花一(yī)些時間。以上,就是第一(yī)天的工(gōng)作了。
  Day2
  從磁盤的搜索中(zhōng)沒有得到什麽結果,這說明這些亂碼要麽是被加密了,要麽就是在lib中(zhōng)的某個地方。但是我(wǒ)(wǒ)沒有搜到,我(wǒ)(wǒ)決定搜索所有的文本文件,這次花的時間比昨天更長,第二天就這這樣過去(qù)了。
  Day3
  沒有結果。字符串是加密的。我(wǒ)(wǒ)隻好根據所有的頭文件來一(yī)點一(yī)點查了。這會花費(fèi)相當多的時間,我(wǒ)(wǒ)們同時還警告了學校,可能有人得到了Phelps博士計算機的root權限。但他們卻對此并不關心,可能隻是一(yī)台實驗室的計算機吧。
  我(wǒ)(wǒ)打開(kāi)#include文件,卻沒有發現代碼。後來發現這些都被編譯成一(yī)個文件了。也沒什麽關系,畢竟我(wǒ)(wǒ)們有源代碼,大(dà)不了就重新編譯所有的庫。
  Days4-6
  接下(xià)來是最難的部分(fēn)了,我(wǒ)(wǒ)們好不容易向學校的書(shū)呆子說明了問題。然後讓Mark(我(wǒ)(wǒ)覺得他能做Unix管理員(yuán)完全是因爲娶了Dean的女兒)開(kāi)始學習編譯。最後他終于同意交給我(wǒ)(wǒ)來做,因爲他什麽都不會。在第6天最後,編譯工(gōng)作終于完成了。
  我(wǒ)(wǒ)拿出修改之後的代碼,重新開(kāi)始編譯。一(yī)切正常,然後我(wǒ)(wǒ)運行了一(yī)下(xià),天呐!這問題又(yòu)出現了。源代碼分(fēn)成了15個文件,幹擾信息又(yòu)出來了。簡直跟魔法一(yī)樣,我(wǒ)(wǒ)覺得自己被打敗了,問題肯定不在源代碼裏。Phelps博士也有點不樂意了,他覺得這麽長時間,即使重新寫一(yī)個也該完成了。“當然”,我(wǒ)(wǒ)失落地說,“你是對的,說不定重寫比較好。”“好的,我(wǒ)(wǒ)們明天開(kāi)始重寫。”博士說。
  Day7
  見鬼去(qù)吧,我(wǒ)(wǒ)不會認輸的!我(wǒ)(wǒ)跟Phelps博士說:“你不用付給我(wǒ)(wǒ)錢了,隻要給我(wǒ)(wǒ)時間,我(wǒ)(wǒ)一(yī)定要找到這個bug。”
  Days8-14
  我(wǒ)(wǒ)學聰明了,他一(yī)定是修改了一(yī)些庫,我(wǒ)(wǒ)開(kāi)始研究編譯出來的彙編(雖然我(wǒ)(wǒ)之前根本就不懂彙編),從開(kāi)始學習,到最後看懂彙編代碼,花了六天。雖然根本沒發現什麽異常,完全就是在浪費(fèi)時間。
  Day 15
  突然,我(wǒ)(wǒ)意識到,問題可能出在編譯器上,一(yī)定是。每次編譯代碼的時候,編譯器就會往源代碼中(zhōng)添加幹擾信息。我(wǒ)(wǒ)以前也聽(tīng)說過這種情況。
  啊耶!我(wǒ)(wǒ)找到了!我(wǒ)(wǒ)們也有編譯器的源代碼,我(wǒ)(wǒ)查了一(yī)下(xià),謝天謝地,終于找到了。編譯器鏈接器中(zhōng)的代碼是這樣的:
  1)檢測所有對fopen()的調用,在打開(kāi)的文件中(zhōng)查找Phelps博士的問題,如果找到
    2)編譯的時候,重寫15個文件
  3)使用這15個文件編譯博士的程序,在鏈接的時候會輸出-o形式的名字
  編譯器被這個學生(shēng)修改了,以便往Phelps博士的程序中(zhōng)添加代碼。
  幾天之後,AT&T的技術支持提供了原版的編譯器和鏈接器代碼,我(wǒ)(wǒ)們重新編譯,替換了被修改的編譯器和鏈接器。
  但是,問題還沒有解決。編譯器被其他我(wǒ)(wǒ)們沒有的源代碼污染了。這些代碼存在于現在可執行的編譯器中(zhōng),在編譯編譯器的時候,會加入污染代碼。但是它并不修改/usr/src中(zhōng)的代碼,而是将其複制到一(yī)個隐藏文件夾,修改編譯器源代碼,編譯,最後删除隐藏文件夾。AT&T發現這個問題花了好長時間。這個學生(shēng)修改了編譯器,讓編譯器重新編譯的時候加入污染代碼。最後我(wǒ)(wǒ)們不得不從另一(yī)台3B2機器上複制過來編譯器的字節碼文件版本,才終于解決這個問題。
  通過編譯器的代碼我(wǒ)(wǒ)們還發現,如果編譯/sbin/login的話(huà)會加入一(yī)些後門代碼,可以允許任何人使用特定的密碼來登入root。這台電(diàn)腦可以通過調制解調器或Tymnet接入。終于,這件事引起了校方注意。
  這人真是個天才,不過,也太恐怖了!

  其他網友回答
  1.Bug隻在産品中(zhōng)有,開(kāi)發版本中(zhōng)卻沒有或者不可重現
  2.bug觸發的幾率很小(xiǎo)很小(xiǎo),卻又(yòu)不能小(xiǎo)到可以忽視
  3.去(qù)改不是你寫的代碼中(zhōng)的bug,原來寫代碼的這家夥已經離(lí)職了
  4.發生(shēng)bug的地方是99.9%可靠的庫,是你絕對不會懷疑的地方
  5.幾年來很多人嘗試去(qù)修改的bug,但是沒有人成功過
  6.存在邏輯錯誤的bug,隻有在運行一(yī)段時間之後才會觸發
  7.debug需要特定領域的知(zhī)識,正是你不懂的
  8.debug的deadline很緊
  9.Stack Overflow挂了
  10.在Stack Overflow上搜索問題,發現有人一(yī)年前問了同樣的問題,但是沒有人回答。
  11.分(fēn)号鍵失靈
  12.看自己一(yī)年以前的代碼,有種“這真他媽是我(wǒ)(wǒ)寫的”的感覺
  13.庫沒有文檔
  14.客戶又(yòu)改需求了
  15.==寫成了=
  16.IE(如果你做前端)
  17.Github merge沖突
  18.在錯誤的目錄下(xià) rm -rf
  19.“My code works, I don’t know why”(這句話(huà)不需要翻譯了)
  20.開(kāi)會,開(kāi)會,開(kāi)會……作爲程序員(yuán)讓我(wǒ)(wǒ)去(qù)死吧
  那麽,你的噩夢又(yòu)是什麽呢?

4000-880-989
(24小(xiǎo)時熱線)
聯系客服
微信公衆号

官方公衆号

小(xiǎo)程序

©2008-2022 CORPORATION ALL Rights Reserved. 西山區唯美網絡科技工作室版權所有 滇公網安備