对可用堆栈的检查
局部变量是存储在堆栈上的,而栈的大小是固定的。如果局部变量过大,或者函数调用嵌套太深,栈都会被用光。
在Debug版本或者check版本里,编译器会自动插入一段代码帮程序员校验可用堆栈。
void Foo()
{
0042F580 55 push ebp
0042F581 8B EC mov ebp,esp
0042F583 B8 D4 00 40 00 mov eax,4000D4h
0042F588 E8 C4 CE FF FF call @ILT+1100(__chkstk) (42C451h)
0042F58D 53 push ebx
0042F58E 56 push esi
0042F58F 57 push edi
0042F590 8D BD 2C FF BF FF lea edi,[ebp-4000D4h]
0042F596 B9 35 00 10 00 mov ecx,100035h
0042F59B B8 CC CC CC CC mov eax,0CCCCCCCCh
0042F5A0 F3 AB rep stos dword ptr es:[edi]
UCHAR buf[1024*1024*4];
}
编译器会自动插入__chkstk函数。它的输入所需要的局部变量的大小,它被存在EAX,这个例子是将4000D4存入了EAX。
如果使用的局部变量超出栈的范围,__chkstk会触发一个异常。
对于应用程序来说,会弹出一个对话框,对于内核程序它会触发蓝屏。