Является ли стек стека EVM (при любой инструкции) независимым от пути выполнения?

Я пытаюсь проанализировать некоторый байт-код EVM, сравнивая его с Java-байт-кодом.

В спецификации Java указано следующее в JVM спецификация §4.9.2. Структурные ограничения :

  

Если инструкция может выполняться по нескольким различным путям выполнения, стек операнда должен иметь ту же глубину (§2.6.2) до выполнения команды, независимо от пути.

Итак, для любой заданной команды стек операнда имеет четко определенный размер.

Теперь я задаюсь вопросом, верно ли то же самое для байт-кода EVM?

6 голосов | спросил Floern 13 FebruaryEurope/MoscowbMon, 13 Feb 2017 03:11:29 +0300000000amMon, 13 Feb 2017 03:11:29 +030017 2017, 03:11:29

1 ответ


3

Нет , это не выполняется для EVM.

Простой контрпример является рекурсивной функцией:

function f(int a) {
    f(a);
}

Это будет скомпилировано для:

tag 5
  JUMPDEST          ; method entry
  PUSH [tag] 7      ; push return address
  DUP2              ; push argument `a`
  PUSH [tag] 5      ; push method address
  JUMP [in]         ; call method
tag 7
  JUMPDEST          ; method return

Для каждого рекурсивного вызова стек получает еще два элемента. Таким образом, размер стека отличается для каждого вызова.


Теперь, как Java обрабатывает рекурсию и поддерживает фиксированный размер стека операндов? Разница между JVM и EVM заключается в том, что JVM создает новый frame с новым стеком операндов для каждого вызова метода, тогда как EVM имеет только один стек глобальных операндов. EVM даже не знает концепцию методов, хотя предложены подпрограммы .


Это оставляет открытым вопрос, хотя ... Сохраняет ли он размер стека для кода наряду с рекурсивными вызовами? Например. для блока if-else размер стека будет таким же, независимо от выполняемой ветви?

ответил Floern 16 FebruaryEurope/MoscowbThu, 16 Feb 2017 01:06:09 +0300000000amThu, 16 Feb 2017 01:06:09 +030017 2017, 01:06:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132