论文部分内容阅读
指针分析是许多程序分析工作的基础,它从源程序中抽取各指针变量的指向信息、各表达式间的别名信息,以及其它指针相关的信息,从而使后继分析能够准确地识别各程序点上访问的存储空间,判定它们的运行时类型,并进行指针信息相关的推导。多年来,人们对指针分析技术进行了广泛而深入的研究,取得了许多研究成果,使得它在程序编译、程序变换、软件维护、软件逆向工程与再工程等领域得到广泛应用,受到了广大软件研究人员的高度重视。
尽管如此,随着面向对象语言的不断动态化,以及程序规模的不断扩大,指针分析方法在走向应用的过程中依然存在许多困难,如何保证分析精度和分析性能仍是十分值得研究的问题。为了进一步提高指针分析的实用性,本文围绕程序数据流提取这一应用点,对Java程序指针分析中的若干关键技术进行了深入研究。文章首先针对语句层的数据流提取问题,提出了点间确定别名的概念,并给出了一组利用点间确定别名优化依赖分析精度的方法;然后针对模块层的数据流提取,提出了一种基于贡献度的调用栈抽象模型,并通过其实例——线程敏感的指针分析和关注点敏感的指针分析——展示了它在优化数据流分析效率方面的效果。最后,论文还讨论了一些与指针分系统实现有关的问题。
具体的,论文工作的主要成果表现在以下几个方面:
()提出了点间确定别名的概念。这些别名能够描述不同程序点上访问路径之间的关系,相比于现有别名,具有更强的表达能力。根据点间确定别名的概念,给出了两种不同的计算点间确定别名的方法,它们分别基于数据流迭代和值编号技术,具有不同的技术特点,为点间确定别名的后继应用奠定了基础。
()给出了多种利用点问确定别名提高数据流分析精度的方法。利用点间确定别名首先可以识别强更新和相对更新,此外它们还能够用于优化程序的副作用分析,识别不可实现的访问路径组合和无效的过程间数据流,从而最终优化依赖图的构建。
()提出了一种基于贡献度的调用栈抽象模型,它结合一个调用信息对分析精度的贡献程度,来决定其是否需要出现在最终的调用上下文中。以该模型为基础,指针分析方法可以利用有限长度的调用上下文,最大程度地提高分析精度,这将使分析具有更佳的性价比。
()以基于贡献度的调用栈抽象为基础,提出了一种线程敏感的指针分析方法和一种关注点敏感的指针分析方法。这两种方法都是面向应用的,且具有粗粒度的上下文敏感性。与已有的其它基于调用串的指针分析方法相比,前者对于线程间数据流的提取具有更好的精度-性能比,而后者充分考虑了面向方面程序的结构特点,可以相当程度地提高方面间数据流识别的效能。结合关注点敏感的指针分析,本文还给出了一种高效的有害通知识别方法。