2010-02-26 61 views
7

在我的字節碼檢測項目中,我經常在VerifyErrors上偶然發現。但是,默認的java驗證程序幾乎沒有提供關於哪條指令導致錯誤的信息(它只給出方法和一條小信息)。是否有任何獨立的字節碼驗證器,它提供了更高級的幫助來定位錯誤,至少是精確的指令位置?謝謝。獨立字節碼驗證程序

回答

2

與任何涉及JVM字節碼的項目一樣,我將首先檢查BCEL是否有任何可能對您有用的內容。此外,也許FindBugs可能會有所幫助 - 雖然我不確定它是否假定可驗證的字節碼是否開頭。

+1

爲什麼我沒有想到這一點。我實際上使用BCEL,但它從來沒有發生過我檢查它的驗證器。它實際上有一個叫JustIce。 – 2010-02-26 09:45:51

2

我也一直在尋找的東西,會報告潛在的驗證錯誤,尤其是IncompatibleClassChangeError秒。我用一個API類和另一個調用API方法的客戶端類寫了一個小測試項目,再加上一個運行驗證器的主類;然後更改API,重新編譯它,但不是客戶端,並檢查瞭解可能被捕獲的內容。目前使用的是-target 7,雖然沒有特別的JDK 7功能。

首先,也是最明顯的,Class.forName可以在客戶端類的簽名一定的誤差,但它似乎並沒有檢查方法機構將呼叫不存在API方法等,即使你打電話getDeclaredMethods;只有在有問題的代碼行實際運行時,虛擬機纔會報告錯誤。

在BCEL 5.2中的JustIce似乎是最簡單的;

org.apache.bcel.verifier.Verifier.main(new String[] {clazz}); 

這項工作:

Pass 3a, method number 1 ['public void m()']: 
VERIFIED_REJECTED 
Instruction invokestatic[184](3) 4 constraint violated: 
    Referenced method 'x' with expected signature '()V' not found in class 'API'. 
    .... 

我試過ASM 4.0,但

org.objectweb.asm.util.CheckClassAdapter.main(new String[] {clazz}); 

不工作;也許它會檢查方法的格式,但不能鏈接。內嵌main並通過checkDataFlow=true沒有幫助。

搜索,我也發現https://kenai.com/hg/maxine~maxine/file/8429d3ebc036/com.oracle.max.vm/test/test/com/sun/max/vm/verifier/CommandLineVerifier.java,但我找不到任何方式使這項工作;運行時伴隨的單元測試會拋出ClassNotFoundException