Java検証エラーを生成するバイトコード計測
-
05-07-2019 - |
質問
Javaプログラムのバイトコード計測を行うためにASMを使用しています。私がやっていることは簡単です-メソッドをインスツルメントするとき、命令がPUTFIELDの場合、命令の直前にDUP_X1を実行し、PUTFIELDにアクセスし、DUPされたスタックエントリを含む引数で関数呼び出しを注入します。
public void visitFieldInsn(
int opcode,
String owner, // owner of this field...
String name,
String desc) {
boolean did_dup = false;
if(opcode == Opcodes.PUTFIELD) {
if(!owner.equals("java/lang/System")) {
if (desc.startsWith("L")) {
mv.visitInsn(Opcodes.DUP_X1);
did_dup = true;
}
}
}
mv.visitFieldInsn(opcode, owner, name, desc);
if (did_dup) {
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/amir/ASide", "updateG", "(Ljava/lang/Object;Ljava/lang/Object;)V");
}
}
コードは、それぞれこの前と後の計装のように見えます:
public void setA(ClassA classa)
{
refA = classa;
eyeColor = classa.eyeColor;
}
public void setA(ClassA classa)
{
ASide.updateG(refA = classa, this);
ASide.updateG(eyeColor = classa.eyeColor, this);
}
しかし、インストルメントされたコードを実行すると、次のようになります:
java.lang.VerifyError:スタック上のオブジェクト/配列を見つけることを期待しています
これに関して何か助けがありますか?
解決
計装にいくつかの穴があります。たとえば、静的メソッド内にいるかどうかはチェックしないため、この変数が存在します。
所属していません StackOverflow