为什么堆栈溢出会导致分段错误而不是Linux中的堆栈溢出?

时间:2011-08-08 17:34:44

标签: c linux stack-overflow

  

可能重复:
  What is the difference between a segmentation fault and a stack overflow?

我只是想知道,为什么堆栈溢出导致分段错误而不是堆栈溢出。

是否因为超出堆栈限制的边界而导致SIGSEGV?为什么我们在Linux中没有遇到堆栈溢出,而是一个分段错误?

int foo()
{
  return foo();
}

这个小代码应该导致堆栈溢出,但它会导致Linux中的分段错误。

2 个答案:

答案 0 :(得分:8)

堆栈溢出可能导致几种不同的硬件错误。

  • 可能导致尝试访问程序没有适当权限的内存→内核将为该进程引发SIGSEGV(分段违例)信号。
  • 可能导致尝试执行非法指令(例如:您覆盖返回地址以指向无效指令)→内核将引发SIGILL(非法指令)信号。
  • 在某些平台上可能是SIGBUS(例如:对齐异常)。

在堆栈溢出后发生所有这些错误。一个选项是添加堆栈溢出保护(ProPolice,...),以便在它们引起更严重的问题之前捕获堆栈溢出。

编辑:

你的意思是“真正的堆栈溢出”。好吧,这种情况由SEGV覆盖(尝试访问进程没有权限的内存),因此它获得了一个SEGV,而不是特殊套管的每一个更一般的SEGV情况。

答案 1 :(得分:2)

Stackoverflow不是错误,它是一种情况,从它抛出的错误会从语言变为语言,从平台变为平台。

详细了解segmentation fault in wiki

修改

为了更清楚 - 在您的情况下,调用堆栈溢出,程序尝试写下一个无效地址的调用,导致分段错误。