【问题标题】:How is recursion call stack maintained in GCC? [closed]GCC 中如何维护递归调用栈? [关闭]
【发布时间】:2013-01-11 20:04:48
【问题描述】:

GCC 如何确保堆栈不溢出? 它不应该检查 Size 是否小于它可以保留的 MAX 并相应地提示用户,尤其是当它被隐式定义时?这不是一个很好的编程范例吗?

【问题讨论】:

  • 它没有,也不它不会是一个伟大的编程范式。你会问用户什么?不管他说什么,除了中止计算,你还能做什么?不是一个真正的问题。

标签: c gcc compiler-construction


【解决方案1】:

它没有。如果递归足够深,溢出,编译器对此无能为力。


编辑:我应该指出,在我回答这个问题时,问题只是这样写:

“GCC如何确保堆栈不溢出?”

【讨论】:

    【解决方案2】:

    Linux 使用“警戒区”。它在每个线程的堆栈末尾放置一个或多个访问保护页。

    如果程序访问保护区,操作系统会处理故障。如果线程已经在使用它的最大允许堆栈,那么它会终止某些东西(线程或整个进程,我不记得是哪个)。否则,它会尝试将内存映射到保护区占用的地址以用作堆栈,并保护新扩大的堆栈末尾之外的新区域。

    提示用户并不适合像 Linux 这样的操作系统,其中许多进程不受用户监控,因此在问题出现时可能没有任何登录用户。所以你的过程失败了。由于它是一个通用编译器,gcc 也不会尝试运行时用户交互。

    其他操作系统和平台可能有也可能没有堆栈保护页面(Windows 有)。 gcc 真正需要做的就是确保如果堆栈将被超出,它不会因为向前跳跃而“错过”保护页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-27
      • 2014-07-13
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 2017-01-02
      • 2019-09-30
      • 1970-01-01
      相关资源
      最近更新 更多