【发布时间】:2015-07-23 23:21:30
【问题描述】:
我正在尝试为 Java 程序编写检测模块。我希望添加的一个特定工具是收集方法参数列表中的所有对象并对它们进行一些处理。
目前,为了获取对象参数列表,我从堆栈中弹出所有方法参数,然后将它们一一推入,在其间添加我的检测调用。虽然这大部分都有效,但我看到了一些
java.lang.VerifyError, [1] (****) Incompatible argument to function
大型程序中的类型错误。弹出然后将对象推回堆栈是否会以某种方式改变其类型?或者,是否有更好的解决方案可以从堆栈中复制“N”个参数而不弹出?
【问题讨论】:
-
jvm 堆栈指令也是类型化的,即您不能推送 2 个浮点数并使用双精度数调用方法。一个错误是忘记
this参数。在每种情况下,您似乎要么调用了错误的方法签名,要么使用了错误的堆栈参数。 -
我确保原始类型被正确调用。我只看到对象的这个错误。当我有一个演员并且我弹出推动对象时会发生什么?还有其他我会错过的极端案例吗?
-
我只知道错误的函数调用、参数、对象、结果,要负责——正如错误消息所说。尝试使用原始类重新启动并应用补丁直到错误发生。
-
你能发布实际的字节码吗?没有它,没有什么可以做的。否则,我会同意 Joop Eggen 的建议。另外,您是在使用推理还是堆栈图验证?
-
您最初的前提听起来是错误的,因为方法参数是在局部变量中传递的,而不是在堆栈中,因此您一开始就无法弹出它们。因此,如果您尝试使用正确的术语解释您真正在做什么,或者发布实际代码更好。
标签: java bytecode java-bytecode-asm bytecode-manipulation