南大软分实验笔记|A6 上下文敏感的指针分析
内容提要
本文介绍了南大软件分析课程的第六个实验,讨论了上下文敏感的过程间指针分析。实验包含两部分,实现了上下文敏感指针分析的主要逻辑,并实现了三种不同的上下文敏感策略。文章还提供了新增的分析规则和实现代码,并总结了实验的思考和总结。
延伸解读
上下文敏感策略的实现差异
文章指出,call-site sensitivity、object sensitivity和type sensitivity在实现上的关键区别在于selectContext方法所依赖的参数不同。例如,object sensitivity和type sensitivity需要根据接收者对象或类型来选择上下文,而call-site sensitivity则基于调用点。作者在调试过程中发现,错误地使用调用点上下文会导致结果不正确,这提醒读者需仔细理解算法中Select函数的语义。
常见实现陷阱与调试经验
作者在实现object sensitivity和type sensitivity时曾遇到困难,尤其是k=1的情况。错误包括在selectContext中误用callSite.getContext()而非recv.getContext(),以及混淆getContainerType()与getAllocation().getClass()。通过打印输出和断点调试,作者最终定位并修正了问题。这些经验表明,理解每个方法调用的上下文来源至关重要,不能想当然地套用其他策略的代码。
实验扩展与规则新增
本实验在A5的基础上新增了对静态字段、数组索引和静态方法调用的支持。分析规则表中补充了Static Store、Static Load、Array Store、Array Load等规则,并给出了相应的PFG边。实现时需要在StmtProcessor中处理这些语句,例如对静态字段的存取直接使用StaticField作为指针,对数组则使用ArrayIndex。这些扩展使得指针分析能覆盖更复杂的Java程序结构。
Q&A
上下文敏感的过程间指针分析的主要逻辑是什么?
主要逻辑包括语句处理、指针流图的添加和分析,需为每个可达方法创建独立的StmtProcessor实例。
实验中实现了哪些上下文敏感策略?
实现了call-site sensitivity、object sensitivity和type sensitivity三种上下文敏感策略。
新增的分析规则包括哪些内容?
新增规则包括对静态字段、数组索引和静态方法调用的支持。
在实现过程中遇到了哪些挑战?
在实现object sensitivity和type sensitivity时遇到了一些问题,经过调试后解决了k=1的实现问题。
实验总结中强调了什么重要性?
总结部分强调了实践的重要性,指出理论学习与实际操作之间的差距。
如何为每个可达方法创建StmtProcessor实例?
在addReachable方法中,通过传入上下文信息为每个可达方法创建独立的StmtProcessor实例。