一种基于测试的静态分析误报消除方法转让专利

申请号 : CN201310165634.8

文献号 : CN103294594B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王林章李孟宸李宣东陈志

申请人 : 南京大学

摘要 :

本发明给出一种基于测试的静态分析误报消除方法,能够增强软件静态分析技术的可用性,降低人工确认和检查静态分析报告的时间和人力成本。利用测试技术来在运行时收集程序信息,与静态分析报告中涉及的目标路径和目标缺陷相互印证,确认缺陷或消除误报。本发明首先读取以基于可扩展标记语言的元数据交换格式保存的静态分析报告文件,从中解析出目标缺陷的信息;对每一条特定缺陷的静态分析警报,采用混合执行的思想对程序进行持续的具体执行、符号执行以及约束求解,在这一过程中根据不同缺陷的特征建模,收集运行时信息;使用上一步获取的运行时信息确认是否发生该缺陷,或判断该静态分析警报是一个误报;迭代直到所有静态分析警报被处理完毕。

权利要求 :

1.一种基于测试的静态分析误报消除方法,其特征在于该方法所包含的步骤为:步骤1)从磁盘文件读取以基于可扩展标记语言的元数据交换格式保存的静态分析报告文件,步骤2)分别从静态分析报告中解析出静态分析警报信息,包括疑似缺陷路径和特定缺陷发生点,形成待验证警报列表,步骤3)采用程序插桩技术在程序源代码中插入标记语句,程序插桩插入的程序语句与原程序同步编译、链接为可执行程序;所述程序插桩或者插桩是在保证被测程序原有逻辑完整性的基础上在程序中插入额外的标记语句,称为探针,通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,获得程序的控制流和数据流信息,得到逻辑覆盖等动态信息,实现测试,步骤4)以在程序源代码中插入的静态分析警报的路径片段为目标,在控制流图上计算程序中每一个分支在执行时是否可能到达标记路径片段,所述控制流图是一个有向图,程序源代码中的每个语句对应图中的一个节点,图中节点之间的路径表示程序代码之间的控制关系,步骤5)利用混合执行测试方法生成测试用例,在运行时验证静态分析警报是否是误报,所述混合执行测试方法是符号执行和具体执行结合的测试方法;符号执行指的是使用符号变量代替具体变量,不执行程序的前提下模拟程序执行来进行相关测试分析的技术,与约束满足问题求解方法一同使用;具体执行就是指使用具体的变量值输入到程序中,驱动程序的正常执行进行测试;混合执行是一种对程序交替进行具体执行和符号执行的混合软件程序测试技术,步骤6:根据测试执行中每一覆盖到目标路径片段时记录的结果集合,判断特定缺陷的静态分析警报是否是一个得到确认的缺陷,如果不是,认为其是误报,报告上述确认/误报消除结果,步骤7:对于测试执行始终无法覆盖执行到的静态分析警报,将其归为一类无法确定的警报,并提醒开发者或测试人员人工处理;

其中:

所述的利用混合执行测试方法生成测试用例,在运行时验证静态分析警报是否是误报,具体处理过程如下:步骤51)以一个初始输入做具体执行,在第一次执行中收集符号表达式和符号约束条件,步骤52)根据收集到的符号约束条件中的分支点,形成对当前执行路径的一个约束组合,满足所有这些约束条件的具体值集合按照此程序路径执行,步骤53)在运行时收集与特定缺陷相关的程序信息,

步骤54)对收集到的约束条件集合中的约束条件逐一取反求解,

步骤55)在每一轮执行中或执行结束前,判断是否当前执行覆盖到目标路径片段;如果执行到疑似缺陷路径,则生成此次运行时缺陷是否触发的一个临时结果,此结果的集合将用于最终确定静态分析警报是否是一个真实的缺陷或误报,步骤56)利用约束求解得到的新值作为新的输入,重复步骤51)的过程,直到满足混合执行停止条件,或达到测试执行迭代次数的上界;

所述插入标记语句的工作包括:

①将待验证警报列表中的警报信息标记于源代码中,也就是标记静态分析警报的路径片段中的分支语句和缺陷相关语句,在其前/后插入标记语句,为后续步骤中计算路径片段可达性和运行时标记路径服务,②插桩标记符号变量和符号表达式、约束条件,为混合执行中的符号执行服务,③根据不同的缺陷特征,插桩标记内存分配,字符串拷贝等特定缺陷的特征语句,以运行时收集信息,辅助判断缺陷是否发生。

说明书 :

一种基于测试的静态分析误报消除方法

技术领域

[0001] 本发明涉及利用测试方法削减静态分析结果中误报数目的技术,主要利用符号执行和具体执行相结合的动态测试技术验证静态分析的结果,实现对软件静态分析结果中误报的判断和消除,属于软件工程、软件测试、软件动静态分析相结合的技术领域。

背景技术

[0002] 静态分析与动态分析技术都被用于在C/C++程序中发现程序缺陷。静态分析技术通常将不同类型的软件缺陷检测过程形式化为特定的匹配问题,即在目标分析程序中匹配某种缺陷的特征或模式。因为软件缺陷常常在特定的控制流路径上发生,大部分的静态分析技术同时也是路径敏感的,或在静态分析的结果中会给出疑似发生缺陷的路径,所以静态分析技术能在不实际运行程序的情况下发现程序中的潜在缺陷,从而避免额外的运行时开销。基于以上特性,静态分析技术在研究界和工业界中都广受重视。然而,静态分析工具可能会牺牲精确性以获得更好的扩展性,从而导致对许多重要的程序属性建模并不准确,比如堆内存单元等。另外,由于缺少运行时信息,静态分析工具常常报告出大量的未经确认的警报,而真实的内存泄漏隐藏其中。这严重限制了实际开发中静态分析工具的可用性,即使是一款成熟的商用静态分析工具,也可能在分析中等规模的程序时报告较多的警报。人工检查所有这些警报并从中找到真实的缺陷是一项艰巨、沉闷和耗时耗力的工作。
[0003] 软件测试技术实际执行待测程序,可以在运行时确认软件缺陷是否发生。实际触发缺陷的一个测试用例及其执行时信息将是确认静态分析警报的有效方式。软件测试的结果可以帮助确认静态分析结果的正确性,从而消除其中的误报。软件测试需要充分和高质量的测试用例集,生成程序测试输入的方法有很多,具体执行和符号执行是其中重要的技术。
[0004] 混合执行技术是符号执行和具体执行结合的技术。具体执行就是使用具体的变量值输入到程序中,驱动程序的执行。符号执行指的是使用符号变量代替具体变量,根据程序中的变量之间相互关系及控制流,得到符号表达式和符号约束条件,从而将程序执行状态符号化;其通常与约束满足问题求解方法一同使用。混合执行技术是一种对同时进行具体执行和符号执行的混合程序测试技术。

发明内容

[0005] 技术问题:软件静态分析技术可以在开发早期阶段发现软件缺陷,因而被广泛使用,但由于静态分析结果中包含不同数量的误报,从而降低了静态分析在实际中的可用性。本发明的目的是提供一种基于测试的静态分析误报消除方法,根据运行时的信息确认真实的软件缺陷,并消除静态分析结果中的误报,增强软件静态分析技术的可用性,降低人工确认和检查静态分析报告的时间和人力成本。
[0006] 技术方案:本发明首先读取并解析静态分析工具产生的包含缺陷信息的软件报告,从中抽取出目标缺陷的信息,包括静态分析工具报告的缺陷发生点和可能导致缺陷的程序路径;对每一条特定缺陷的静态分析警报,采用混合执行的思想对程序进行持续的具体执行、符号执行以及约束求解,在这一过程中根据不同缺陷的特征建模,收集运行时信息,直到停止条件满足时结束该过程;使用上一步获取到的运行时信息确认是否发生该缺陷,或判断该静态分析警报是否是一个误报;迭代执行以上步骤直到所有静态分析警报被处理完毕。
[0007] 基于测试的静态分析误报消除方法包括以下步骤:
[0008] 步骤1:读取静态分析结果报告。
[0009] 从磁盘文件读取以基于可扩展标记语言的元数据交换格式保存的静态分析报告文件。
[0010] 步骤2:对读入的静态分析报告进行解析,得到待验证警报列表。
[0011] 分别从静态分析报告中解析出静态分析警报信息,包括疑似缺陷路径和特定缺陷发生点,形成待验证警报列表。
[0012] 步骤3:程序插桩
[0013] 采用程序插桩技术在程序源代码中插入标记语句,程序插桩插入的程序语句与原程序同步编译、链接为可执行程序。
[0014] 所述插入标记语句的工作包括:
[0015] ①将待验证警报列表中的警报信息标记于源代码中,也就是标记静态分析警报的路径片段中的分支语句和缺陷相关语句,在其前/后插入标记语句,为后续步骤中计算路径片段可达性和运行时标记路径服务。
[0016] ②插桩标记符号变量和符号表达式、约束条件,为混合执行中的符号执行服务;
[0017] ③根据不同的缺陷特征,插桩标记内存分配,字符串拷贝等特定缺陷的特征语句,以运行时收集信息,辅助判断缺陷是否发生。
[0018] 所述程序插桩或者插桩是在保证被测程序原有逻辑完整性的基础上在程序中插入额外的标记语句(称为探针),通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,获得程序的控制流和数据流信息,得到逻辑覆盖等动态信息,实现测试。
[0019] 步骤4:可达性分析
[0020] 以在程序源代码中插入的静态分析警报的路径片段为目标,在控制流图上计算程序中每一个分支在执行时是否可能到达标记路径片段。
[0021] 所述控制流图是一个有向图,程序源代码中的每个语句对应图中的一个节点,图中节点之间的路径表示程序代码之间的控制关系。
[0022] 所述可达性分析是一个直观的控制流图遍历和计算过程,将过程内的控制流计算与过程间的调用图结合即可实现。
[0023] 步骤5:利用混合执行测试方法生成测试用例,对程序进行测试。
[0024] 利用混合执行测试方法生成测试用例,在运行时验证静态分析警报是否是误报,具体处理过程如下:
[0025] 步骤51)以一个初始输入做具体执行,在第一次执行中收集符号表达式和符号约束条件。
[0026] 步骤52)根据收集到的符号约束条件中的分支点,形成对当前执行路径的一个约束组合,满足所有这些约束条件的具体值集合按照此程序路径执行。
[0027] 步骤53)在运行时收集与特定缺陷相关的程序信息。
[0028] 步骤54)对收集到的约束条件集合中的约束条件逐一取反求解。
[0029] 步骤55)在每一轮执行中或执行结束前,判断是否当前执行覆盖到目标路径片段。如果执行到疑似缺陷路径,则生成此次运行时缺陷是否触发的一个临时结果,此结果的集合将用于最终确定静态分析警报是否是一个真实的缺陷或误报。
[0030] 步骤56)利用约束求解得到的新值作为新的输入,重复步骤51)的过程,直到满足混合执行停止条件,或达到测试执行迭代次数的上界。
[0031] 所述混合执行测试方法是符号执行和具体执行结合的测试方法;符号执行指的是使用符号变量代替具体变量,不执行程序的前提下模拟程序执行来进行相关测试分析的技术,一般与约束满足问题求解方法一同使用;具体执行就是指使用具体的变量值输入到程序中,驱动程序的正常执行进行测试;混合执行是一种对程序交替进行具体执行和符号执行的混合软件程序测试技术。
[0032] 步骤6:根据测试执行中每一覆盖到目标路径片段时记录的结果集合,判断特定缺陷的静态分析警报是否是一个得到确认的缺陷,如果不是,认为其是误报。报告上述确认/误报消除结果。
[0033] 步骤7:对于测试执行始终无法覆盖执行到的静态分析警报,将其归为一类无法确定的警报,并提醒开发者或测试人员人工处理。
[0034] 有益效果:本发明所述的基于测试的静态分析误报消除方法实现了对静态分析结果报告的解析,对静态分析报告的缺陷特征在测试运行时加以收集和确认,并消除静态分析警报中的错误报告。具体来说,本发明所述的方法具有如下的有益效果:
[0035] (1)本发明所述的基于测试的静态分析误报消除方法中,通过在运行时收集与静态分析警报相关的程序信息和缺陷特征信息,利用测试技术不断覆盖静态分析警报的疑似路径片段和目标缺陷位置,从而在运行中或运行结束时确认静态分析警报的特定缺陷是否真实发生,并消除错误的警报,降低了人工处理静态分析报告的工作量和时间成本。
[0036] (2)结合了可达性分析和混合执行测试,形成了一套对静态分析报告的解析、插桩、动态分析技术和结果分类系统,通过对不同特征的软件缺陷建模,将可以适用于消除不同类型缺陷的静态分析报告。

附图说明

[0037] 图1是基于测试的静态分析误报消除方法流程图。

具体实施方式

[0038] 下面对本发明的具体实施方式作更详细的描述。
[0039] 一.读取与解析静态分析结果报告
[0040] 在具体实施中,从磁盘文件获取以基于可扩展标记语言的元数据交换格式保存的静态分析报告文件。基于可扩展标记语言的数据格式已经有成熟的信息查找方法及查询语言,但不同缺陷需要在静态分析报告中查询不同的信息,而不同的静态分析工具产生的数据格式也并不统一,需要对应地了解使用的静态分析工具生成的报告数据格式,并编写简单的缺陷信息查找程序获取静态分析警报。
[0041] 要得到待验证的静态分析警报列表,需要在读取静态分析报告同时做特定于缺陷类型的数据处理和组织。静态分析报告中解析出的信息,应该包括并不限于疑似缺陷路径和缺陷发生点,对于特定的缺陷类型,与缺陷相关的其他信息一起组织为警报列表,比如内存泄漏的一条静态分析警报可以组织为三元组,其中a表示疑似泄漏内存的分配位置,p为疑似缺陷路径,e为疑似泄漏点。一条缓冲区溢出警报可以组织为三元组,其中p为疑似缺陷路径,e为静态分析给出导致缓冲区溢出的语句,len为可能导致溢出的缓冲区长度。
[0042] 二.程序源代码预处理
[0043] 在具体实施中,对程序的源代码做两项预处理工作:程序插桩和控制流图可达性分析
[0044] 在具体实施中,采用程序插桩技术在程序源代码中插入需要的语句,程序插桩插入的程序语句与原程序同步编译、链接为可执行程序,程序插桩的主要步骤为:
[0045] (程序插桩1)依次读取待验证列表的警报信息,对每条警报信息中的疑似路径片段做插桩,即将路径片段中的分支语句插入程序中的正确位置;
[0046] (程序插桩2)对每条警报信息中的缺陷相关语句插桩,插桩的语句应该包含缺陷相关的信息,如内存分配位置或缓冲区溢出长度等;
[0047] (程序插桩3)根据程序语法插桩行为语句,以在运行时收集符号变量和符号表达式、约束条件等;
[0048] (程序插桩4)根据不同的缺陷特征,插桩信息收集语句,如内存分配操作,字符串拷贝操作等,应在对应语句后插桩信息收集操作,以便运行时收集信息,辅助判断缺陷是否发生。
[0049] 在具体实施中,控制流图上的可达性分析计算程序中每一个分支在执行时是否可能到达标记路径片段,主要步骤为:
[0050] (可达性分析1)计算源代码控制流图G并存储;
[0051] (可达性分析2)对源代码控制流图求反,即节点不变,图的边指向反转,得到图G’;
[0052] (可达性分析3)在反控制流图G’上,以一条静态分析警报的疑似路径片段作为起点,对G’做遍历;
[0053] (可达性分析4)在遍历过程中,每到达一个G的分支路径,标记该分支路径为到当前警报的路径片段可达;
[0054] (可达性分析5)不断重复(可达性分析3)和(可达性分析4)知道所有警报的路径片段都完成可达性分析;
[0055] 三.采用路径指导策略的混合执行测试消除误报
[0056] 混合执行是具体执行、符号执行两种执行操作相结合的一种方法。在具体实施中,程序执行时即实现了具体执行,而符号执行通过预处理中插桩的符号执行操作同步进行。
[0057] 在具体实施中,深度优先的遍历策略是在对条件约束进行取反时,依次选取路径条件栈栈顶的条件出来进行取反,该策略不断遍历所有遇到的分支,在已有静态分析警报和控制流图的可达性分析条件下,可以进一步优化为路径指导的遍历策略。利用混合执行测试方法生成测试用例,消除误报的步骤:
[0058] (消除误报步骤1)混合执行测试以一个初始输入做具体执行,从而在第一次执行中收集到符号表达式和符号约束条件。
[0059] (消除误报步骤2)根据收集到的分支点符号条件,可以形成对当前执行路径的一个约束集合,满足所有这些约束条件的具体值集合按照此程序路径执行。
[0060] (消除误报步骤3)在具体执行时收集与特定缺陷相关的程序信息,例如,对于缓冲区溢出缺陷,需要收集运行时程序中的缓冲区信息,包括缓冲区的大小,当前使用情况等;对于内存分配和释放操作,收集分配是否成功,内存单元的大小和地址等。
[0061] (消除误报步骤4)采用路径指导的遍历策略,根据预处理步骤中的控制流图可达性分析,在收集到的路径约束条件集合中,选择到静态分析警报路径片段可达性最优的路径分支,进行取反求解。由于避免了对所有分支取反求解,减少了需要遍历的程序路径空间。
[0062] (消除误报步骤5)在每一轮执行中或执行结束前,判断当前执行是否覆盖到目标路径片段。如果执行到了疑似缺陷路径,则生成此次运行时缺陷是否触发的一个临时结果,此结果的集合将用于最终确定静态分析警报是否是一个真实的缺陷或误报。
[0063] (消除误报步骤6)利用约束求解得到的新值作为新的输入,重复(消除误报步骤1)至(消除误报步骤6)的过程,直到满足混合执行停止条件,或达到测试执行迭代次数的上界。
[0064] (消除误报步骤7)根据测试执行中每一覆盖到目标路径片段的结果集合,确认特定缺陷是否发生,如果覆盖到警报路径的结果集合中全部没有出发特定缺陷,认为其是误报。报告上述消除结果。
[0065] (消除误报步骤8)对于测试执行始终无法覆盖执行到的静态分析警报,将其归为一类无法确定的警报,并提醒开发者或测试人员人工处理。