【问题标题】:variable definition and assignment detect asm bytecode变量定义和赋值检测asm字节码
【发布时间】: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


【解决方案1】:

SourceInterpreter 计算 SourceValues 对于每个Frame,在 MethodNode 中对应一条指令。基本上它会告诉哪些指令可以为给定的变量或堆栈槽赋值。

有关 ASM analysis 包的更多信息,另请参阅 ASM User Guide

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多