私は最近、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ところで、最終的にブロックされるのはAS3で、奇妙で邪悪なハックです。コンパイラーが意図的に無効なオペコードを生成して検証者を騙し、VMは故意に無視します。 Flashはほんの巨大なWTFです。 – whitequark
@wvxvw、私はあなたを正しく理解しましたか?特定のシーケンスのオペコードを実行すると、VMは実行中のコードが何らかの形でオペコード・ストリームを調べることを可能にします。もしあなたが参照を見つけることができたら+50。 – whitequark