论文部分内容阅读
在编译器测试中,基于部分求值技术的编译器测试方法将用于编译器优化和程序例化的部分求值技术应用到编译器测试中,是一种比较新颖、有效的方法,但是这一方法对源程序用于部分求值的一组静态输入及其取值都是由人工手动指定的,这种依赖人工手动指定的策略无法使测试过程自动化进行,而且具有一定的盲目性。本文为了解决基于部分求值的编译器测试技术中静态输入需要人工手动指定的低效和盲目性,提出了一种源程序静态输入的确定方法和静态输入值的确定方法,重点是要解决两个问题:第一,如何量化变量的重要性,为了解决这个问题,定义了变量的依赖度属性;第二,如何自动化地计算变量的依赖度,为此采用了数据流分析手段,先将源程序抽象为一个控制流图,待研究的顺序和分支语句构成图的节点。对源程序的分析主要集中在这些节点上,弱化了图的边。在该定义中,每个变量的定义集合是在该变量的所有赋值语句中,右部表达式中其他变量的集合,即每个变量的值依赖于它定义集合中的变量,定义集合主要用于后续的数据流方程计算,控制流图的引用集合表示在一个节点语句中出现的所有变量的集合,本文方法的核心思想便是对引用集合中的每个变量,用它的依赖集合来替换它,直至收敛。计算完变量的依赖度后,对于已经收敛的控制流图,将其中所有留存的变量作为该程序静态输入的候选集合,并提出静态输入的确定规则。在确定完静态输入之后,本文考虑了容易引发bug的一些分支结构语句,基于这些语句中的条件运算表达式来计算出静态输入的取值范围,并最终为每个静态输入确定一个具体的值。本文分别在源程序的抽象语法树级别和中间表达式级别对提出的方法进行了实现。在抽象语法树级别,先将源程序转化成抽象语法树,控制流图中的节点在这里对应着具体的语句类型节点,这些节点中包含着表达式以及变量节点的信息,通过对语法树进行遍历,可以计算出变量的定义集合、语句节点的引用集合,然后应用上文中的算法进行迭代,得到候选集合以及每个候选变量的依赖度,然后分别应用静态输入的确定方法和取值策略,选出该程序的静态输入。本文基于方法实现改进了编译器测试框架,使之可以自动化进行,对比前人的那种,需要手工指定静态输入的测试方法,测试效率得到了极大的提高。为了验证本文方法的有效性,本文做了两部分实验:向待测试的编译器人工植入了错误以及收集一些现有的触发编译器bug的测试用例,用该测试框架进行测试,均可触发相应的bug。