Инструментарий байт-кода, генерирующий ошибку верификатора Java

StackOverflow https://stackoverflow.com/questions/1402934

Вопрос

Я использую 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 с атрибуция
Не связан с StackOverflow
scroll top