Я могу написать, скомпилировать и успешно запустить следующую программу 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