设计数据流分析包含4步
1. 决定分析的本质。是向前还是向后?是否需要对分支特殊考虑?
2. 决定近似的目标。是may还是must? 具体来说是在merge时找交集还是并集。
3. 展现具体的flow。即对IR中的每条statement列等式(transfer function)
4. 决定初始状态或者入口(如果是向后分析则是出口)和中间节点的近似。即空集或者满集,依赖于分析的conservative。
做数据流分析我们需要某种结构来表现数据流是如何穿程序的肠而过的,如控制流图。Soot的数据流框架能处理各种形式的cfg,通过实现接口soot.toolkits.graph.DirectedGrap。
下面用very-busy expr analysis作为例子。
1 分析本质
Soot提供三种分析的实现: ForwardFlowAnalysis, BackwardFlowAnalysis 以及ForwardBranchedFlowAnalysis。前两者除了flow流向外基本相同,结果为两张映射: 从节点到IN 集合和从节点到OUT集合。最后一个提供了通过不同branch node传递不同信息(比如信息流从带有if (x > 0)的节点流出时可以是x>0或者x<=0),因此包含3种maps: 从结点到IN集合, 从节点到OUT集合以及从节点到branch OUT集合。所有以上通过worklist算法来解fix-point的机制来实现。如果想用别的算法来实现可以继承以下三个superclass中的一个: AbstractFlowAnalysis, FlowAnalysis, 或者BranchedFlowAnalysis。
对于very-busy expr analysis, 需要向后分析,因此class定义为
class Very Busy Expression Analys