GCC 如何确保堆栈不溢出?它不应该检查 Size 是否小于它可以保留的 MAX 并相应地提示用户,尤其是当它被隐式定义时?这不是一个很好的编程范例吗?
问问题
157 次
2 回答
8
它没有。如果递归足够深,就会溢出,编译器对此无能为力。
编辑:我应该指出,在我回答这个问题时,问题只是简单地说:
“GCC 如何确保堆栈不溢出?”
于 2013-01-28T13:13:23.420 回答
1
Linux 使用“警戒区”。它在每个线程的堆栈末尾放置一个或多个访问保护页。
如果程序访问保护区,则操作系统处理故障。如果线程已经在使用它的最大允许堆栈,那么它会终止某些东西(线程或整个进程,我不记得是哪个)。否则,它会尝试将内存映射到保护区占用的地址以用作堆栈,并保护新扩大的堆栈末尾之外的新区域。
提示用户并不真正适合像 Linux 这样的操作系统,其中许多进程不受用户监控,因此在问题出现时可能没有任何登录用户。所以你的过程失败了。由于它是一个通用编译器,gcc 也不会尝试运行时用户交互。
其他操作系统和平台可能有也可能没有堆栈保护页面(Windows 有)。gcc 真正需要做的就是确保如果堆栈将被超出,它不会因为向前跳很长的路而“错过”保护页面。
于 2013-01-28T13:45:47.137 回答