بايت كود توليد الأجهزة خطأ جافا المدقق
-
05-07-2019 - |
سؤال
وأستخدمه 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: توقع العثور على الكائن / مجموعة على كومة
هل يمكن أن نقدم له أي مساعدة في هذا؟
المحلول
وهناك بعض الثغرات في الأجهزة الخاصة بك. على سبيل المثال، فإنه لا تحقق مما إذا كنت داخل أسلوب ثابت، لذلك هذا المتغير الحالي.
لا تنتمي إلى StackOverflow