Подтвердить что ты не робот

Почему программа с PEVerified стеком переполнения сценария (maxstack) не сбой CLR?

Я могу написать, скомпилировать и успешно запустить следующую программу IL с размером .maxstack, установленным в 1, что слишком мало, потому что программа имеет два значения в стеке в один момент времени (т.е. 2 + 2 == 4), Эта программа не сбой в CLR и завершает выполнение со всем ожидаемым выходом "Hello World", за которым следует номер 4.

Однако эта программа (по праву) не пройдет PEVerify, которая указывает исключение со следующим сообщением:

Microsoft (R).NET Framework PE Verifier. Версия 4.0.30319.18020 Copyright (c) Корпорация Microsoft. Все права защищены.

[IL]: Ошибка: [C:\tmp\hello.exe: HelloWorld1.Program:: Main] [смещение 0x00000011] Переполнение стека. 1 Ошибка Проверка hello.exe

Почему он не падает в 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
4b9b3361

Ответ 1

Ответ, полученный из комментариев к вопросу через @RaymondChen

Инфраструктура общих языков (CLI)
Раздел III
Набор инструкций CIL
Окончательный проект, апрель 2005 г.

1.7.4 Должен обеспечить maxstack

[... snip...]
[Примечание: Maxstack связан с анализ программы, а не размер стека во время выполнения. Это не задает максимальный размер в байтах кадра стека, но а скорее количество элементов, которые должны отслеживаться инструментом анализа.end note]