Почему в методе smali передается еще один параметр - PullRequest
1 голос
/ 15 февраля 2020

В фрагменте кода smali, который я декодировал через apktool, я обнаружил, что вызов метода передает на один аргумент больше, чем они объявлены в определении метода. Этот дополнительный аргумент определенно не используется вообще. Но если я удалю его, при запуске произойдет ошибка, в которой говорится «ожидается два, найдено три» из «верификатора». Что здесь происходит?

# method definition
.method public setLatitude(D)V
    .locals 1
    #(snipped)
.end method

# method call
# v3 is not defined actually
invoke-virtual {v1, v2, v3}, LFoo;->setLongitude(D)V

1 Ответ

1 голос
/ 15 февраля 2020

Все нестатические c методы принимают объект, к которому вызывается метод, в качестве первого параметра.

В вашем примере метод принимает аргумент типа D, который имеет широкий тип это занимает 2 регистра. В этом случае v1 является LFoo; экземпляр, в котором вызывается метод, а [v2, v3] - это пара регистров, которая содержит аргумент метода шириной 64 бита.

Когда вы говорите, что «v3 не определен на самом деле», он будет неявно установлен при v2, потому что все широкие значения хранятся с использованием последовательных пар регистров.

...