質問

私は、静的解析を実行するために ASM のJavaバイトコードエンジニアリングライブラリを使用しようとしています。私は、変数を検査したい状況がフィールドに割り当てられている必要があります。

私はMethodVisitorメソッドを実装visitFieldInsn()を持っています。私は、特にputfieldコマンドを探しています。それは問題ありません。問題は、私はputfieldに遭遇したとき、私はフィールドに割り当てることになるだろう変数にアクセスできるようにしたいということです。具体的には、I のの種類についての情報にアクセスしたい変数のます。

現時点では私は実際には、スタックの一番上に何を見てする必要がありますが、それを点検するために、より一般的な方法があります場合には、さらに良いです。

スタック上の変数を検査するためにASMを使用する方法はありますか?

役に立ちましたか?

解決

あなたはそのバイトコードが有効であると仮定できる場合は、

まず、フィールドに割り当てられた値の種類は、あなたがClassReaderのAPIを使用して、事前に読むことができるフィールドタイプを、一致している必要があります。

あなたは各スタック上の個々の値または与えられた命令ポインタのための変数スロットがどこから来たのかを追跡する必要があれば、あなたはSourceInterpreterとアナライザのAPIを使用することができます。基本的には、与えられた値を生成する命令を見つけることができるようになると、それはそう両方で、メソッドの呼び出しから返された値メソッドのパラメータに場合、または該当する変数から読み込む場合は、タイプ(例を推測するその命令についての情報を使用することができますあなたがメソッド記述子から型を取得することができます例)。またSourceInterpreter を使用しての例を持っている私の昔のブログ記事を参照してください。

他のヒント

私はASMに慣れていないが、私は、EclipseのJava ASTフレームワークと似て聞こえる何かを行っています。変数について知るために、私は、ASTの訪問者の適切なvisitX()メソッドで変数宣言の自分を追跡するために持っていました。私はASTノードは、変数の宣言に相当した知っていたら、それは非常に難しいことではありませんでした。

scroll top