论文部分内容阅读
Java语言是当今最流行的语言之一,其具有的“一次编写,多处运行”的特性,使Java被广泛应用于各类应用的开发中。单元测试是Java开发中主要的测试手段,但随着程序数量日益增多以及程序复杂性日益提高,该技术面临测试效率低、测试速率慢、不适应黑盒测试等挑战。新兴的智能模糊测试技术在克服盲目性缺陷后,测试效能大幅提高,受到了越来越多的重视。当前,面向Java程序的智能模糊测试研究还不多,现有工具存在着与Java程序适配性不佳、测试效率低、执行开销大等问题,研究面向Java程序的智能模糊测试关键技术,可以提高对Java程序的测试效率,进一步丰富Java程序的测试途径,对于提高Java程序质量,保护网络应用安全有着积极的意义。本文围绕提高面向Java程序的测试输入构造能力、测试效率、执行速率等迫切需求,开展面向Java程序的模糊测试关键技术研究,解决了面向模糊测试的测试类自动生成、基于Java语言特性的高效模糊测试以及合理调度待测方法等问题,主要工作和贡献总结如下:
(1)提出了一种基于依赖性分析的自动测试类构建方法。针对现有工具需要人为提供测试类而造成的测试效率低、应用受限等问题,提出了基于依赖性分析的测试类自动生成方法。该方法首先通过静态分析技术分析字段和方法间的依赖性关系,获取待测方法使用字段以及字段修改所需的方法集合,并据此生成测试所需的方法序列;接着根据类的不同定义源,建立用于生成类实例的知识库,使用不同方法构建类实例;最后,以方法接口参数为指导,构建文件操作语句、变量声明语句以及方法调用语句等,并将其组合成可用的测试类。基于该方法实现了由5000行代码构成的开源工具JDriver,通过对实际软件库进行测试,验证了该方法的有效性,提高了Java程序的测试效率。目前尚未看到其他自动类构建的相关文献。
(2)提出了一种基于条件语句污点追踪的模糊测试方法。针对现有面向Java程序的模糊测试工具存在适配面窄、生成输入盲目低效等问题,提出了基于条件语句污点追踪的模糊测试方法。该方法从分析Java语言特性入手,对测试输入进行了形式化定义。采取基于变异的模糊测试的技术途径,并以分支为目标,通过基于条件语句的污点追踪技术来获取影响分支变量,根据测试状态动态选择不同变异策略,采取不同变异操作来生成新的输入,利用Java反射机制高效执行产生的新输入。该方法能够较好地克服盲目性影响,对待测程序的适应性好,具有较高的路径覆盖率和执行速率。与Kelinci进行对比,本方法在测试中表现出更好的性能,实测执行速率达到了Kelinci的1.70~2.68倍。
(3)提出了一种混合式待测方法调度算法。针对待测程序中方法数量大,逐一测试会造成时间开销大、重复进行无用测试等问题,提出基于启发式和动态反馈相结合的混合式待测方法调度算法。该算法针对不能直接进行模糊测试的私有方法和受保护方法,在分析方法调用图的基础上构造驱动方法;根据本文选定的测试准则,基于特征启发式过滤不会产生错误的非必要测试方法;结合静态信息定义优先级指标并对待测方法进行排序,根据路径覆盖情况进行周期性更新,实现动态调度。该方法能够有效过滤非必要测试的方法,提高测试效率,减少重复测试相同代码。
(4)设计实现了智能模糊测试平台CuteFuzzer。
针对现有模糊测试工具存在输入构造能力有限、应用范围窄、测试效率低等不足,设计实现了全新的智能模糊测试平台CuteFuzzer。该平台集成了基于条件语句污点追踪的模糊测试方法和混合式待测方法调度算法,可以对目标软件提供静态分析、单个方法测试以及整体测试,能够满足大部分Java程序的测试需求。CuteFuzzer的核心代码超过9000行,目前尚未发现与之类似的的模糊测试工具。
(1)提出了一种基于依赖性分析的自动测试类构建方法。针对现有工具需要人为提供测试类而造成的测试效率低、应用受限等问题,提出了基于依赖性分析的测试类自动生成方法。该方法首先通过静态分析技术分析字段和方法间的依赖性关系,获取待测方法使用字段以及字段修改所需的方法集合,并据此生成测试所需的方法序列;接着根据类的不同定义源,建立用于生成类实例的知识库,使用不同方法构建类实例;最后,以方法接口参数为指导,构建文件操作语句、变量声明语句以及方法调用语句等,并将其组合成可用的测试类。基于该方法实现了由5000行代码构成的开源工具JDriver,通过对实际软件库进行测试,验证了该方法的有效性,提高了Java程序的测试效率。目前尚未看到其他自动类构建的相关文献。
(2)提出了一种基于条件语句污点追踪的模糊测试方法。针对现有面向Java程序的模糊测试工具存在适配面窄、生成输入盲目低效等问题,提出了基于条件语句污点追踪的模糊测试方法。该方法从分析Java语言特性入手,对测试输入进行了形式化定义。采取基于变异的模糊测试的技术途径,并以分支为目标,通过基于条件语句的污点追踪技术来获取影响分支变量,根据测试状态动态选择不同变异策略,采取不同变异操作来生成新的输入,利用Java反射机制高效执行产生的新输入。该方法能够较好地克服盲目性影响,对待测程序的适应性好,具有较高的路径覆盖率和执行速率。与Kelinci进行对比,本方法在测试中表现出更好的性能,实测执行速率达到了Kelinci的1.70~2.68倍。
(3)提出了一种混合式待测方法调度算法。针对待测程序中方法数量大,逐一测试会造成时间开销大、重复进行无用测试等问题,提出基于启发式和动态反馈相结合的混合式待测方法调度算法。该算法针对不能直接进行模糊测试的私有方法和受保护方法,在分析方法调用图的基础上构造驱动方法;根据本文选定的测试准则,基于特征启发式过滤不会产生错误的非必要测试方法;结合静态信息定义优先级指标并对待测方法进行排序,根据路径覆盖情况进行周期性更新,实现动态调度。该方法能够有效过滤非必要测试的方法,提高测试效率,减少重复测试相同代码。
(4)设计实现了智能模糊测试平台CuteFuzzer。
针对现有模糊测试工具存在输入构造能力有限、应用范围窄、测试效率低等不足,设计实现了全新的智能模糊测试平台CuteFuzzer。该平台集成了基于条件语句污点追踪的模糊测试方法和混合式待测方法调度算法,可以对目标软件提供静态分析、单个方法测试以及整体测试,能够满足大部分Java程序的测试需求。CuteFuzzer的核心代码超过9000行,目前尚未发现与之类似的的模糊测试工具。