Если .maxsize равен 8, значит ли это (8 * size_t)?
Директива .maxstack
не соответствует фактическому размеру оценкистек во время выполнения.Вместо этого он указывает инструментам анализа , сколько элементов находится в стеке одновременно.Установка .maxstack
неправильно (как, например, слишком мала), метод считается не поддающимся проверке, что может привести к проблемам в сценариях с низким уровнем доверия (но это не должно быть проблемой для вас, так как вы читаете CIL, а не пишете).
Например, давайте рассмотрим простой метод Add
, который принимает параметры int
, складывает их вместе, сохраняет результат в поле класса с именем sum
и возвращает значение этого поля.
.method private hidebysig instance
int32 Add (
int32 value1,
int32 value2
) cil managed
{
.maxstack 3 // At most, there are three elements on the stack.
ldarg.0 // 1 item on the stack
ldarg.1 // 2 items on the stack
ldarg.2 // 3 items on the stack
add // 2 items on the stack
stfld int32 Foo::sum // 0 items on the stack
ldarg.0 // 1 item on the stack
ldfld int32 Foo::sum // 1 item on the stack
ret
}
В стеке оценки метода никогда не может быть более 3 элементов одновременно.
Источники:
ECMA-335,Раздел III.1.7.4