NJU静态分析 - Lab5 - 非上下文敏感指针分析
NJU静态分析 - Lab5 - 非上下文敏感指针分析
分析
在本次实验中,我们要实现非上下文敏感指针分析,具体来说要实现五个API,分别为:addReachable
、addPFGEdge
、analysis
、propagate
和processCall
。这五个函数的实现在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.