独立的字节码validation器

在我的字节码检测项目中,我经常在VerifyErrors上偶然发现。 但是,默认的java Verifier几乎没有提供关于哪条指令导致错误的信息(它只给出了方法和一条小消息)。 是否有任何独立的字节码validation器,它提供了一些更高级的帮助来定位错误,至少是精确的指令位置? 谢谢。

与涉及JVM字节码的任何项目一样,我首先检查BCEL是否有任何可能对您有用的内容。 此外,也许FindBugs可能有所帮助 – 虽然我不确定它是否假设可validation的字节码开始与否。

ASM CheckClassAdaptor.verify()提供了很好的反馈: http : //asm.ow2.org/

我也在寻找可以报告潜在validation错误的东西,尤其是IncompatibleClassChangeError 。 我写了一个小测试项目,其中包含一个API类和另一个调用API方法的客户端类,以及一个运行validation程序的主类; 然后更改了API,重新编译它而不是客户端,并检查了可以捕获的内容。 使用-target 7虽然目前没有特殊的JDK 7function。

首先也是最明显的, Class.forName可以在客户端类的签名中找到某些错误,但是它似乎没有检查方法体是否调用不存在的API方法等,即使你调用了getDeclaredMethods ; 只有在实际运行有问题的代码行时,VM才会报告错误。

在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但我找不到任何办法让这项工作; 附带的unit testing在运行时抛出ClassNotFoundException