我正在尝试使用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)中的任何变量是否被修改或分配在上面的任何地方码。保持简单,只是成员变量(没有静态函数或委托给另一个类的函数)。
答案 0 :(得分:1)
SourceInterpreter计算SourceValue 对于MethodNode中相应指令的每个Frame。基本上它告诉哪些指令可以将值赋给给定的变量或堆栈槽。
有关ASM ASM User Guide包的详细信息,请参阅analysis。
但是,如果您只需要检测是否已分配某个变量,那么您所要做的就是查找带有相应变量索引的xSTORE指令。