WebAssembly: компиляция циклов с возвращаемыми значениями, которые не работают должным образом - PullRequest
1 голос
/ 26 февраля 2020

Я пишу анализатор байт-кода WebAssembly и натолкнулся на некоторое поведение, связанное с тем, как различные компиляторы WebAssembly обрабатывают l oop инструкции, которые мне трудно согласовать со спецификацией WebAssembly.

Следующий фрагмент кода ( взятый из WebAssembly l oop тестовых случаев ) показывает вложенный l oop, который, как ожидается, вернет целое число i32.

(module
  (type $t0 (func (result i32)))
  (func $cont-inner (export "cont-inner") (type $t0) (result i32)
    (local $l0 i32)
    i32.const 0
    local.set $l0
    local.get $l0
    loop $L0 (result i32)
      loop $L1 (result i32)
        br $L0
      end
    end
    i32.add
    local.set $l0

Визуальный анализ вышеизложенного показывает, что этот синтаксис не полностью соответствует спецификации (насколько я понимаю), поскольку тело цикла не имеет значений стека для возврата.

Конечно, вышеприведенные циклы образуют бесконечный l oop, и поэтому во время выполнения программа фактически не выйдет из самого внешнего l oop.

Но некоторые из компиляторов, которые я пытался скомпилировать, без проблем, например, webassembly.studio. И наоборот, если безусловная ветвь заменяется условной ветвью, компиляторы фактически ведут себя так, как я ожидаю, и жалуются на отсутствующее возвращаемое значение.

Я что-то упустил в спецификации WebAssembly о том, как работают циклы? Или компиляторы неявно проводят анализ достижимости?

1 Ответ

1 голос
/ 26 февраля 2020

Что вы наблюдаете, так это то, что стек становится полиморфным c после безусловной ветви. Это означает, что стек ведет себя так, как если бы он имел значения, необходимые для проверки.

В этом случае инструкция br $L0 делает стек полиморфным c. Обычно падение с конца loop $L1 требует i32 в стеке, но поскольку стек имеет полиморф c, средство проверки типов ведет себя так, как будто это правда.

Вы можете найти алгоритм проверки в спецификации c полезен. Я также писал о проверке типов WebAssembly некоторое время назад , которая может быть полезным ресурсом для вас.

...