определение и присваивание переменной определяет байт-код asm - PullRequest
0 голосов
/ 18 апреля 2011

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

Предположим, для данной инструкции (т.е. 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) модифицируется или присваивается в любом месте приведенного выше кода.Проще говоря, просто переменные-члены (без статической функции или делегирования функции другого класса).

1 Ответ

1 голос
/ 21 апреля 2011

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

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

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

...