簡體   English   中英

字節碼檢測生成Java驗證程序錯誤

[英]Bytecode instrumentation generating java verifier error

我正在使用ASM來為Java程序進行字節碼檢測。 我正在做的事情很簡單-插入一個方法時,如果指令是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:期望在堆棧上找到對象/數組

您能對此提供任何幫助嗎?

儀器上有一些孔。 例如,它不會檢查您是否在靜態方法中,因此存在此變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM