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

java.lang.VerifyError errors using Java ASM

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

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

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

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

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

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