Post

NJU静态分析 - Lab5 - 非上下文敏感指针分析

NJU静态分析 - Lab5 - 非上下文敏感指针分析

分析

在本次实验中,我们要实现非上下文敏感指针分析,具体来说要实现五个API,分别为:addReachableaddPFGEdgeanalysispropagateprocessCall。这五个函数的实现在PPT中均有伪代码,PPT中出现过的部分边不多加赘述。需要分析的是新增的三个类型:静态字段、数组索引和静态方法

静态字段

静态字段的规则很简单,由于一个静态字段T.f是唯一的,因此可以简单的当作变量来处理,因此对静态字段的处理化为对Copy的处理

数组索引

由于在当前的分析中,我们不区分不同数组索引的load和store,因此一个数组对象可以等价为一个变量,对数组对象运用变量的分析规则即可

静态方法

静态方法由于没有receiver object,因此处理简单许多,因此在dispatch时不需要receiver object的信息,也不需要更新this变量的指针集

StmtProcessor

在Solver中有一个内部类StmtProcessor,他的存在为addReachable函数的实现提供了极大的便利。具体来说,Stmt的每一个子类都实现了accept(StmtVisitor)方法,可以传入一个visitor去对该Stmt对象进行操作。由于多态的存在,我们只需要对StmtProcessor中特定Stmt子类的的visitor进行重写,通过Double Dispatch,在运行时动态确定具体的visitor类型。从而实现一个accept函数即可处理所有的Stmt子类,非常的方便,也易于维护和拓展。因此在addReachable函数中,你只需要:

1
2
3
for (Stmt stmt : method.getIR().getStmts()) {
    stmt.accept(stmtProcessor);
}

即可对所有的Stmt进行分析

踩过的坑

  • addPFGEdge函数中,不要忘了判断source的指针集是否为空
  • propagate函数中,求完diff之后不要忘了判断diff是否为空,这里把PPT中生成diff的操作从solve移动到了propagate函数中,容易出错
  • 有些callSite是没有变量接收返回值的,此时就不需要处理这种情况
  • StaticCall和InstanceCall可以合并,代码更简洁
  • 新的Obj是从heapModel中获取的
This post is licensed under CC BY 4.0 by the author.