偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

最短的崩潰程序(C語言版)

開發(fā) 后端
想寫個(gè)崩潰的C語言小程序,看起來是個(gè)奇怪的主意,不過在我曾經(jīng)教過的一門實(shí)驗(yàn)課上,這是作業(yè)之一!實(shí)際上,這是一件非常有教學(xué)意義的事情。

想寫個(gè)崩潰的C語言小程序,看起來是個(gè)奇怪的主意,不過在我曾經(jīng)教過的一門實(shí)驗(yàn)課上,這是作業(yè)之一!實(shí)際上,這是一件非常有教學(xué)意義的事情。

通常學(xué)生們要么嘗試反向引用一個(gè)非法地址,要么就是除0.除0會(huì)引發(fā)SIGFPE信號(hào)(浮點(diǎn)異常)。這里有一個(gè)小例子程序,使用除零方法來使之崩潰:

  1. int main()  
  2. {  
  3.     return 1/0;  

我們也可以刪掉return關(guān)鍵字,但是當(dāng)我這么做的時(shí)候gcc不會(huì)為這些語句生成可執(zhí)行代碼,即便優(yōu)化選項(xiàng)被disable掉了。我們還可以通過把上面的語句改成賦值語句,使上面的代碼改變一些特征:

  1. i;  
  2. int main()  
  3. {  
  4.     i=1/0;  

注意我聲明了一個(gè)沒有類型的i。這樣的代碼在C89標(biāo)準(zhǔn)里是有效的,因?yàn)樗械穆暶鞫加须[形的缺省類型int。在C99和其他一些C標(biāo)準(zhǔn)里這是一個(gè)錯(cuò)誤。假定我們寫的是C89代碼,那么我們甚至可以使用隱形int來聲明main函數(shù):

  1. i;  
  2. main()  
  3. {  
  4.     i=1/0;  

那是相當(dāng)短的代碼了 — 如果我們不把用于縮進(jìn)的空格計(jì)算進(jìn)來,只有16個(gè)字符。然而,我們還可以做得更好!

當(dāng)C程序在編譯的時(shí)候,編譯器會(huì)產(chǎn)生一個(gè)或更多對(duì)象文件,文件里有對(duì)于用到的庫(kù)和全程對(duì)象(函數(shù)和變量)的符號(hào)索引。然后這些對(duì)象文件會(huì)被進(jìn)行鏈接,這時(shí)符號(hào)索引被地址所代替,就產(chǎn)生了一個(gè)可執(zhí)行文件。

編譯器在一個(gè)對(duì)象文件里提供了一個(gè)調(diào)用main函數(shù)的入口點(diǎn)。調(diào)用main函數(shù)意味著我們?cè)噲D執(zhí)行在存儲(chǔ)在main函數(shù)鏈接的位置所對(duì)應(yīng)地址里的指令。

有趣的是,鏈接器對(duì)于不同對(duì)象的類型是沒有概念的,它只知道它們的地址。所以,如果我們用一個(gè)常規(guī)的全程變量替換main函數(shù),編譯器會(huì)高興地build對(duì)象文件,因?yàn)樗魂P(guān)心對(duì)象main的類型是什么;鏈接器也會(huì)高興地鏈接它,因?yàn)樗魂P(guān)心main函數(shù)對(duì)應(yīng)的地址。

所以,考慮這個(gè)C程序:

  1. int main=0; 

這個(gè)程序會(huì)編譯成一個(gè)可執(zhí)行文件,它會(huì)試圖調(diào)用地址0,而0并不是我們能夠訪問的地址,這樣我們會(huì)得到SIGSEGV信號(hào)(分段錯(cuò)誤)。

更正:我前面關(guān)于這個(gè)程序崩潰的原因分析是錯(cuò)的。這個(gè)程序會(huì)試圖按函數(shù)方式去執(zhí)行main,而這樣不會(huì)奏效,因?yàn)榫幾g器把它放到了不可執(zhí)行的數(shù)據(jù)段。所以變量main初始化為什么值都無所謂了。(感謝Zack的糾正)

現(xiàn)在我們已經(jīng)非常接近最小的崩潰的C程序了。我們可以利用這個(gè)技巧,配合隱形int類型,來把它進(jìn)一步縮短。

  1. main=0; 

還有,C里的全局變量都會(huì)隱形地初始化為0,所以上面的代碼就等同于:

  1. main; 

好了,現(xiàn)在我們得到了最短的崩潰的C程序!

補(bǔ)充:

Hacker News用戶femto指出,編譯和鏈接一個(gè)空文件也是可能的。我沒有發(fā)布這個(gè)是因?yàn)間cc會(huì)拒絕編譯和鏈接這樣的程序,它會(huì)要求分開編譯和鏈接的過程。

另外,要是我們?cè)賹W(xué)究一點(diǎn),我應(yīng)該指出我這里的“全局”變量意思是說“靜態(tài)”變量。

英文原文:llbit.se

譯文鏈接:http://blog.jobbole.com/40286/

責(zé)任編輯:林師授 來源: 伯樂在線
相關(guān)推薦

2021-12-28 15:10:01

線程池C語言編程語言

2021-04-08 11:10:07

C語言版本Cmake

2009-05-29 09:48:05

Sandboxie瀏覽器

2011-10-21 15:33:45

Dart

2011-01-05 11:12:34

C++

2015-10-28 09:33:31

程序員崩潰編程語言

2009-06-15 11:03:10

Java語言C#語言

2013-04-09 12:18:45

socket.ioC服務(wù)器

2013-06-24 15:58:19

Windows 8.1Windows 8.1

2009-08-13 17:04:09

C#語言C#程序

2021-05-27 08:47:16

C語言C語言程序開發(fā)

2022-02-25 14:13:28

LinuxC語言開發(fā)

2022-02-25 15:49:08

Linux開源社區(qū)C語言C11

2011-05-24 17:20:57

程序員

2010-01-14 18:07:30

C++語言

2010-01-22 11:23:06

C++程序

2018-09-20 17:30:01

2022-02-25 14:51:39

LinuxC語言Linux 內(nèi)核

2011-05-17 14:53:35

C

2010-03-25 18:13:06

Python編程語言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)