PE文件中的"栈的大小"怎么在运行时检查VC程序是否栈溢出
PE文件中的栈的大小如何在运行时检查VC程序是否栈溢出?例如,我有个函数调用:C/C++ codevoid f(...){int
PE文件中的"栈的大小"如何在运行时检查VC程序是否栈溢出?
例如,我有个函数调用:
C/C++ codevoid f(...){ int buf[1000000];//栈上溢出...}
程序运行到f的时候,栈上溢出,程序崩溃。我上网查了一下说,VC编出来的windowsPE文件里面,有一个字段是设置栈的大小的。我的问题是: 难道VC编出来的程序在运行过程中,会不断的让OS帮它检查当前堆栈的大小是不是超出了这个值?
(1)如果每运行一个堆栈操作都要做检查,那岂不是太低效了?
(2)如果不是的话,那windows又如何知道一个程序什么时候栈的大小越界了呢?
这似乎是个两难问题啊,还请高手指点!
[解决办法]一开始,你的程序会被分配一定的栈空间,当你的程序申请栈空间的时候如果超过了当前分配的大小会产生一个页错误,系统检测到以后再尝试分配一块空间,如果新分配的空间超过了你指定的大小就会报一个栈溢出的异常。
负责检测的就是一个系统函数,叫_s什么的记不清了,应该是个C库函数。