gpt4 book ai didi

java - 解决 JVM "Incompatible object argument for function call"错误(javassist 检测)

转载 作者:行者123 更新时间:2023-11-29 03:35:37 24 4
gpt4 key购买 nike

我让 JVM (1.6.0b33) 在我的一个类上抛出 java.lang.VerifyError(函数调用的对象参数不兼容)。该类使用 javassist(使用 CtMethod.make())进行检测(仅此一种方法)

有没有办法让我找到哪个方法调用触发了错误?我浏览了 javap -c -s -l 的输出,但我没有发现任何调用指令有任何问题。

例如,如果有人知道如何要求 JVM 提供有关检测到此错误的位置的更多详细信息(代码地址会很好)就足够了,所以我知道应该关注哪里。如果有人想以这种方式进行破解,我可以发布 javap 的输出...

最佳答案

在检查 JVM 源代码后弄明白了。

错误(Incompatible object argument for function call)意味着执行调用的对象与预期的(通过方法签名)类型不匹配(我假设它有一些事情要做使用对象参数,但在这种情况下你会得到一个稍微不同的错误)。

显然,当您将对象分配给另一个类的对象时,javassist 不会插入正确的指令(或者它可能会导致语句失败)。

Javassist 会将以下代码视为有效:

Object x ...;
String s = x; // javac requires cast here, javassist doesn't
s.isEmpty();

通常编译成:

1 aload_1 // push x on stack
2 checkcast java/lang/String // check we can fit x into s
3 astore 2 // s = x;
4 aload 2 // 'this' for isEmpty()
5 invokevirtual String.isEmpty() // stack top used as 'this'

javassist(至少是我的版本)只是没有添加checkcast指令,并且VM无法保证当时invokevirtual被称为堆栈top 包含 String,这是必需的,因为 invokvirtual 正在调用 String 类的方法。

补救措施是:

  • 在作业中使用显式转换
  • 修复javassist
  • 使用显式类型的局部变量

关于java - 解决 JVM "Incompatible object argument for function call"错误(javassist 检测),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15714184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com