关键词:
静态分析
抽象解释
源程序
流敏感
抽象语法树
摘要:
在软件分析领域中,静态分析方法在编译器优化和软件质量保证方面的应用前景广阔。该方法可以尽可能早的发现软件制品中的错误和缺陷,降低软件开发过程中的资源消耗。基于流敏感的数据流分析对程序中所有的节点都进行了分析,但是有些节点是程序永远不可达的节点。对这类节点进行分析,既耗费了时间又会在无形之中提高误报率。如何实现一种检测程序中不可达节点的子系统,为基于流敏感的数据流分析提供精确的信息支持,是本文写作的切入点。 本文设计并实现了一种基于抽象解释的Java源程序分析子系统。该系统通过对Java源程序进行区间分析,发现程序中每个变量的取值范围。分析结束后,当某个变量的在某个节点处的取值范围为空的时候,该变量所在节点即为不可达的节点。该系统首先通过抽象语法树(hbstract Syntax Tree)技术对源程序进行解析,实现程序的结构抽象与语法识别;然后抽取影响程序流程的主要节点,构成程序的控制流图(Control Flow Graph);为了支持过程间分析,构建程序调用图(Call Graph);接下来基于控制流图构造数据流方程并对控制流图中的每种节点,定义转移函数;最后实现WorkList算法对数据流方程迭代求解。由于程序中存在循环结构,在迭代求解的过程中会存在分析程序不收敛或无法终止的问题。抽象解释是基于有序集合上的单调函数对程序的语义做近似逼近的理论。通过对程序分析技术的研究,本文采用抽象解释理论当中的加宽、收缩算子对程序中的循环问题进行处理。 最后,本文从以下方面对该子系统进行了评估:独立功能评估,评估系统发现不可达节点的能力;过程间功能评估,评估系统的过程间分析能力;性能对比评估,评估系统采用抽象解释理论中的加宽收缩算子对程序中循环问题解决的成效。实验结果表明,区间分析可以有效的发现程序中的不可达节点,加宽收缩算子的引入可以解决分析程序不收敛或无法终止的问题。