变量定义和赋值检测asm字节码

时间:2011-04-18 04:55:56

标签: java bytecode instrumentation bytecode-manipulation java-bytecode-asm

我正在尝试使用ASM字节码树API进行Java代码的静态分析。 我有一个ClassNode cn,MethodNode m和该方法中的指令列表说InsnList list。

假设对于给定的指令(即AbstractInsnNode),我需要在上面的指令列表中找到s处变量的所有定义/赋值。为了更清楚,假设在第2行定义并初始化变量var,然后在第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 个答案:

答案 0 :(得分:1)

SourceInterpreter计算SourceValue 对于MethodNode中相应指令的每个Frame。基本上它告诉哪些指令可以将值赋给给定的变量或堆栈槽。

有关ASM ASM User Guide包的详细信息,请参阅analysis

但是,如果您只需要检测是否已分配某个变量,那么您所要做的就是查找带有相应变量索引的xSTORE指令。