对可用堆栈的检查

局部变量是存储在堆栈上的,而栈的大小是固定的。如果局部变量过大,或者函数调用嵌套太深,栈都会被用光。

在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会触发一个异常。

对于应用程序来说,会弹出一个对话框,对于内核程序它会触发蓝屏。

posted @ 2011-08-03 15:23  Fan Zhang  阅读(202)  评论(0编辑  收藏  举报