Поскольку слот стека действует как переменная: его можно использовать несколько раз (например, в обеих ветвях if
), но действие инструкции происходит только один раз, когда значение помещается в стек.
Декомпилятор, который использует стек инструкций, фактически заставил бы побочные эффекты инструкции происходить в точке, где значение извлекается из стека.Это будет переупорядочение программы, которое может незначительно изменить поведение программы -> неправильная декомпиляция.
В принципе, использование стека инструкций было бы возможно в базовых блоках;но когда есть поток управления (исходящий или входящий) или инструкция dup
, весь стек инструкций должен быть преобразован в стек переменных.В настоящее время ILSpy ILReader
использует один проход (как указано в спецификации Ecma-335), поэтому он не знает о входящем потоке управления во время выполнения ILReader
, поэтому он всегда должен использовать стек переменных, чтобыбезопасный.
Оказывается, это не то, как .NET Framework читает байт-коды IL, и некоторые обфускаторы используют это различие.Поэтому в будущем мы можем переписать ILReader
, чтобы он работал больше как импортер байт-кода .NET, после чего мы могли бы перейти к смешанному стеку переменных + модель стека инструкций. Выпуск ILSpy # 901