基于多项式逼近的复杂路径约束求解研究
【摘要】:软件测试技术是保障软件质量和可靠性最重要的手段,测试用例的自动生成技术可以有效降低测试开销,提高测试效率,是近年来软件工程领域的热门研究问题。面向路径的测试覆盖被广泛运用于错误发现与缺陷定位,为路径生成有效测试用例对应于求解相应的路径约束。对于复杂的路径约束,对其求解过程的主要困难来自于非线性约束和浮点运算。基于启发式搜索和混合符号执行的方法是目前主流的求解非线性约束的技术。启发式搜索的求解能力严重依赖关键参数值的设定,不适当的参数设定会产生重复搜索而造成多次迭代。混合符号执行在用具体值替换符号值时在一定程度上局限了搜索空间,随机替换的盲目性常常导致丢失可行解。从根本上解决复杂路径约束的求解问题需要设计有效的求解器,理论上已经证明不存在单一算法对任意的约束系统都可以有效求解。因此,需要依据约束系统的特征设计有针对性的求解器。VerifyRealRoots运用符号数值混合计算来获取多项式型浮点约束系统的实数解,是一种可以有效求解高次多项式的工具,特别对于复杂等式组成的多项式系统求解效率极高。在数值计算程序和控制程序中,大量存在着包含多个等式的非线性路径约束系统。目前主流约束求解技术对这类非线性约束的求解能力非常有限,本文尝试采用多项式逼近来求解非线性复杂约束系统,提出了复杂函数约束系统到多项式约束系统的等价表示算法,对于无法等价转换的约束系统,设计了一个迭代框架,用多项式逐步逼进复杂约束系统,再借助于VerifyRealRoots进行求解,并代入到原系统进行验证。具体研究工作如下:1.提出多项式约束的等价表示方法,首先定义了初等函数到变量的基本映射规则,规则涵盖了常见的非线性初等函数。在此基础上,提出从带有复杂函数的约束系统到多项式约束系统的等价转换算法,该算法针对不同的函数关系和变量关系,采用不同的等价规则对复杂约束进行转换。转换得到的多项式约束系统的解就是原约束系统的解。这一方法,有效地提升了可处理的复杂路径约束的类型,即由一般的多项式系统拓展到带有复杂函数的多项式系统。2.提出了一个迭代框架,对于无法等价转换的复杂约束,通过不断地近似拟合构造多项式型约束系统进行逼近。以此为基础,提出了基于多项式逼近的面向路径测试数据自动生成方法。对于给定的路径约束,通过等价转换或者近似拟合方法构造对应的多项式型约束,求得解集后,根据变量之间的映射关系和变换规则逐层反解得到原约束的解集,并进行验证。如果无法求解或者所得数据不能覆盖原约束,会反复迭代,直到输出正确测试用例或者达到阈值。3.根据上述方法,设计并且实现了一个Eclipse插件工具SPF-PLV,能够自动地为Java程序生成测试数据。以标准基准测试程序集为基础,设计了有效性评估和对比实验。有效性评估表明此方法可以有效处理包含非线性运算和浮点运算的复杂约束。与强求解工具SPF-CORAL的对比实验表明,表明我们的方法对于等式型约束的求解能力更强。