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

标签 c linux stack-overflow

<分区>

Possible Duplicate:
What is the difference between a segmentation fault and a stack overflow?

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

是不是栈越界导致SIGSEGV?为什么我们在 Linux 中没有遇到堆栈溢出,而是遇到段错误?

int foo()
{
  return foo();
}

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

最佳答案

堆栈溢出会导致多种不同类型的硬件错误。

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

所有这些错误都发生在堆栈溢出之后。一种选择是添加堆栈溢出保护(ProPolice,...),以便在堆栈溢出导致更严重的问题之前将其捕获。

编辑:

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

关于c - 为什么堆栈溢出导致段错误而不是 Linux 中的堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6986133/

相关文章:

计算节点值的最大总和并计算给出总和的特定路径[C]

linux - 将 eBPF 字节码附加到 SOCK_STREAM 套接字

linux - 如何在命令行上不显示 KeyStorePassword?

actionscript-3 - Flex弹出窗口: Stack Overflow?

java - 哈希表中的冲突解决

c - libgdiplus编译错误

c++ - 如何从 COFF 目标文件中读取函数代码?

c++ - 尝试构建 SFML 示例时出错

c# - Silverlight 嵌套自定义控件导致 StackOverflowException

c++ - CMake 导入的库行为