ASMバイトコード操作フレームワークを使用して、Java コードの静的分析を実行しています。オブジェクトのフィールドが再割り当てされたとき、つまりこの種のコードが発生したときを検出したいと考えています。
class MyObject {
private int value;
void setValue(int newValue) { this.value = newValue; }
}
次のコードを ( を実装するクラスでClassVisitor
) 使用すると、上記の状況を検出できます。
@Override
public void visitFieldInsn(int opcode, String owner, String name, String desc) {
if(opcode == Opcodes.PUTFIELD) {
// do whatever here
}
}
ただし、このコードは、フィールドを所有するオブジェクトに関係なく呼び出されます。オブジェクトに対してPUTFIELD 操作が実行される、より具体的なケースを見つけたいと思いthis
ます。たとえば、最初のコード スニペットと次のようなコードを区別したいと考えています。
public MyObject createNewObjectWithDifferentField() {
MyObject newObject = new MyObject();
newObject.value = 43;
return newObject;
}
上記の場合、PUTFIELD 操作は引き続き実行されますが、ここでnewObject
はオブジェクトではなくローカル変数 ( ) に対して実行されthis
ます。これは、割り当て時のスタックの状態によって異なりますが、バイトコードがまったく異なるいくつかの異なるシナリオに遭遇したため、この複雑さを処理する方法を探しています。
this
PUTFIELD がオブジェクトに属するフィールドを再割り当てしていることを確認するにはどうすればよいですか?
編集
既存のバイトコードを計測するのではなく、分析のみを実行するために ASM を使用しています。可能であれば、バイトコードを変更せずにこれを発見する方法を見つけたいと思います。