寫在前面的話
最近CU(chinaunix)出現(xiàn)了很多問segmentation fault的帖子,其實(shí)這也是個(gè)“月經(jīng)貼”了,泡CU幾年,每個(gè)月都有人問。為了減少重復(fù)回帖,筆者結(jié)合自己的經(jīng)驗(yàn),總結(jié)了SIGSEGV在Linux中產(chǎn)生的機(jī)理,并用實(shí)際例子概括哪些編程錯(cuò)誤容易引發(fā)SIGSEGV。由于本人經(jīng)驗(yàn)有限,文中難免有疏漏和錯(cuò)誤,請發(fā)現(xiàn)的朋友發(fā)信到xing5820@163.com指正,筆者好即使修改。
內(nèi)容提要
本文簡單介紹了Segmentation fault發(fā)生的原因,結(jié)合實(shí)際例子描述了內(nèi)核向用戶態(tài)程序發(fā)送SIGSEGV信號的流程。文中以實(shí)例回答了常見的一些SIGSEGV問題,例如“為什么函數(shù)返回了棧還可以訪問?”、“為什么free()后的內(nèi)存仍然可以使用”、“為什么我遇到的是SIGSEGV而不是SIGILL信號”等。最后筆者結(jié)合自己的經(jīng)驗(yàn),列舉了一些預(yù)防SIGSEGV的編程習(xí)慣,供大家參考。SIGSEGV嚴(yán)格依賴操作系統(tǒng)、編譯器、硬件平臺,本文基于Linux、GCC、32bit IA32架構(gòu),但對其他平臺操作系統(tǒng)也有借鑒意義。
Segmentation fault in Linux.pdf
309.26 KB, 下載次數(shù): 4418
原帖由 OwnWaterloo 于 2009-12-21 17:39 發(fā)表
看了一下…… 看來那帖子我是白費(fèi)口水了……
表面上說接受, 實(shí)際上依然是在鼓勵大家編寫不可移植代碼 —— 而且, 并不是為了得到什么實(shí)際的好處。
筆者無法100%保證,所以大家在實(shí)踐中還是各自斟酌吧。
原帖由 OwnWaterloo 于 2009-12-21 18:18 發(fā)表
char a[] = "hello";
char* p;
for ( p = a+sizeof(a)-2; p>=a; p-- )
printf("%c\n", *p );
與:
for ( p = a+sizeof(a)-2; p!=a; p-- )
printf("%c\n", *p );
效果是一樣的: 如 ...
原帖由 OwnWaterloo 于 2009-12-21 19:15 發(fā)表
我是故意把空字符去掉的…… 上面2份代碼是-2 ……
要輸出空字符的話:
for ( p = a+sizeof(a)/*-1 把這個(gè)-1去掉*/; p!=a /* or p>=a */; ) {
--p;
printf("%c\n", *p );
}
那么, 在逆 ...
原帖由 zx_wing 于 2009-12-21 18:53 發(fā)表
嘿嘿,我理解你的意思,覺得標(biāo)準(zhǔn)都規(guī)定了好了,為什么就不好好按標(biāo)準(zhǔn)寫呢。
這里面一是有歷史原因,一是不方便。
比如你這里這個(gè)例子
for ( p = a+sizeof(a)-1; p!=a /* or p>=a */; ) {
--p;
...
原帖由 zx_wing 于 2009-12-21 18:35 發(fā)表
哈哈哈,哪兒有那功夫,平時(shí)忙的要死,泡個(gè)論壇都是忙里偷閑了。
上次不是chen xu過來提到說我泡CU,我差不多都要忘了有好久沒上過了。
寫書真是吃力不討好的事情,就那本在內(nèi)核版打廣告的書,我雖然只寫了 ...
原帖由 mik 于 2009-12-22 20:24 發(fā)表
zx_wing 花了不少心思啊
zx_wing 把你寫過的專集再添加、整理、修飾、校對一下,可以出書了。![]()
至少比市面上某些作者好多了。
歡迎光臨 Chinaunix (http://www.72891.cn/) | Powered by Discuz! X3.2 |