使用Java ASM的java.lang.VerifyError错误

时间:2015-03-30 10:34:17

标签: java bytecode java-bytecode-asm bytecode-manipulation

我正在尝试为Java程序编写一个检测模块。我想要添加的一个特定工具是收集方法参数列表中的所有对象并对它们进行一些处理。

目前,为了获取对象参数列表,我从堆栈中弹出所有方法args,然后逐个推送它们,在两者之间添加我的检测调用。虽然这主要有​​效,但我看到了一些

java.lang.VerifyError, [1] (****) Incompatible argument to function

在大型程序中输入错误。弹出然后将对象推回堆栈会以某种方式更改其类型吗?或者,是否有更好的解决方案可以从堆栈中复制'N'参数而不会弹出?

1 个答案:

答案 0 :(得分:1)

你在哪里弹出你的论据?你需要将它们存储在局部变量数组中吗?您完全可以覆盖已存储但稍后访问的变量。在这种情况下,您可能已经更改了存储变量的类型,这会在验证期间产生错误。

由于验证是一个确定性过程:只需将失败方法的字节代码与验证者投诉进行比较,并确保类型匹配。