【问题标题】:jasmin hacking and verify error茉莉花黑客和验证错误
【发布时间】:2013-01-05 13:46:26
【问题描述】:

我正在玩 jasmin,我尝试启动我的 .class 文件,该文件应该执行简单的字符串连接。我的 jasmin 源码如下所示:

.class public default_class
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit locals 1
.limit stack 1
invokestatic main_65428301()I
return
.end method
.method public static main_65428301()I
.limit locals 1
.limit stack 100
new java/lang/String
dup
ldc "foo"
invokestatic java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;
invokespecial java/lang/StringBuilder(Ljava/lang/String;)V
ldc "bar"
invokevirtual java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java/lang/String.toString()V
astore_0
iconst_0
ireturn
.end method

现在我可以运行 java -jar jasmin.jar 并获得 default_class.class。但是,当我尝试像 java default_class 一样启动它时,出现错误:

Exception in thread "main" java.lang.VerifyError: (class: default_class, method: main_65428301 signature: ()I) Illegal use of nonvirtual function call

我应该在我的程序集中进行哪些更改才能使其正常工作?

【问题讨论】:

    标签: java verifyerror jasmin


    【解决方案1】:

    在 JVM 中,要创建对象,您必须首先使用 new 指令,然后调用 <init> 方法(构造函数)。你没有创建newStringBuilder 并调用了错误的构造函数名称(应该是java/lang/StringBuilder/<init>(Ljava/lang/String;)V)。

    我也认为没有理由这样做:

    new java/lang/String
    dup
    

    invokestatic java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;
    

    【讨论】:

    • 我试图模仿 eclipse 在类似情况下所做的事情,但感谢您指出这一点。无论如何,我想知道调用我的第二个类似 main 的方法有什么问题,因为这就是错误消息的建议
    • @k_wisniewski,在我看来它指的是invokespecial java/lang/StringBuilder(Ljava/lang/String;)V,它在(class: default_class, method: main_65428301 signature: ()I)里面
    • 好的,我现在解决了这个问题
    【解决方案2】:

    “新指令并没有完全创建一个新实例;直到在未初始化的实例上调用了实例初始化方法后,实例初始化才完成。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-28
      • 2017-01-15
      • 2014-12-12
      • 2021-05-25
      • 1970-01-01
      • 2016-08-03
      • 2015-07-26
      • 1970-01-01
      相关资源
      最近更新 更多