2013-01-05 71 views
2

我在玩jasmin,我嘗試啓動我的.class文件,該文件應該執行簡單的字符串連接。我的茉莉來源是這樣的:jasmin黑客入侵併驗證錯誤

.class public default_class 
.super java/lang/Object 
.method public static main([Ljava/lang/String;)V 
.limit locals 1 
.limit stack 1 
invokestatic main_65428301()I 
return 
.end method 
.method public static main_65428301()I 
.limit locals 1 
.limit stack 100 
new java/lang/String 
dup 
ldc "foo" 
invokestatic java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String; 
invokespecial java/lang/StringBuilder(Ljava/lang/String;)V 
ldc "bar" 
invokevirtual java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder; 
invokevirtual java/lang/String.toString()V 
astore_0 
iconst_0 
ireturn 
.end method 

現在我能夠運行Java的罐子jasmin.jar和我default_class.class。然而,當我嘗試啓動它像Java default_class我得到一個錯誤:

Exception in thread "main" java.lang.VerifyError: (class: default_class, method: main_65428301 signature:()I) Illegal use of nonvirtual function call 

我應該在裝配改變什麼來得到這個工作?

回答

1

在JVM中,要創建對象,您必須先使用new指令,然後調用<init>方法(構造函數)。您不創建new StringBuilder並調用錯誤的構造函數名稱(應爲java/lang/StringBuilder/<init>(Ljava/lang/String;)V)。

我也看不出有什麼理由做:

new java/lang/String 
dup 

invokestatic java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String; 
+0

我試圖模仿日食在類似的情況下做,但感謝指出這一點。無論如何,我想知道什麼是錯誤的調用我的第二個主要的方法,因爲這是什麼錯誤消息建議 –

+1

@ k_wisniewski,在我看來它是指'invokespecial java/lang/StringBuilder(Ljava/lang/String;) V',它在'(class:default_class,method:main_65428301 signature:()I)' – zch

+0

好吧,我現在擺脫了這個問題 –

0

「新指令不完全創建一個新的實例,實例的初始化才能完成一個實例初始化方法已在未初始化的實例上調用「。