大众小说网 - 无弹窗无广告小说在线阅读

大眾小說網 > 讀書成神豪 > 第195章 IOCCC

第195章 IOCCC


  章杉留意到《C專家編程》里面提到了一個奇怪的大賽——國際C語言混亂代碼大賽。

  出門右拐度娘了一下:

  國際C語言混亂代碼大賽(IOCCC,  The  International  Obfuscated  C  Code  Contest)是一項國際編程賽事,從1984年開始,每年舉辦一次(年、年和2006年例外)。目的是寫出最有創意的最讓人難以理解的C語言代碼。

  章杉:Σ(っ°Д°;)っ

  居然還特么真的有這個比賽?而且還是國際編程賽事???

  IOCCC是由藍登·克特·諾爾(Landon  Curt  Noll)與拉里·貝索(Larry  年受雇于國家半導體(National  x程序移殖事業群時開始的。比賽的點子是來自他們倆比較彼此有關于它們得修正的某些寫得很爛代碼的筆記。

  每年,IOCCC的比賽規則會張貼在其網站上。規則每年不同,并且會隨附上一組的指導方針以試圖表達規則的精神。

  這些規則通常是蓄意書寫成文,伴隨著精巧的漏洞讓參賽者有所鼓勵去發現并濫用。

  嘖,雖然聽起來不太入流,但章杉覺得有必要還是可以參加一下的!

  趣味性十足有木有~

  書里面倒也不全是有趣的東西,有些東西很沉重!

  在《C專家編程》這本書中,章杉看到了這樣一個例子:

  【看書領紅包】關注公  眾號【書友大本營】  看書抽最高888現金紅包!

  “1993年春天,在SunSoft  的操作系統開發小組里,我們(《C專家編程》作者)接到了一個“一級優先”的  Bug報告,是一個關于異步I/O庫的問題。

  如果這個  Bug不解決,將會使一樁價值2000  萬美元的硬件產品生意告吹,因為對方需要使用這個庫的功能。所以,我們頂著重壓尋找這個Bug。經過幾次緊張的調試,問題被圈定在下面這條語句上:

  x  ==  2;

  這是個打字錯誤,它的原意是一條賦值語句。程序員的手指放在“=”鍵上,不小心多按了一下。

  這條語句成了將x與2進行比較,比較結果是true或者  false,然后丟棄這個比較結果。”

  這個bug事件章杉看了也是感慨萬千!

  盡管《C專家編程》的作者在自說自話,但章杉也深有同感。

  不小心多打一個等號,手抖而已~

  誰又能100%保證不會犯類似的錯誤呢!

  說起來“=”和“==”這兩個雖然看起來區分不大,但這在C語言中全然是兩個不同的符號!

  在  C  語言中,最容易產生混淆的操作符要屬“=”與“==”。

  其中,“=”并不等于符號,而是賦值操作符,如  ,意味著將3賦值給x。

  相對于只有一個等號的賦值操作符,關系操作符中的等于操作符采用兩個等號“==”來表示。

  正因如此,導致了一個潛在的問題:出于習慣,我們可能經常將需要等于操作符的地方寫成賦值操作符。

  或者將需要寫賦值運算符的地方不小心手賤多打一個“=”

  不得不說C語言的表達能力也實在是強,按照《C編程專家》一書中描述的情況,編譯器對于“求一個表達式的值,但不使用該值”這樣的語句竟然也能接受,并且不發出任何警告,只是簡單地把返回結果丟棄。

  而這種問題在實際編譯的情況下并不會報錯。

  只能慎重又慎重!

  說起來像書中所說的例子簡直是比較“溫柔的錯誤”了,有些和計算機錯誤相關聯的事故動輒就人命關天。

  章杉不止一次地聽計算機系的教授說過:

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

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

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

  類似的事故還有1996年6月份的阿麗亞娜火箭事件。

  程序員在編程時必須定義程序用到的變量,以及這些變量所需的計算機內存,這些內存用比特位定義,一個16位的變量可以代表,767中間的值(這個數值的由來是2^15-1)。

  而一個64位的變量可以代表?..808到..807中間的值。

  1996年6月4日,阿麗亞娜5型運載火箭的首次發射點火后,火箭開始偏離路線,最終被逼引爆自毀,整個過程只有短短30秒。

  阿麗亞娜5型運載火箭基于前一代4型火箭開發。在4型火箭系統中,對一個水平速率的測量值使用了16位的變量及內存,因為在4型火箭系統中反復驗證過,這一值不會超過16位的變量,而5型火箭的開發人員簡單復制了這部分程序,而沒有對新火箭進行數值的驗證,結果發生了致命的數值溢出。

  發射后這個64位帶小數點的變量被轉換成16位不帶小數點的變量,引發了一系列的錯誤,從而影響了火箭上所有的計算機和硬件,癱瘓了整個系統,因而不得不選擇自毀,4億美金變成一個巨大的煙花。

  俱往矣!

  感慨之余,章杉及時在系統進行了結算:

  說起來雖然章杉讀書的速度很快,但還是用了3個小時才將這本書搞定!

  “叮~宿主共讀書3個小時,累計獲得金錢21600元,累計獲得43200經驗(含Ⅱ號徽章加成)”

  “另外宿主共閱讀43萬字,累計收獲43萬元軟妹幣~”

  “目前系統等級為12級,升級所需經驗為/”

  :。:


  (https://www.dzxsw.cc/book/170215/8636244.html)


1秒記住大眾小說網:www.dzxsw.cc。手機版閱讀網址:m.dzxsw.cc