静态代码检测方法和静态代码检测系统、存储设备与流程

文档序号:16087390发布日期:2018-11-27 22:36阅读:161来源:国知局

本发明属于编程技术领域,具体涉及一种静态代码检测方法和静态代码检测系统、存储设备。



背景技术:

静态代码检测是指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。对需求规格说明书、软件设计说明书、源程序做结构分析、流程图分析、符号执行来找错。静态代码检测通过程序静态特性的分析,找出欠缺和可疑之处,例如不匹配的参数、不适当的循环嵌套和分支嵌套、不允许的递归、未使用过的变量、空指针的引用和可疑的计算等。静态测试结果可用于进一步的查错,并为测试用例选取提供指导。静态代码检测由于不需要运行代码而深受欢迎,但是后续人工缺陷确认的工作量又是一个影响其广泛应用的问题。

缺陷代码扫描是一个静态代码检测技术,目前比较普遍的方法是测试完毕以后人工对缺陷检测结果进行确认。静态代码检测过程包括:首先对缺陷进行建模,然后通过扫描源代码来检测缺陷,但由于检测过程不需要运行程序,导致检测出来的缺陷存在误报的问题,现有技术都是从提高精度的角度出发,比如区间运算、函数分析等,对减少人工确认的工作量方面的研究尚未有涉足。

如何减少缺陷确认的工作量,是一个研究热点,也称为亟待解决的一个问题。



技术实现要素:

本发明所要解决的技术问题是针对现有技术中上述不足,提供一种静态代码检测方法和静态代码检测系统、存储设备,能极大减少人工确认的工作量。

解决本发明技术问题所采用的技术方案是该静态代码检测方法,包括步骤:

对静态代码进行处理,提取变量信息,建立相关变量集合;

根据可能产生缺陷的变量进行缺陷归类,建立缺陷集,所述缺陷集至少包括一个缺陷子集,每一所述缺陷子集包括一个与变量相关的根节点缺陷;

根据所述缺陷子集中所述根节点缺陷的误报状况,确认缺陷。

优选的是,建立相关变量集合的步骤包括:

对静态代码进行词法分析、语义处理;

根据与变量名相关的名称,建立所述相关变量集合。

优选的是,对静态代码进行词法分析为:采用自动化业务流程组合语言进行分析,得到一个文档对象模型树,基于该文档对象模型树生成控制流图;

语义处理为:在所述控制流图的基础上生成定义使用链。

优选的是,建立相关变量集合的步骤还包括:根据与变量名相关名称的赋值函数或函数调用关系,进行别名分析,建立所述相关变量集合。

优选的是,建立缺陷集的步骤包括:

将具有依赖性的变量可能引起的相关缺陷归为一类,建立同类缺陷子集,多个所述缺陷子集形成所述缺陷集。

优选的是,确认缺陷的步骤包括:

根据缺陷关联性进行缺陷误报确认,若所述缺陷子集中根节点缺陷为误报,则所述缺陷子集中与所述根节点缺陷相关的所有缺陷均为误报。

优选的是,确认缺陷的步骤还包括:

若所述缺陷子集中根节点缺陷并非为误报,则向下追溯所述缺陷子集的中间节点,若某一所述中间节点缺陷为误报,则所述缺陷子集中与所述中间节点缺陷向下相关的所有缺陷均为误报;

否则,确认所述缺陷子集中不存在缺陷。

一种静态代码检测系统,包括变量提取模块、缺陷归类模块和确认模块,其中:

所述变量提取模块,配置为对静态代码进行处理,提取变量信息,建立相关变量集合;

所述缺陷归类模块,配置为根据可能产生缺陷的变量进行缺陷归类,建立缺陷集,所述缺陷集至少包括一个缺陷子集,每一所述缺陷子集包括一个与变量相关的根节点缺陷;

所述确认模块,配置为根据所述缺陷子集中所述根节点缺陷的误报状况,确认缺陷。

优选的是,所述变量提取模块包括分析处理单元和集合单元,其中:

所述分析处理单元中,用于对静态代码进行词法分析、语义处理;

所述集合单元,用于根据与变量名相关的程序语句的赋值或函数调用关系,进行别名分析,建立变量集合;

所述缺陷归类模块包括建模单元,所述建模单元用于将具有依赖性的变量可能引起的相关缺陷归为一类,建立同类缺陷子集,多个所述缺陷子集形成所述缺陷集。

一种存储设备,其中存储有多条指令,所述指令加载并执行如下功能:

对静态代码进行处理,提取变量信息,建立相关变量集合;

根据可能产生缺陷的变量进行缺陷归类,建立缺陷集,所述缺陷集至少包括一个缺陷子集,每一所述缺陷子集包括一个与变量相关的根节点缺陷;

根据所述缺陷子集中所述根节点缺陷的误报状况,确认缺陷。

本发明的有益效果是:

本发明提供的静态代码检测方法及系统、存储设备,通过在传统的静态缺陷检测的基础上增加了缺陷关联分析技术,从缺陷之间的内在关联出发,将具有依赖关系的缺陷分为一组;若缺陷之间具有子集关系,如果缺陷子集中的根节点是误报,则整个子集中的所有缺陷均是误报,从而大大提高静态代码检测缺陷确认效率,极大减少人工确认的工作量。

附图说明

图1为本发明实施例中静态代码检测方法的流程图;

图2为本发明实施例中静态代码检测方法的示例示意图;

图3-图5为以程序段进行静态代码检测示例的缺陷说明示意图;

图6为本发明实施例中静态代码检测系统的结构框图

附图标识中:

1-变量提取模块;2-缺陷归类模块;3-确认模块。

具体实施方式

为使本领域技术人员更好地理解本发明的技术方案,下面结合附图和具体实施方式对本发明静态代码检测方法和静态代码检测系统、存储设备作进一步详细描述。

随着大量静态代码检测实践的应用与研究,发明人发现缺陷之间并非独立存在,而是相互有着紧密联系,缺陷的继承和传递性使得缺陷之间具有一定的关联关系。为了提高静态代码检测的效率问题,本发明的技术构思在于:从缺陷关联的角度出发,提供一种静态代码检测方法和静态代码检测系统,通过分析缺陷内在的联系,对缺陷进行归类,减少静态代码检测时人工确认的工作量。

下面具体介绍如何在静态代码检测中增加缺陷归类技术,即将具有依赖性的缺陷归为一类,实现在缺陷误报的时候能便捷的排除具有关联性的缺陷,从而在代码检测完毕后能够减少人工确认的工作量。

如图1和图2所示,该静态代码检测方法,包括步骤:

步骤S1):对静态代码进行处理,提取变量信息,建立相关变量集合。

变量是在程序中定义的,通过代码体现,如variable=c提取变量c的信息。在该步骤中,对静态代码进行词法分析、语义处理,提取变量c的信息。词法分析采用建模工具(例如,以自动化业务流程组合语言BPEL Schema)进行分析,得到一个文档对象模型(Document Object Model,简称DOM)树,基于该文档对象模型树生成控制流图;进而,语义处理在控制流图的基础上生成定义使用链。

“定义”即声明一个变量,而“使用”分两种情况,一种是直接引用变量里面的内容,另一种是把变量赋值给另外一个变量,这种情况即定义为变量名的一种传递,即别名,相当于将变量换成另外一个名字使用。优选的是,在语义处理的过程增加别名分析技术,获得一系列可能具有缺陷的变量。

因为,不同名的变量虽然表面看来是不同的变量,但其实质是通过函数调用参数传递或赋值函数产生不同形式的同一个变量,即将变量传递给其他变量。因此可以在定义使用链中提取别名信息,并根据变量的传递(即赋值或调用)获得变量名之间的关联,把同一变量引起的其他变量归为一类(虽然变量名不同,其实质是通过赋值造成的,本质是同一变量)。

例如:int b=a;int c=f(a);a、b、c,b、c是通过a得到的,第一种情况是通过赋值改变变量a的名称为变量b,第二种情况是通过函数调用改变变量a的名称为变量c。因此可以将b和c称为a的别名,其本质是同一个变量,只是变量名称不同而已。可见,通过变量关联或者别名分析,可以将赋值语句或函数调用产生的不同形式的变量归类在一起。

在该步骤中,如果变量存在赋值或者函数调用,则这样的变量具有传递效应,将此类变量归为一类,建立相关变量集合。

步骤S2)根据可能产生缺陷的变量进行缺陷归类,建立缺陷集,缺陷集至少包括一个缺陷子集,每一缺陷子集包括一个与变量相关的根节点缺陷。缺陷集是具有依赖关系的缺陷组成的集合。缺陷集由缺陷子集构成,虽然不一定是同类,但是有依赖关系。

缺陷的产生往往是由同一个变量引起的,因此将变量作为缺陷分类的依据。有前可知,变量的传递都是通过直接赋值或者间接赋值(函数调用)传递的,也就是说通过赋值可以获得变量之间的依赖性。因此在该步骤中,根据变量可能引起的缺陷之间的关系将缺陷进行分类,如果缺陷之间具有依赖关系,则归为一类,否则单独成为一类。

将变量作为缺陷之间依赖的依据,对缺陷进行分类的具体过程通过图3-图5进行说明:

该步骤可以通过简单的变量名对缺陷进行分类,即把同一个变量产生的相关缺陷归为一类。但是很多情况下,通过程序语句的赋值或者函数调用,缺陷之间是通过一种隐藏的变量联系起来,利用步骤S1)增加的别名分析技术,可以进一步对这些相关变量联系的缺陷进行归类。

图3为示例的一段程序,图4为从图3的程序片段抽象的变量-缺陷示意,图5为图4中变量-缺陷的一个衍生图。图5说明缺陷除了图4中的直接关系之外,叶子节点的缺陷也可以继续衍生传递缺陷。y可以理解为通过将x赋值给y获得,即y=x,k时同样的道理。

缺陷类型具有依赖性,依赖性的判断依据是缺陷产生的原因(例如变量名),本实施例给出依赖性的定义如下:缺陷a的发生总能导致缺陷b的发生,则认为缺陷b依赖于缺陷a,比如缺陷a发生了(是一个声明未定义的缺陷)。同样以图3示例的程序段为例:191行的缺陷,肯定会导致198、199、200、212行的缺陷。

通过该步骤,即可在缺陷检测过程中通过缺陷归类技术,将变量名相同的缺陷归为一类,建立缺陷集。

步骤S3)根据缺陷子集中根节点缺陷的误报状况,确认缺陷。

缺陷具有关联性,本实施例给出关联性的定义如下:如果缺陷a被确认为是误报,则与其关联的缺陷b一定是误报,则认为b是a的子集,a、b处于同一缺陷子集中。

在静态代码检测完毕后,当需要人工进行缺陷确认的时候,如果根节点是误报,则整个缺陷集中的所有缺陷均为误报,例如变量a为一个缺陷集中的根节点,如果缺陷a是误报,则整个缺陷集中的所有缺陷都是误报。因此,只需要确认缺陷a,便可以将该缺陷子集中的所有缺陷确认完毕。

若缺陷子集中根节点缺陷并非为误报,则向下追溯缺陷子集的中间节点,若某一中间节点缺陷为误报,则缺陷子集中与中间节点缺陷向下相关的所有缺陷均为误报;否则,确认缺陷子集中不存在缺陷。

回到实践中,同样以图3示例的程序段为例:191行如果是误报,则198、199、200、212都是误报,则将类似这样的缺陷归为一类。通过分析发现图3所示的程序段中:如果191行sequence(内存泄漏缺陷a)内存分配成功,则整个程序片段不存在缺陷;相反,如果内存分配失败,则后续的198行(缺陷b)、199行(缺陷c)、200行(缺陷d)、212行(缺陷e)中对sequence变量的引用都将导致空指针引用的缺陷。而这些缺陷的发生都源于变量sequence的值,因此将这些缺陷分为一组,并且缺陷a是其他缺陷的根节点。

目前缺陷的误报是测试完毕以后需要人工确认的,采用本发明的静态代码检测方法,在后续人工进行缺陷确认的时候,通过确认根节点的缺陷是否为误报,便可以确认整个缺陷集中的缺陷,不需要逐一进行缺陷确认,大大减少了测试人员人工确认的工作量。

如图6所示,本发明还提供一种静态代码检测系统,包括变量提取模块1、缺陷归类模块2和确认模块3,其中:

变量提取模块1,配置为对静态代码进行处理,提取变量信息,建立相关变量集合;

缺陷归类模块2,配置为根据可能产生缺陷的变量进行缺陷归类,建立缺陷集,缺陷集至少包括一个缺陷子集,每一缺陷子集包括一个与变量相关的根节点缺陷;

确认模块3,配置为根据缺陷子集中根节点缺陷的误报状况,确认缺陷。

优选的是,变量提取模块1包括分析处理单元和集合单元,其中:

分析处理单元中,用于对静态代码进行词法分析、语义处理;

集合单元,用于根据与变量名相关的程序语句的赋值或函数调用关系,进行别名分析,建立变量集合。

缺陷归类模块2包括建模单元,建模单元用于将具有依赖性的变量可能引起的相关缺陷归为一类,建立同类缺陷子集,多个缺陷子集形成缺陷集。

相应的,本发明还提供一种存储设备,其中存储有多条指令,指令加载并执行如下功能:

对静态代码进行处理,提取变量信息,建立相关变量集合;

根据可能产生缺陷的变量进行缺陷归类,建立缺陷集,缺陷集至少包括一个缺陷子集,每一缺陷子集包括一个与变量相关的根节点缺陷;

根据缺陷子集中根节点缺陷的误报状况,确认缺陷。

本发明提供的静态代码检测方法及系统、存储设备,通过在传统的静态缺陷检测的基础上增加了缺陷关联分析技术,从缺陷之间的内在关联出发,将具有依赖关系的缺陷分为一组;若缺陷之间具有子集关系,如果缺陷子集中的根节点是误报,则整个子集中的所有缺陷均是误报,从而大大提高静态代码检测缺陷确认效率,极大减少人工确认的工作量。

可以理解的是,以上实施方式仅仅是为了说明本发明的原理而采用的示例性实施方式,然而本发明并不局限于此。对于本领域内的普通技术人员而言,在不脱离本发明的精神和实质的情况下,可以做出各种变型和改进,这些变型和改进也视为本发明的保护范围。

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