0

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

假设对于给定的指令(即AbstractInsnNode),我需要在上面的指令列表中找到变量的所有定义/赋值。为了更清楚地说明,假设在第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

对于简单的情况可以做。它很快就会变得复杂,取决于你想要达到的目标。 – 2011-04-18 07:58:15

+0

我假设我们在这里谈到成员变量?你想要的一般是不可能的。您可以收集当前方法中引用此变量的putfield指令。但是你也必须考虑被调用的方法,并以某种方式访问​​这个变量。由于重载,你必须在这里考虑来自编译时类型类以及任何重载类的所有成员。 – Ingo 2011-04-18 09:52:00

+0

是的,我只想要仅仅是成员变量的简单情况。如何收集当前方法中引用此变量的putfield指令。实际上,我目前的陈述可能有一个或多个变量,我怎么知道每个变量。 – dreamer13134 2011-04-18 15:06:55

回答

1

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

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

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

+0

非常感谢尤金。我正在使用分析包(tree.analysis)。但是,我的基本问题是,假设我有if(v.rank> 1 || numIter> 200)作为条件,这是与跳转语句对应的AbstractInsnNode,我如何确定正在接受/比较哪些变量这个条件(在这种情况下v。rank和numIter)。一旦我明白了,就像你刚才提到的那样,为这些变量索引寻找xSTORE是显而易见的。 – dreamer13134 2011-04-20 21:05:39

+0

对于给定的if()语句,字节码中会有多条指令。每个跳转指令都会在堆栈中有一个值,因此您首先需要解释该值并查看其来源(即值从一些变量加载或通过其他指令放置到堆栈,例如,方法调用或其他一些指令)。 – 2011-04-21 15:20:23

+0

感谢尤金。我设法弄清楚了。 – dreamer13134 2011-04-21 21:55:20