一种代码缺陷检测方法及系统与流程

文档序号:15517715发布日期:2018-09-25 18:45阅读:182来源:国知局

本发明实施例涉及计算机技术领域,更具体地,涉及一种代码缺陷检测方法及系统。



背景技术:

随着计算机技术的飞速发展,人们对计算机的需求和依赖与日俱增,随之而来的是计算机系统的规模和复杂性急剧增加。软件作为计算机系统的灵魂,其规模也以惊人的速度膨胀。2010年最新新发布的linux内核(2.6.36版本)源代码量超过1000万行,而微软的vista操作系统源代码量已超5000万行。大规模软件中的缺陷难以避免,据统计,通过编译和传统软件测试过后,软件代码中平均10~20个缺陷/kloc。由于软件缺陷引起的失效和故障轻则给用户带来不便,重则造成重大生命财产损失。软件代码缺陷检测技术开始于上世纪90年代中期,本世纪初这种技术得到了迅速的发展,目前已有80个以上的相关工具,其中商用的工具有十余个,主要有coverity、klocwork、fortify、logiscope、dts。

但是,现有技术中使用的工具都是对于源代码进行静态分析,通过静态分析源程序计算出来的疑似故障点称为检查点(ip),所有的ip都需要进一步确认其真实性。受ip的规模及复杂度影响,人工确认效率及准确度面临极大挑战。一个优秀的软件工程师一天大约可以确认100个ip,以一个100万行的国产软件为例,工具计算出来的ip大约为4000~6000个,大概需要2~3人月的时间来确认,现有技术对于代码缺陷的检测采用人工确认的方式,其效率及难度都非常低下,因此,现在亟须一种代码缺陷检测方法及系统,来提高代码缺陷检测的效率。



技术实现要素:

本发明实施例提供了一种克服上述问题或者至少部分地解决上述问题的一种代码缺陷检测方法及系统。

一方面本发明实施例提供了一种代码缺陷检测方法,包括:

s1、基于获取的代码缺陷检查点的ip特征以及代码的函数调用关系,分别计算由代码的故障函数入口到所述代码缺陷检查点之间的第一可达路径集合以及由程序入口到故障函数调用点之间的第二可达路径集合;

s2、对所述第一可达路径集合和所述第二可达路径集合所构成的完整路径集合中每一可达路径进行后向约束求解,得到从程序入口到达代码缺陷检查点且疑似触发故障的一组测试用例;

s3、基于所述测试用例,对所述代码缺陷进行检测。

第二方面本发明实施例提供了一种代码缺陷检测系统,所述系统包括:

可达路径计算模块,用于基于获取的代码缺陷检查点的ip特征以及代码的函数调用关系,分别计算由代码的故障函数入口到所述代码缺陷检查点之间的第一可达路径集合以及由程序入口到故障函数调用点之间的第二可达路径集合;

后向约束求解模块,用于对所述第一可达路径集合和所述第二可达路径集合所构成的完整路径集合中每一可达路径进行后向约束求解,得到从程序入口到达代码缺陷检查点且疑似触发故障的一组测试用例;

检测模块,用于基于所述测试用例,对所述代码缺陷进行检测。

根据本发明的第三方面,提供了一种代码缺陷检测设备,包括:

处理器、存储器、通信接口和总线;其中,所述处理器、存储器、通信接口通过所述总线完成相互间的通信;所述通信接口用于该测试设备与显示装置的通信设备之间的信息传输;所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行上述所述的一种代码缺陷检测方法。

第四方面发明实施例提供了一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,使所述计算机执行上述方法。

第五方面发明实施例提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述方法。

本发明实施例提供的一种代码缺陷检测方法及系统,通过计算故障函数入口到代码缺陷检查点的可达路径和程序入口到故障函数调用点的可达路径,并对完整路径进行后向分段迭代求解,得到一组触发疑似故障的测试用例来完成疑似故障的确认,不但将人从繁重的确认工作中解放出来,而且提高了确认的效率和代码检测技术的实用性。

附图说明

图1是本发明实施例提供的一种代码缺陷检测方法流程图;

图2是本发明实施例提供的一种代码缺陷检测系统结构图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

图1是本发明实施例提供的一种代码缺陷检测方法流程图,如图1所示,所述方法包括:

s1、基于获取的代码缺陷检查点的ip特征以及代码的函数调用关系,分别计算由代码的故障函数入口到所述代码缺陷检查点之间的第一可达路径集合以及由程序入口到故障函数调用点之间的第二可达路径集合;

s2、对所述第一可达路径集合和所述第二可达路径集合所构成的完整路径集合中每一可达路径进行后向约束求解,得到从程序入口到达代码缺陷检查点且疑似触发故障的一组测试用例;

s3、基于所述测试用例,对所述代码缺陷进行检测。

可以理解的是,本发明实施例对于一段代码程序的缺陷检查采用了可达路径分析的方式,通过计算故障函数入口到代码缺陷检查点的可达路径和程序入口到疑似故障点的可达路径,并对可达路径进行求解,得到触发疑似故障的测试用例,从而根据测试用例对程序进行检测,实现自动化检测过程,解放人力。

具体的,s1中,本发明实施例根据获取的代码缺陷检查点的ip特征可以对代码的故障函数入口到所述代码缺陷检查点之间的第一可达路径集合进行计算,同样的,根据代码的函数调用关系,可以计算由程序入口到故障函数调用点之间的第二可达路径集合,其中,第一、第二只是为了区分可达路径集合的不同类型,而非有顺序和时序关系。

需要说明的是,在本发明所有实施例中,所述代码缺陷检查点即本发明实施例提供的疑似故障点,本发明实施例需要求解其故障条件,从而对疑似故障点是否发生故障做出判断。

在s1中,计算得到了由代码的故障函数入口到所述代码缺陷检查点之间的第一可达路径集合以及由程序入口到故障函数调用点之间的第二可达路径集合,那么即可以构成由程序入口到代码的故障函数入口再到代码缺陷检查点的完整可达路径,对于完整可达路径中的进行后向约束求解,即可获取每一条完整可达路径的路径约束条件,在本发明实施例中,所述路径约束条件即为ip故障触发条件,根据求解得到的ip故障触发条件,即可得到从程序入口到达代码缺陷检查点且疑似触发故障的一组测试用例。

可以理解的是,在本发明实施例整个对于可达路径的后向约束求解过程中,是按照程序的逆序依次向前进行求解,并将前一段可达路径的约束求解结果作为后一段可达路径的求解输入,从而实现迭代求解的过程。

在上述实施例的基础上,步骤s2之前、步骤s1之后所述方法还包括:

按照可达路径的路径复杂度,对所述第一可达路径集合和所述第二可达路径集合中的每条可达路径进行排序。

本发明实施例优选的提供了按照路径复杂度的方式对可达路径集合的可达路径进行排序,从而方便后续路径求解过程。

具体的,本发明实施例首先将进行路径约束文法提取,然后计算段内的路径约束复杂度,最后计算段间的路径约束复杂度,从而根据路径约束复杂度对所有可达路径进行排序。

其中,进行路径约束文法提取主要包括:

1)、获取一个约束集信息;

2)、判断是否包含多个约束表达式;

3)、如果包含多个约束表达式,则需要提取出约束表达式之间的与或信息;

4)、如果不含多个约束表达式,则直接提取出单个约束表达式的关系运算符;

5)、提取出单个约束表达式的变量信息;

6)、提取出单个约束表达式的操作运算符;

7)、计算约束集复杂度。

其中,计算段内的路径约束复杂度具体包括:

1)、输入段内的约束集信息;

2)、获取第一个约束集信息;

3)、约束文法提取;

4)、判断约束集中提取出的变量是否在之前的约束表示中出现过;

5)、如果约束集中提取出的变量是否在之前的约束表示中出现过,则获得出现过的变量信息;

6)、修改该约束集复杂度;

7)、如果约束集中提取出的变量是否在之前的约束表示中没有出现过,则获取下一个约束集信息;

8)、计算段内约束复杂度。

其中,计算段间的路径约束复杂度具体包括:

1)、输入段间的约束信息;

2)、获取第一个段内约束集信息;

3)、段内约束复杂度计算;

4)、判断是否包含全局变量;

5)、若包含全局变量,则获取出现过的全局变量信息;

6)、修改段内约束集复杂度;

7)、获取下一个段内约束集信息;

8)、计算段间约束复杂度。

可以理解的是,通过本发明实施例上述提供的约束复杂多样计算过程,能够计算每个可达路径所对应的约束复杂度,并按照约束复杂度的大小进行排序,从而为后续的路径分析提供基础。

在上述实施例的基础上,步骤s1中计算由代码的故障函数入口到所述代码缺陷检查点之间的第一可达路径集合,具体包括:

基于获取的代码缺陷检查点的ip特征,计算所述ip特征对应的故障触发条件;

将所述ip特征对应的故障触发条件作为所述代码的函数入口到所述代码缺陷检查点之间的路径约束条件,计算由代码的故障函数入口到所述代码缺陷检查点之间的第一可达路径集合。

可以理解的是,本发明实施例提供的关于函数入口到目标点的可达路径的计算是基于ip特征对应的故障触发条件作为路径约束条件为前提的,其具体计算时本发明实施例在疑似故障函数的cfg中相应的位置添加一个条件语句节点,从而完成如下操作:

1)、根据程序的函数调用关系图及函数的抽象语法树,计算函数所调用函数在其cfg中对应的节点;

2)、根据函数的cfg,计算从函数入口到目标点的路径,得到路径集合methodentry→target,其中,entry表示函数的入口,exit表示函数的出口,target表示目标点,target∈{ip∪{被调用函数所在语句}},路径集合methodentry→exit与method相同,表示函数method的全部路径;

3)、从路径集合中取出一条路径分析,即本发明实施例中的第一可达路径集合;

4)、判断路径上是否包含表示函数调用节点;

5)、若路径上包含表示函数调用节点,那么以函数调用的节点为路径分段的标志,将路径逻辑划分为n+1段,n为表示函数调用节点个数,并将路径上被调用的函数存入集合callee;

6)、判断该函数的路径否分析完毕,若尚未分析完毕,则重新执行3);

7)、若路径上不包含表示函数调用节点,则判断路径的是否可达,若不可达,则重新执行6);

8)、将路径存入可达路径集合method’entry→tatget(method’),重新执行6);

9)、若6)中的函数路径已分析完毕,则从集合callee中取一个函数进行分析;

10)、根据函数调用关系图,判断函数是否为单元函数;

11)、若函数是单元函数,则判断单元函数的可达路径集合是否存在;

12)、若单元函数的可达路径集合不存在,则计算单元函数的全部可达路径,存入路径集合method’;

13)、若单元函数的可达路径集合存在,则判断集合callee中的函数是否分析完毕,若尚未分析完毕,执行9);

14)、若集合callee中的函数已分析完毕,则从集合callee中取出所有单元函数存入集合callee’;

15)、从集合callee中取一个函数;

16)、集合callee’中是否包含该函数所调用的函数;

17)、若集合callee’中包含该函数所调用的函数,则将该函数路径上表示被调用函数的节点使用被调用函数的可达路径替换,并进行形参与实参的转换;

18)、计算该函数的可达路径集合method’,并将函数从集合callee中取出存入集合callee’;

19)、集合callee中的函数是否分析完毕;

20)、若集合callee中的函数分析完毕,则使用被调用函数的可达路径替换函数入口到目标点路径上表示被调用函数的节点,并对形参与实参的转换;

21)、计算函数入口到目标点的可达路径,并存入集合method’entry→target。

通过如上过程,本发明实施例能够获取到集合method’entry→target,并将该集合作为本发明实施例所述的第一可达路径集合进行分析。

在上述实施例的基础上,步骤s1中计算由程序入口到所述代码缺陷检查点之间的第二可达路径集合,具体包括:

基于代码的函数调用关系,计算由主函数到疑似故障函数的函数调用关系序列;

按照函数的调用关系将所述函数调用关系序列分为若干个序列段,并对每个序列段进行路径分析,得到由程序入口到所述故障函数调用点之间的第二可达路径集合,其中,所述路径分析包括将任意两个序列段之间的可达路径进行组合判断。

具体的,本发明实施例提供的关于第二可达路径集合的计算过程与第一可达路径集合的计算过程类似,具体包括:

1)、根据程序的函数调用关系图,计算从主函数到疑似故障函数的函数调用关系序列;

2)、按序取一条函数调用关系序列,并按照函数的调用关系将序列分段,并将分好的序列片段按调用顺序存入集合;

3)、从集合中取一个序列片段分析;

4)、判断序列片段是否已分析过;

5)、若片段已被分析,则判断序列片段是否为不可达片段;

6)、若序列片段为不可达片段,则判断函数调用关系序列是否分析完毕;

7)、计算序列片段的可达路径;

8)、判断可达路径集合是否为空;

9)、若可达路径集合不为空,则判断序列片段是否分析完毕;

10)、按函数调用关系序列的调用顺序,将两个序列片段包含的可达路径组合;

11)、判断是否存在两个片段组合的可达路径集合;

12)、若不存在两个片段组合的可达路径集合,则使用片段组合可达路径生成方法计算组合后片段的可达路径;

13)、若存在两个片段组合的可达路径集合,则判断可达路径集合是否为空;

14)、若可达路径集合不为空,则判断序列上的片段是否分析完毕;

15)、若序列上的片段尚未分析完毕,则将组合后的片段作为新的序列片段;

16)、按序取函数调用关系序列的下一个序列片段;

17)、将函数调用关系序列的可达路径与故障函数入口到ip的可达路径组合;

18)、使用片段组合可达路径生成方法计算组合后片段的可达路径;

19)、判断可达路径集合是否为空,若不为空,则得到从函数入口到ip的可达路径集合;

其中,12)中所述使用片段组合可达路径生成方法计算组合后片段的可达路径,具体包括:

1)、从第一片段对应的可达路径集合中按序取一条路径;

2)、从第二片段对应的可达路径集合中按序取一条路径;

3)、判断两条路径组合后是否可达;

4)、若两条路径组合可达,则将组合后的可达路径存入路径集合中;

5)、判断第二片段中的路径是否分析完毕;

6)、若第二片段中的路径已经分析完毕,则将第二片段中对应的可达路径集合更新为路径集合method’entry→target;

7)、计算组合路径上的矛盾节点,并将矛盾节点分别存入集合nds;

8)、削减第二片段中包含矛盾片段的路径,得到路径集合method”entry→target;

9)、判断集合是否为空;

10)、若集合不为空,则将片段s2中对应的可达路径集合更新为路径集合method”entry→target;

11)、判断第一片段对应的可达路径集合是否分析完毕,若尚未分析完毕若分析完毕,则得到两序列片段组合后的可达路径集合。

通过上述过程,本发明实施例能够得到两序列片段组合后的可达路径集合,即本发明实施例所述的第二可达路径集合。

在上述实施例的基础上,步骤s2具体包括:

对于所述完整路径集合中的每一可达路径,按照函数调用关系,将每一可达路径分为若干段分段路径;

由最末端的分段路径依次对每一分段路径进行约束求解,得到从程序入口到达代码缺陷检查点且疑似触发故障的一组测试用例。

具体的,本发明实施例对于可达路径的约束求解过程如下:

1)、任取一条从程序入口到ip的可达路径;

2)、将路径按照函数调用关系序列片段进行分段;

3)、按照调用关系序列的逆序取一段分段后的路径;

4)、提取分段路径片段的路径约束;

5)、判断路径片段上是否存在其他约束条件;

6)、若路径片段上存在其他约束条件,则将其他约束条件添加到路径约束条件中;

7)、若路径片段上不存在其他约束条件,则用函数实参替换形参,转换路径约束条件并化简,进行约束求解;

8)、判断分段路径集合中的路径片段是否分析完毕,若分析完毕,则得到可达路径的解,即从程序入口到达疑似故障点且可触发疑似故障的一组测试用例;

9)、若分段路径集合中的路径片段没有分析完毕,则将所求解的约束条件转变为下一段路径片段的路径约束条件,重新执行3)。

可以理解的是,本发明实施例提供的方案是由函数的末端由后至前依次对每一段可达路径进行求解,直至获得从程序入口到达疑似故障点且可触发疑似故障的一组测试用例,那么通过测试用例即可以完成对于疑似故障点是否故障的检测判别。

在上述实施例的基础上,当所述第一可达路径集合和/或所述第二可达路径集合为空集时,将所述代码缺陷检查点标记为误报点。

可以理解的是,对于任意代码缺陷检查点而言,如果未能计算得到关于它的由代码的故障函数入口到所述代码缺陷检查点之间的第一可达路径集合以及由程序入口到所述故障函数调用点之间的第二可达路径集合,那么可以理解为该ip误报,实质上该检测点未发生故障,那么在本发明实施例中,将这类ip误报的点标记为误报点,优选的,在进行代码缺陷检测之前,将这部分误报点进行去除。

图2是本发明实施例提供的一种代码缺陷检测系统结构图,如图2所示,所述系统包括:可达路径计算模块1、后向约束求解模块2以及检测模块3,其中:

可达路径计算模块1用于基于获取的代码缺陷检查点的ip特征以及代码的函数调用关系,分别计算由代码的故障函数入口到所述代码缺陷检查点之间的第一可达路径集合以及由程序入口到故障函数调用点之间的第二可达路径集合;

后向约束求解模块2用于对所述第一可达路径集合和所述第二可达路径集合所构成的完整路径集合中每一可达路径进行后向约束求解,得到从程序入口到达代码缺陷检查点且疑似触发故障的一组测试用例;

检测模块3用于基于所述测试用例,对所述代码缺陷进行检测。

具体的如何通过可达路径计算模块1、后向约束求解模块2以及检测模块3对代码缺陷进行检测可参见上述实施例,本发明实施例在此不再赘述。

本发明实施例提供的代码缺陷检测系统,通过计算故障函数入口到代码缺陷检查点的可达路径和程序入口到故障函数调用点的可达路径,并对完整路径进行后向分段迭代求解,得到一组触发疑似故障的测试用例来完成疑似故障的确认,不但将人从繁重的确认工作中解放出来,而且提高了确认的效率和代码检测技术的实用性。

本发明实施例提供一种代码缺陷检测系统,包括:至少一个处理器;以及与所述处理器通信连接的至少一个存储器,其中:

所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令以执行上述各方法实施例所提供的方法,例如包括:s1、基于获取的代码缺陷检查点的ip特征以及代码的函数调用关系,分别计算由代码的故障函数入口到所述代码缺陷检查点之间的第一可达路径集合以及由程序入口到故障函数调用点之间的第二可达路径集合;s2、对所述第一可达路径集合和所述第二可达路径集合所构成的完整路径集合中每一可达路径进行后向约束求解,得到从程序入口到达代码缺陷检查点且疑似触发故障的一组测试用例;s3、基于所述测试用例,对所述代码缺陷进行检测。

本发明实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:s1、基于获取的代码缺陷检查点的ip特征以及代码的函数调用关系,分别计算由代码的故障函数入口到所述代码缺陷检查点之间的第一可达路径集合以及由程序入口到故障函数调用点之间的第二可达路径集合;s2、对所述第一可达路径集合和所述第二可达路径集合所构成的完整路径集合中每一可达路径进行后向约束求解,得到从程序入口到达代码缺陷检查点且疑似触发故障的一组测试用例;s3、基于所述测试用例,对所述代码缺陷进行检测。

本发明实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:s1、基于获取的代码缺陷检查点的ip特征以及代码的函数调用关系,分别计算由代码的故障函数入口到所述代码缺陷检查点之间的第一可达路径集合以及由程序入口到故障函数调用点之间的第二可达路径集合;s2、对所述第一可达路径集合和所述第二可达路径集合所构成的完整路径集合中每一可达路径进行后向约束求解,得到从程序入口到达代码缺陷检查点且疑似触发故障的一组测试用例;s3、基于所述测试用例,对所述代码缺陷进行检测。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1