论文部分内容阅读
随着软件产业化的发展,人们对软件的质量、成本和进度提出了越来越高的要求,软件测试逐渐成为了软件开发过程中不可或缺的重要环节,其中的软件静态测试由于无需执行程序且覆盖率高,而成为构建可信软件的主要手段。静态测试的结果不可能做到既是可靠的又是完备的,这样便会导致误报或漏报的产生。程序静态分析的精度是减少软件静态测试中漏报和误报的重要因素,而精确的静态分析又会导致分析效率的下降,如何将两者进行合理的折中计算是影响静态分析可行性的关键,也是国内外该领域中的研究热点。本文的研究工作受国家高技术研究发展计划“863”基金项目“软件的安全性缺陷模型及基于安全性缺陷模型的测试技术(2009AA012404)”、“网构化软件协同生产和运行演化集成台及服务环境(2012AA011201)”及国家自然科学基金项目“航天嵌入式软件缺陷检测方法研究、系统研发及应用(91018002)”的支持,在保证测试效率的前提下,以提高静态测试精度为目标,主要做了以下三方面工作:1.基于内存关联的三元数据类型抽象建模对于静态分析,由于并不实际运行程序本身,导致在分析过程中动态执行信息无法获取,使得和变量具体值关联的故障难于检测。为了确定程序中某操作数或参数的取值范围,需要遍历整个控制流图,根据抽象语法树上每个控制流节点的相关信息,对程序中出现的各个变量进行数据流跟踪分析,对其取值范围进行区间运算,模拟动态执行结果。传统数据流分析的二元静态分析框架<变量-值>模型并不能满足数据流分析中指向分析和别名分析的需求,进而导致分析精度下降。基于符号分析理论,可以把已分配的内存空间抽象成为一个符号,再将符号关联上一个整型区间用来表示抽象空间上的偏移量,利用上述方法建立一个新的三元模型<变量-内存-值>。如果对所有内存中分配的空间做标记的话,势必会占用大量的内存开销,考虑到别名分析与指向分析的数据流分析对象的特性,原有的分析框架可以针对不同的需求进行二元模型和三元模型的同时使用。本文只有当处理指针模型时才会使用三元模型去进行静态分析。本阶段研究工作贡献主要有:(1)提出一种三元数据类型抽象模型,将内存抽象成符号,对其也作为数据流的分析对象之一进行变量关联操作,进而为提高数据流分析精度奠定了基础;(2)将变量所在存储区内对应的具体值作为指向分析的一种属性进行计算,针对程序中指向分析相关的语句类型给出了具体的抽象语法描述,基于该描述中不同的抽象语法,提出了指向分析算法;(3)给出了基于三元模型的数据流推导算法,并对算法的复杂度进行了分析;(4)提出了函数摘要模型,进一步实现了上下文敏感的指向分析算法。2.支持区间运算的别名分析方法当两个或多个变量同时指向一个存储单元或一片存储区域时(即内存地址相同),我们可以称它们互为别名。在控制流上进行区间集运算可以用于表示一个变量或表达式的可能取值范围,但通常的区间集运算没有考虑别名关系,导致变量取值范围修改不及时,计算不准确。由于别名分析的对象之一是内存空间,所以传统数据流分析原有的二元静态分析框架模型已经不能满足别名分析的需求。应用本文第一部分中提出的理论,可以把已分配的内存空间抽象成为一个符号,再将符号关联上一个整型区间用来表示抽象空间上的偏移量,利用上述方法建立一个新的三元模型去计算变量间的别名关系。本文通过对不同语句进行别名分析处理后,可以为每个变量关联-个别名集合,集合中可以能是一个变量也可能是多个变量,当对别名集中的某一变量进行值更新时,对别名集中其他所有变量的值也进行更新,进一步达到利用别名分析测试提高精度的效果。本阶段研究工作贡献主要有:(1)提出了两种别名模型,一种是值关联,一种是存储空间关联的,针对不同的缺陷可以利用不同的模型进行检测,提高了测试精度和效率;(2)值关联的别名除了可以计算出变量间的直接别名关系外,通过三元模型中内存模型的偏移量还可以计算出变量间的间接别名关系;(3)提出一种父区域思想,实现了域敏感别名分析。3.基于域敏感指向分析的区间运算在软件测试中的应用域敏感分析是将程序中所有复杂数据类型的每个成员变量都视作不同的存储对象。在软件静态测试领域中,现有符号执行和区间运算技术并不支持域敏感分析,原因是无法对成员变量进行抽象表示。考虑基于缺陷模式描述的软件静态测试机制,其常见缺陷的分析对象均为基本数据类型,例如空指针的解引用、内存泄漏、非法计算等,将复杂数据类型中的每个成员变量进行非关联性的独立分析对测试精度并无影响,而且这样做可以避免由于域敏感分析中复杂数据类型的相关信息计算导致的效率下降问题。借鉴steensgaard的指向分析原型,本文将该模型进行了支持域敏感分析的改进。本阶段研究工作贡献主要有:(1)提出了一种新的域敏感指向分析模型,该模型将复杂数据类型拆分成独立的变量进行抽象,在满足面向缺陷测试精度要求的同时,避免了对整体模型的数据流更新和合并(2)为所有变量关联一个三元的抽象集合,该集合可以保守的描述程序动态执行信息,提供了计算缺陷状态机状态迁移时的特征条件;(3)给出了数据流计算中具体的类型推导准则和合并策略;(4)设计实现了针对CPP和GCC程序的域敏感缺陷检测工具,在保证测试效率的同时,有效的提高了测试精度。