gpt4 book ai didi

java - 为什么这个字节码无法验证

转载 作者:行者123 更新时间:2023-11-30 05:03:41 25 4
gpt4 key购买 nike

编辑:解决方案是我应该使用iastore时使用aastore,因为我想将一个项目存储在ints数组中,而aastore仅适用于< em>对象。

我有以下方法作为字节码中的构造函数生成

aload_0
invokespecial java/lang/Object/<init>()V
aload_0
new java/lang/StringBuilder
dup
invokespecial java/lang/StringBuilder/<init>()V
putfield com/js/interpreter/custom_types/1e9ebd0/s Ljava/lang/StringBuilder;
aload_0
iconst_0
putfield com/js/interpreter/custom_types/1e9ebd0/l I
aload_0
iconst_0
multianewarray [I 1
astore_1
iconst_0
istore_2
goto 23
18:aload_1
iload_2
iconst_0
aastore
iinc 2 1
23:iload_2
iconst_0
if_icmplt 18
aload_1
putfield com/js/interpreter/custom_types/1e9ebd0/a [I
return

但是,它无法验证,给出方法:签名:()V)期望在堆栈上找到对象/数组

但是,我可以随时查看并准确地知道堆栈上的项目数量:

    aload_0
1
invokespecial java/lang/Object/<init>()V
0
aload_0
1
new java/lang/StringBuilder
2
dup
3
invokespecial java/lang/StringBuilder/<init>()V
2
putfield com/js/interpreter/custom_types/1e9ebd0/s Ljava/lang/StringBuilder;
0
aload_0
1
iconst_0
2
putfield com/js/interpreter/custom_types/1e9ebd0/l I
0
aload_0
1
iconst_0
2
multianewarray [I 1
2
astore_1
1
iconst_0
2
istore_2
1
goto 23
18:aload_1
2
iload_2
3
iconst_0
4
aastore
1
iinc 2 1
1
23:iload_2
2
iconst_0
3
if_icmplt 18
1
aload_1
2
putfield com/js/interpreter/custom_types/1e9ebd0/a [I
0
return

当我通过 Justice validator 运行它时,它没有给我任何有用的消息(甚至无法验证 javac 生成的类)。

这里可能发生了什么?有什么问题吗?

最佳答案

我没有看到问题所在,但是当我陷入字节码调试 hell 时,我会这样做:

  • 省略不必要的代码。目前看来循环是一个nop(你永远不会进入主体循环,因为你用零初始化局部变量2,对吧?)。因此,我只需将循环体设为空,然后看看验证错误是否仍然存在。
  • 然后,我将开始删除其他部分(各个字段的初始化),直到错误消失。

关于java - 为什么这个字节码无法验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5828778/

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