我可以编写,编译并成功运行以下IL程序,并将.maxstack大小设置为1,这太小了,因为该程序在某个时间点在堆栈上有两个值(即2 + 2 == 4)。该程序不会在CLR中崩溃,并以“Hello World”的所有预期输出和数字4结束执行。

但是,此程序将(正确地)不通过PEVerify,该错误指出带有以下消息的堆栈溢出异常:



为什么它不会在CLR中崩溃?

.assembly extern mscorlib {}
.assembly SampleIL {
    .ver 1:0:1:0
}

.class private auto ansi beforefieldinit HelloWorld1.Program
    extends [mscorlib]System.Object
{
    // Methods
    .method private hidebysig static
        void Main (
            string[] args
        ) cil managed
    {
        // Method begins at RVA 0x2050
        // Code size 13 (0xd)
        .maxstack 1 // **** NOTE THIS LINE *****
        .entrypoint

        IL_0000: nop
        IL_0001: ldstr "hello world"
        IL_0006: call void [mscorlib]System.Console::WriteLine(string)
        IL_000b: nop

        ldc.i4 2
        ldc.i4 2
        add
        call void [mscorlib]System.Console::WriteLine(int32)

        IL_000c: ret
    } // end of method Program::Main

    .method public hidebysig specialname rtspecialname
        instance void .ctor () cil managed
    {
        // Method begins at RVA 0x205e
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ret
    } // end of method Program::.ctor

} // end of class HelloWorld1.Program

最佳答案

通过@RaymondChen从问题评论中得出的答案

公共(public)语言基础结构(CLI)
分区III
CIL指令集
最终草案,2005年4月

关于clr - 为什么带有PEVerified堆栈溢出方案(maxstack)的程序不会使CLR崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23924289/

10-12 23:57