在无限递归main()中Segfault之后的不同运行时间

时间:2013-06-24 08:00:52

标签: c linux segmentation-fault stack-overflow

就像我们所知, 在Linux世界中,用户空间中的无限重复“main()”将收到“分段错误”的碎片,这实际上是由堆栈溢出引起的。 (如下面的代码所示)

#include <stdio.h>
void main(void) 
{
    main ();
}

实验和问题:

将代码更改为:

#include <stdio.h>
int cnt = 0; 
void main(void) {
    printf("cnt %d\n", cnt++);
    main();
}

测试环境:

x86-64 ubuntu, GCC-4.6

我需要你的帮助,并提前致谢!

为什么分段错误发生在不同的“cnt”值中:

cnt:523614

cnt:523602

cnt:523712

cnt:523671

1 个答案:

答案 0 :(得分:2)

这可能是由于Address space layout randomization。如果您运行程序稍加修改的示例:

#include <stdio.h>
int cnt = 0;
void main(void)
{
    int a;
    printf("cnt %d %p\n", cnt++, (void*)&a); fflush(stdout);
    main();
}

您将看到a的地址在程序的各种运行中不一致。可能堆栈的初始大小也略有随机化,导致这个空间中的堆栈帧数量略有不同。

PS:我添加了fflush,因此可以安全地通过例如tailgrep传输程序的输出,否则缓冲可能会模糊输出的实际最后一行

P.S2:我必须将print更改为printf并添加#include <stdio.h>

P.S3:您不应该对您的程序使用优化,否则尾部调用优化将删除您的递归,您的程序将实际循环。我的程序版本没有这样做,因为别名为a