1
我再次遇到了ASM問題,它是COMPUTE_FRAMES
。每當我編譯此代碼與我的自定義編譯器(以下字節碼):ASM COMPUTE_FRAMES出現If +分配錯誤
代碼:
Random random = Random()
int i = 10
Object i1 = i
if (i == 10) i1 = "a";
println "test"
字節碼:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=0, locals=0, args_size=1
0: invokestatic #14 // InterfaceMethod dyvil/lang/Random.apply:()Ldyvil/lang/Random;
3: astore_1
4: bipush 10
6: istore_2
7: iload_2
8: invokestatic #19 // Method dyvil/lang/Int.apply:(I)Ldyvil/lang/Int;
11: astore_3
12: iload_2
13: bipush 10
15: if_icmpne 21
18: ldc #21 // String a
20: astore_3
21: ldc #23 // String test
23: invokestatic #29 // Method dyvil/lang/Predef.println:(Ljava/lang/String;)V
26: return
LocalVariableTable:
Start Length Slot Name Signature
0 26 3 i1 Ljava/lang/Object;
0 26 1 random Ldyvil/lang/Random;
0 26 2 i I
0 26 0 args [Ljava/lang/String;
MethodParameters:
Name Flags
args
ASM導致在visitMaxs(0, 0)
此錯誤:
java.lang.NullPointerException
at org.objectweb.asm.Item.a(Unknown Source)
at org.objectweb.asm.ClassWriter.c(Unknown Source)
at org.objectweb.asm.ClassWriter.a(Unknown Source)
at org.objectweb.asm.Frame.a(Unknown Source)
at org.objectweb.asm.Frame.a(Unknown Source)
at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source)
不幸的是,由於ASM的創建者堅持要對其進行混淆(-.-),所以我無法弄清楚確切的問題在這裏。我嘗試刪除if
語句(留下任務)並用一個簡單的方法調用替換賦值,但兩種替代方法都不會導致任何錯誤並且完美工作。這只是if
+賦值的組合,似乎是導致此錯誤的原因。
ASM混淆?我昨天剛剛下載了源代碼,所以或許這就是要走的路。 –
我也有源代碼鏈接,但由於堆棧跟蹤使用二進制文件,所以它被混淆了。 – Clashsoft
只需將源代碼文件導入源文件夾(或者單獨的項目文件),然後刪除二進制文件依賴項。 –