Недавно я сделал декомпилятор для AVM2/AS3, и я заметил, что Flash-компилятор имеет тенденцию выделять много ненужного кода. Например, для определенного приложения я удалил около 10% кода без каких-либо нарушений функциональности. Это был, безусловно, мертвый код, на который не ссылались условные коды операций и блоки обработки исключений.Почему компилятор Flash ActionScript3 испускает ненужный код?
Кроме того, посмотрите на этот фрагмент:
...
313 setproperty y
315 getlocal 12
317 returnvalue 318 jump L9
L3:
322 getlocal 8
324 returnvalue
L9:
325 jump L10 ; L10 (opcode #331) does not ever exist.
; Technically, it is a jump beyond
; the end of function. This is invalid code!
L2:
329 pushnull
330 returnvalue
Ну, конечно, это неверный код, который также мертв, и, следовательно, не вызывает каких-либо побочных эффектов (кроме раздувания кодовой базы). Но почему он когда-либо испускает этот код? И почему верификатор принимает это?
На него не ссылались таблицы исключений (как было не так много других, намного больше - 10 с инструкциями - блоков мертвого кода), и, судя по спецификации, вы можете либо передать управление с помощью кода перехода или исключение. Также нет прыжков. – whitequark
@wvxvw Кстати, блоки «finally» выполняются в AS3 со странным и хитрым взломом, когда компилятор сознательно генерирует неверные коды операций для проверки трюков и виртуальной машины, снова сознательно игнорирует их. Flash - это просто огромная WTF. – whitequark
@wvxvw, правильно ли я понял вас? если вы выполняете определенную последовательность кодов операций, то виртуальная машина позволяет запущенному коду каким-то образом проверять поток своего кода, предположительно, путем нажатия их в стек данных? +50, если вы можете найти ссылки. – whitequark