在我的字节码检测项目中,我经常在VerifyErrors上偶然发现。但是,默认的java Verifier几乎没有提供有关哪条指令导致错误的信息(它只给出了方法和一条小消息)。是否有任何独立的字节码验证器,它提供了一些更高级的帮助来定位错误,至少是精确的指令位置?谢谢。
答案 0 :(得分:2)
答案 1 :(得分:2)
ASM CheckClassAdaptor.verify()提供了很好的反馈: http://asm.ow2.org/
答案 2 :(得分:2)
我也在寻找能够报告潜在验证错误的内容,尤其是IncompatibleClassChangeError
。我编写了一个小测试项目,其中包含一个API类和另一个调用API方法的客户端类,以及一个运行验证程序的主类;然后更改了API,重新编译它而不是客户端,并检查了可以捕获的内容。虽然目前没有特殊的JDK 7功能,但使用了-target 7
。
首先,最明显的是,Class.forName
可以在客户端类的签名中找到某些错误,但即使您调用{{1},它似乎也无法检查方法体是否存在对不存在的API方法等的调用};只有在实际运行有问题的代码行时,VM才会报告错误。
BCEL 5.2中的JustIce似乎最简单;
getDeclaredMethods
完成工作:
org.apache.bcel.verifier.Verifier.main(new String[] {clazz});
我试过ASM 4.0,但是
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'.
....
不起作用;也许它检查方法的格式,但不检查链接。内联org.objectweb.asm.util.CheckClassAdapter.main(new String[] {clazz});
并传递main
无效。
搜索,我也找到了https://kenai.com/hg/maxine~maxine/file/8429d3ebc036/com.oracle.max.vm/test/test/com/sun/max/vm/verifier/CommandLineVerifier.java,但我找不到任何方法来完成这项工作;随附的单元测试在运行时会抛出checkDataFlow=true
。