问题描述
|
我正在尝试使用ASM字节码树API进行Java代码的静态分析。
我有一个ClassNode cn,MethodNode m以及该方法中的指令列表,例如InsnList list。
假设对于给定的指令(即AbstractInsnNode),我需要在上述指令列表的s处找到变量的所有定义/赋值。为了更清楚一点,假设在第2行上定义并初始化了变量var,然后在第8行上分配了一些其他值,然后在第12行上使用。在这种情况下,第12行是my。同样,在它们之间的行中假设很多条件代码。
这可能与ASM有关吗?怎么样??
谢谢并恭祝安康,
J
为了清楚起见,
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)是否(以及在何处)被修改或分配为上述代码中的任意位置。保持简单,只是成员变量(无静态函数或委派其他类的函数)。
解决方法
SourceInterpreter计算SourceValues
在MethodNode中为相应指令的每个帧。基本上,它告诉哪些指令可以将值放置到给定的变量或堆栈插槽中。
另请参阅《 ASM用户指南》以获取有关ASM分析软件包的更多信息。
但是,如果只需要检测是否已分配某些变量,那么您要做的就是寻找带有相应变量索引的xSTORE指令。