【问题标题】:Dalvik Verifier: copy1 v16<-v22 type=2 cat=1Dalvik 验证器:copy1 v16<-v22 type=2 cat=1
【发布时间】:2019-03-07 15:58:07
【问题描述】:

Dalvik 不接受以下 smali 代码:

.method getOrCompute(Ljava/lang/Object;ILcom/google/inject/internal/guava/base/$Function;)Ljava/lang/Object;
    .registers 24
    .param p2, "hash"    # I
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(TK;I",
            "Lcom/google/inject/internal/guava/base/$Function",
            "<-TK;+TV;>;)TV;"
        }
    .end annotation

    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/util/concurrent/ExecutionException;
        }
    .end annotation

    #@0
    .prologue
    .line 12
    :cond_0
    :try_start_0
    move-object/16 v17, p3

    #@3
    move/16 v16, p2

验证器错误:

dalvikvm: VFY: copy1 v16<-v22 type=2 cat=1
dalvikvm: VFY:  rejecting opcode 0x03 at 0x0003
dalvikvm: VFY:  rejected Lcom/google/inject/internal/guava/collect/$ComputingConcurrentHashMap$ComputingSegment;.getOrCompute (Ljava/lang/Object;ILcom/google/inject/internal/guava/base/$Function;)Ljava/lang/Object;
dalvikvm: Verifier rejected class Lcom/google/inject/internal/guava/collect/$ComputingConcurrentHashMap$ComputingSegment;

我真的不明白这个问题。 v16 和 v22 (p2) 是 16 位寄存器。所以一切都应该很好。

【问题讨论】:

  • 回复:您对我现在已删除的答案的评论 - 是的,您是对的。我算错了参数。正如您所提到的,p2 在方法的开头包含一个整数。

标签: android dalvik smali


【解决方案1】:

从错误信息来看,此时 p2 的类型为“2”,即kRegTypeConflict。冲突类型意味着有多个代码路径合并在一起,并且每个代码路径在该寄存器中都有一个不兼容的传入类型。

如果你查看方法的开头,你会看到一个“:cond_0”标签,这意味着方法中的其他地方有一些条件可以跳转到那里。在那个条件下 p2 的值不是整数,所以我们有 1 个代码路径(从方法的开头),其中 p2 是一个整数,还有另一个代码路径(来自条件跳转),它是其他东西,所以验证者将寄存器标记为冲突。

无法读取具有冲突类型的寄存器。此时基本上可以将其视为未初始化的寄存器。

如果您想查看有关在这种情况下如何合并寄存器类型的更多信息,您可以使用带有 FULLMERGE 标志的 baskmali 的 --register-info 选项。 --register-info=ARGS,DEST,FULLMERGE。或者,如果您想查看每条指令之前和之后的每个寄存器,可以使用--register-info="ALL,FULLMERGE"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2023-03-28
    • 2020-06-02
    • 2012-04-28
    相关资源
    最近更新 更多