最近、AVM2/AS3 用の逆コンパイラを作成しましたが、Flash コンパイラが不要なコードを大量に発行する傾向があることに気付きました。たとえば、特定のアプリケーションでは、機能を損なわずにコードの約 10% を削除しました。これは、条件付きオペコードや例外処理ブロックによって参照されない、確かにデッド コードでした。
また、このスニペットを見てください。
...
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
もちろん、これは無効なコードであり、無効なコードであるため、悪影響を与えることはありません (コードベースの肥大化を除く)。しかし、なぜそのコードを発行するのでしょうか? そして、なぜ検証者はそれを受け入れるのですか?