为什么这个字节码不会验证

时间:2011-04-29 06:40:17

标签: java debugging bytecode verify

编辑:解决方案是我使用aastore,当我应该使用iastore时,因为我想将项目存储在 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

然而,它无法验证,给出方法:signature :()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 verifier运行时,它没有给我任何有用的消息(甚至无法验证javac生成的类)。

这可能会发生什么?有什么问题?

2 个答案:

答案 0 :(得分:1)

也许我很困惑,但你做了

1
jsr 23

...

23: iload_2
2

但在23岁之后,我认为筹码中有3个

A0
<return address>
I2

答案 1 :(得分:1)

我没有看到问题所在,但是当我陷入字节码调试时,这就是我所做的事情:

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