如何在GCC中维护递归调用堆栈?

时间:2013-01-28 13:12:06

标签: c gcc compiler-construction

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

2 个答案:

答案 0 :(得分:8)

没有。如果你足够深入,你溢出,并且编译器无法做任何事情。


  

编辑:我应该指出,当我回答这个问题时,问题只是阅读:

     

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

答案 1 :(得分:1)

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

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

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

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