определение и назначение переменных обнаруживают байт-код asm

Я пытаюсь использовать API дерева байт-кода ASM для статического анализа кода Java. У меня есть ClassNode cn, MethodNode m, и список инструкций в этом методе называется InsnList list.

Предположим, что для заданной инструкции (например, AbstractInsnNode) s мне нужно найти все определения/назначения переменной в s в приведенном выше списке инструкций. Чтобы было понятнее, предположим, что переменная var определена и инициализирована в строке 2, затем ей присвоено какое-то другое значение в строке номер 8, а затем она используется в строке номер 12. Строка номер 12 — это моя s в данном случае. Кроме того, предположим, что в строках между ними много условного кода.

Возможно ли это сделать с помощью ASM? Как??

Спасибо и С уважением, SJ

Для ясности,

public void funcToAnalyze(String k, SomeClass v) {
            int numIter = 0;

            /*
               Do cool stuff here.... modifies member variables and passed params too
            */

    if (v.rank > 1 || numIter>200) {
        magicFunction(k, 1);
    }
}

Здесь предположим, что условное выражение — это JumpInsnNode (текущая инструкция), и мне нужно выяснить, изменяются ли (и где) какие-либо переменные в условном выражении (в данном случае v.rank и numIter) или присваиваются ли они где-нибудь в приведенном выше коде. Будьте проще, просто переменные-члены (без статической функции или делегирования функции другого класса).


person dreamer13134    schedule 18.04.2011    source источник
comment
Для простых случаев можно. Это усложняется довольно быстро в зависимости от того, чего вы пытаетесь достичь.   -  person Peter Lawrey    schedule 18.04.2011
comment
Я предполагаю, что мы говорим о переменных-членах здесь? То, что вы хотите, вообще невозможно. Вы можете собрать инструкции putfield, которые ссылаются на эту переменную в текущем методе. Но вы также должны учитывать методы, которые вызываются и каким-то образом могут иметь доступ к этой переменной. Из-за перегрузки вы должны учитывать здесь все члены из класса типа времени компиляции, а также из любого переопределяющего класса.   -  person Ingo    schedule 18.04.2011
comment
Да, я просто хочу простой случай только переменных-членов. Как мне собрать инструкции putfield, которые ссылаются на эту переменную в текущем методе. На самом деле мой текущий оператор s может иметь одну или несколько переменных, откуда я знаю каждую из них.   -  person dreamer13134    schedule 18.04.2011
comment
Я могу только предложить вам изучить JVM, их инструкции и структуры данных, а также библиотеку, которую вы используете (ASM, BECEL и т. д.). Короткий ответ: инструкция putfield ссылается на элемент в пуле констант, который дает вам имя и класс поля. Должно быть нетрудно понять, как извлечь эту информацию из ASM, но мы не можем избавить вас от усилий хотя бы бегло просмотреть javadoc/manual.   -  person Ingo    schedule 20.04.2011


Ответы (1)


SourceInterpreter вычисляет SourceValue для каждого Frame для соответствующей инструкции в MethodNode. По сути, он сообщает, какие инструкции могут помещать значение в данную переменную или слот стека.

Также см. Руководство пользователя ASM для получения дополнительной информации о ASM анализ.

Однако, если вам просто нужно определить, была ли назначена определенная переменная, все, что вам нужно сделать, это найти инструкции xSTORE с соответствующими индексами переменных.

person Eugene Kuleshov    schedule 20.04.2011