写在前面的话
最近CU(chinaunix)出现了很多问segmentation fault的帖子,其实这也是个“月经贴”了,泡CU几年,每个月都有人问。为了减少重复回帖,笔者结合自己的经验,总结了SIGSEGV在Linux中产生的机理,并用实际例子概括哪些编程错误容易引发SIGSEGV。由于本人经验有限,文中难免有疏漏和错误,请发现的朋友发信到xing5820@163.com指正,笔者好即使修改。
内容提要
本文简单介绍了Segmentation fault发生的原因,结合实际例子描述了内核向用户态程序发送SIGSEGV信号的流程。文中以实例回答了常见的一些SIGSEGV问题,例如“为什么函数返回了栈还可以访问?”、“为什么free()后的内存仍然可以使用”、“为什么我遇到的是SIGSEGV而不是SIGILL信号”等。最后笔者结合自己的经验,列举了一些预防SIGSEGV的编程习惯,供大家参考。SIGSEGV严格依赖操作系统、编译器、硬件平台,本文基于Linux、GCC、32bit IA32架构,但对其他平台操作系统也有借鉴意义。
Segmentation fault in Linux.pdf
309.26 KB, 下载次数: 4418
原帖由 OwnWaterloo 于 2009-12-21 17:39 发表
看了一下…… 看来那帖子我是白费口水了……
表面上说接受, 实际上依然是在鼓励大家编写不可移植代码 —— 而且, 并不是为了得到什么实际的好处。
笔者无法100%保证,所以大家在实践中还是各自斟酌吧。
原帖由 OwnWaterloo 于 2009-12-21 18:18 发表
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 发表
我是故意把空字符去掉的…… 上面2份代码是-2 ……
要输出空字符的话:
for ( p = a+sizeof(a)/*-1 把这个-1去掉*/; p!=a /* or p>=a */; ) {
--p;
printf("%c\n", *p );
}
那么, 在逆 ...
原帖由 zx_wing 于 2009-12-21 18:53 发表
嘿嘿,我理解你的意思,觉得标准都规定了好了,为什么就不好好按标准写呢。
这里面一是有历史原因,一是不方便。
比如你这里这个例子
for ( p = a+sizeof(a)-1; p!=a /* or p>=a */; ) {
--p;
...
原帖由 zx_wing 于 2009-12-21 18:35 发表
哈哈哈,哪儿有那功夫,平时忙的要死,泡个论坛都是忙里偷闲了。
上次不是chen xu过来提到说我泡CU,我差不多都要忘了有好久没上过了。
写书真是吃力不讨好的事情,就那本在内核版打广告的书,我虽然只写了 ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |