南大软分实验笔记|A6 上下文敏感的指针分析

💡 原文中文,约17600字,阅读约需42分钟。
📝

内容提要

本文介绍了南大软件分析课程的第六个实验,讨论了上下文敏感的过程间指针分析。实验包含两部分,实现了上下文敏感指针分析的主要逻辑,并实现了三种不同的上下文敏感策略。文章还提供了新增的分析规则和实现代码,并总结了实验的思考和总结。

🔎

延伸解读

上下文敏感策略的实现差异

文章指出,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实例。

🏷️

标签

➡️

继续阅读