【发布时间】:2011-04-18 04:55:55
【问题描述】:
我正在尝试使用 ASM 字节码树 API 对 Java 代码进行静态分析。 我有一个 ClassNode cn、MethodNode m 和该方法中的指令列表说 InsnList 列表。
假设对于给定的指令(即 AbstractInsnNode)s,我需要在上述指令列表中找到 s 处变量的所有定义/赋值。为了更清楚起见,假设在第 2 行定义并初始化了一个变量 var,然后在第 8 行分配了一些其他值,然后在第 12 行使用。在这种情况下,第 12 行是 my 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)在上面的任何地方被修改或分配代码。保持简单,只是成员变量(没有静态函数或委托给另一个类的函数)。
【问题讨论】:
-
对于简单的情况可以这样做。根据您要实现的目标,它会很快变得复杂。
-
我假设我们在这里谈论成员变量?你想要的通常是不可能的。您可以收集当前方法中引用此变量的 putfield 指令。但是您还必须考虑被调用的方法,并且可能以某种方式访问此变量。由于重载,您必须在此处考虑编译时类型类以及任何覆盖类的所有成员。
-
是的,我只想要成员变量的简单情况。如何收集当前方法中引用此变量的 putfield 指令。实际上,我当前的语句可能有一个或多个变量,我如何知道每个变量。
-
我只能建议你研究一下 JVM,它们的指令和数据结构以及你正在使用的库(ASM;BECEL 等)。简短的回答是,putfield 指令引用了常量池中的一个项目,该项目为您提供了字段的名称和类。应该不难弄清楚如何从 ASM 中提取这些信息,但我们不能让您至少简要地看一下 javadoc/manual。
标签: java bytecode instrumentation bytecode-manipulation java-bytecode-asm