独立的字节码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
。