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

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

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

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

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

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

最佳答案

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

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

关于使用 Java ASM 的 java.lang.VerifyError 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29343948/

相关文章:

java - 了解 spark 中的随机播放

java - Android HttpURLConnection 和带有特殊字符的 URL

java - HTTP 状态 404,错误 : The requested resource is not available

javascript - 如何在javascript中将字节码转换为zip文件

java - 使用基于 OW2 ASM 事件的方法合并类

java - 将组合框设置为 java.swt 表中几列的 TableItems 的单元格内容

java - 检查Java中是否使用了类或方法

JAVA BCEL NEWARRAY getType 基本类型

java - ASM 不报告常量指令

java - 如何使用 ASM 读取 Java 类方法注释值