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