سؤال

وأستخدمه ASM من أجل القيام بايت كود الأجهزة لبرامج جافا. ما أفعله هو بسيط - عندما instrumenting طريقة، وإذا كان التعليم هو PUTFIELD، ببساطة القيام DUP_X1 الحق قبل تعليمات، ثم زيارة PUTFIELD وحقن استدعاء دالة مع وسيطة يتضمن دخول كومة DUP'ed.

                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