论文部分内容阅读
程序切片是一种重要的程序分析理解方法,用于从源程序中抽取对程序中特定点上的特定变量有影响的语句和谓词,组成新的程序(称作切片),然后通过分析切片来分析源程序的行为。二十多年来,人们对它进行了广泛而深入的研究,取得了许多研究成果,使得它在软件调试、测试、维护、度量、程序变换、软件逆向工程与再工程等方面得到广泛应用,受到了广大软件研究和开发人员的高度重视。
论文主要工作包括:(1)将程序切片这类计算抽象成独立于具体语言的切片单子转换器,据此提出一种新型的形式化程序切片方法-模块单子切片,相应切片算法将具有较强的可重用性和程序语言适应性;(2)通过这种新型的形式化切片方法研究过程间程序和含指针程序的切片;(3)实现模块单子切片算法,开发相应的模块单子切片器。
论文工作的主要成果表现在以下几个方面:
·设计了一种切片单子转换器SliceT。我们将程序切片这类计算抽象成独立于具体语言的实体:切片单子转换器,以此来统一描述切片计算。SliceT不仅提供了一种抽象化表示程序切片的能力,而且还允许人们访问其低层语义的细节部分。切片单子转换器可与其它(表示某种程序特性)的单子转换器或单子组合,并通过提升函数lift与这些不同程序特性进行交互,从而可计算具有不同特性的程序切片。
·提出了模块单子切片概念,并给出了一种高精度的动态切片方法——模块单子动态切片。它是一种随着程序的执行同时计算动态切片的正向切片方法,无需记录程序执行历史,从而将追踪的信息量减少到最低。我们还证明了该单子切片算法所得结果是精确的,即算法可捕获对应PDG中可达信息,且算法结果中不含多余的依赖信息。该算法的平均每个变量单子切片的时间复杂度是线性的,空间复杂度与程序执行的长度无关。
·此基础上提出了模块单子静态切片算法。它可直接在抽象语法结构上计算切片,无需显示地构造诸如PDG的中间结构。此外,切片单子转换器的模块化抽象机制使得单子切片算法具有很强的可扩展性和重用性。
·为求过程间程序切片,提出了基于回填待定标号的两阶段单子切片算法。该算法可求按值、结果、值-结果调用的过程间程序切片,且可避免上下文调用问题。与基于SDG两阶段扫描算法相比,因其无需构造PDG和SDG,故可避免由于程序复杂、SDG过于庞大而难以理解、实现时内存空间紧张等问题。
·通过将指向分析融入到已有的模块单子切片,提出了一种改进的单子切片方法以处理含指针的程序。不同于将指向分析与切片计算分开的传统切片方法,改进的单子切片方法将程序正向切片思想与数据流迭代分析相结合,可同时进行切片计算和指向分析,从而保证了较高的精度,而且比一般的数据流迭代方法节省空间。此外,它还继承了原有单子切片方法所具有的强重用性和程序语言适应性的优点。
·开发了一个程序切片器原型系统,实现了我们的模块单子切片技术。我们所开发的切片系统MPS基于模块单子语义,结合共代数和类属概念,支持增量式开发,其实现语言为Haskell。