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

kin*_*er1 13 c linux stack-overflow

可能重复:
分段错误和堆栈溢出之间有什么区别?

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

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

int foo()
{
  return foo();
}
Run Code Online (Sandbox Code Playgroud)

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

nin*_*alj 9

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

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

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

编辑:

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


MBy*_*ByD 4

Stackoverflow 不是一个错误,它是一种情况,它抛出的错误随着语言和平台的不同而变化。

在 wiki 中查看有关分段错误的更多信息

编辑:

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

  • 但是,当包含的段大于堆栈时,尽管尚未发生段错误,堆栈也可能会溢出。 (2认同)