独立的字节码验证器

时间:2010-02-26 09:14:41

标签: java bytecode bytecode-manipulation

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

3 个答案:

答案 0 :(得分:2)

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

答案 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