CN103176905B - 一种缺陷关联方法及装置 - Google Patents
一种缺陷关联方法及装置 Download PDFInfo
- Publication number
- CN103176905B CN103176905B CN201310128097.XA CN201310128097A CN103176905B CN 103176905 B CN103176905 B CN 103176905B CN 201310128097 A CN201310128097 A CN 201310128097A CN 103176905 B CN103176905 B CN 103176905B
- Authority
- CN
- China
- Prior art keywords
- defect
- code
- subsequence
- packet
- sequence
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Data Exchanges In Wide-Area Networks (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种缺陷关联方法,包括:从缺陷报告中提取缺陷对应的代码块,根据所提取的代码块生成缺陷相关代码块序列信息库;获取所述缺陷相关代码块序列信息库的基本频繁子序列,并消除所述基本频繁子序列中不满足约束条件的频繁子序列;依据当前频繁子序列对应的缺陷,对缺陷报告中的缺陷进行分组;根据预设的缺陷关联模式,精化分组的缺陷。本发明同时还公开了一种缺陷关联装置。采用本发明的技术方案,可以对缺陷进行精确的分组。
Description
技术领域
本发明涉及计算机中的缺陷关联技术,尤其涉及一种缺陷关联方法及装置。
背景技术
缺陷检测一般包括静态缺陷检测和人工审查两个阶段。静态缺陷检测工具能够检测软件存在的缺陷,并生成缺陷报告。针对静态缺陷检测工具所输出的缺陷报告,开发人员需要通过人工审查来逐一判断这一缺陷是否属实,或者这一缺陷是否足够重要以便需要开发人员修复。
大量的缺陷输出、误报以及不重要的缺陷所占的比例过多,就必然会导致开发人员耗费大量的经历去审查缺陷报告。通常情况下开发人员有责任对缺陷进行评估以判定缺陷是否中肯。然而,处理这些缺陷的速度通常并不是很高,根据国内多个行业的大型系统的测试经验,一般每人每小时处理的缺陷在15至30个之间。如果一个静态缺陷检测工具针对某一软件报告了6000个缺陷,每一个缺陷需要1.5分钟的人工时间来审查,那么一个开发人员需要连续工作18.75天才能全部审查完毕(每天8小时工作),如此耗费了大量的时间和精力。
发明内容
有鉴于此,本发明的主要目的在于提供一种缺陷关联方法及装置,能够对缺陷进行分组,从而减少部分缺陷的识别工作,提高测试人员的工作效率。
为达到上述目的,本发明的技术方案是这样实现的:
本发明提供了一种缺陷关联方法,该方法包括:
从缺陷报告中提取缺陷对应的代码块,根据所提取的代码块生成缺陷相关代码块序列信息库;
获取所述缺陷相关代码块序列信息库的基本频繁子序列,并消除所述基本频繁子序列中不满足约束条件的频繁子序列;
依据当前频繁子序列对应的缺陷,对缺陷报告中的缺陷进行分组;
根据预设的缺陷关联模式,精化分组的缺陷。
上述方案中,该方法还包括:
确定当前频繁子序列能够组成更大的频繁子序列时,将当前频繁子序列组成更大的频繁子序列;
消除所述更大的频繁子序列中不满足约束条件的频繁子序列。
上述方案中,所述从缺陷报告中提取缺陷对应的代码块,根据所提取的代码块生成缺陷相关代码块序列信息库包括:
从缺陷报告中提取缺陷对应的变量声明代码、变量赋值处代码和缺陷发生处代码;
对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码进行语句分析及编译,而分别生成所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树;
对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树分别进行代码元素映射;
获取映射后的代码元素对应的哈希值;
将所述映射后的代码元素对应的哈希值转换为二进制表示的缺陷相关代码块序列信息库。
上述方案中,所述获取所述缺陷相关代码块序列信息库的基本频繁子序列,并消除所述基本频繁子序列中不满足约束条件的频繁子序列包括:
获取所述缺陷相关代码块序列信息库中支持数大于等于1、且项集间隔大于等于0的频繁子序列;
删除所述频繁子序列中项集个数小于或等于设定阈值的频繁子序列;以及,删除项集间隔大于或等于设定阈值的频繁子序列。
上述方案中,所述根据预设的缺陷关联模式,精化分组的缺陷包括:
获取缺陷分组Dk;其中k>=0,k为缺陷分组编号;
根据预设的缺陷关联模式Mi,对所有缺陷分组Dk中的缺陷进行模式匹配;其中i>=0,i为缺陷关联模式编号;
获得与所述缺陷关联模式Mi匹配的所有缺陷集合DMij;其中i>=0,j>=0,j为满足缺陷关联模式i的缺陷集合编号;
时,确定Dk为精化的缺陷分组,该缺陷分组Dk的缺陷关联模式为Mi;其中,表示包含于;
时,从缺陷分组Dk中查找包含DMij的最大缺陷分组Dm,将DMij插入缺陷分组Dm中,并且从不包含Dm的缺陷分组Dk中删除DMij中的元素;精化的缺陷分组为删除DMij中的元素之后的缺陷分组Dk和插入DMij的缺陷分组Dm,且该缺陷分组的缺陷关联模式为Mi;其中,表示不包含于。
本发明还提供了一种缺陷关联装置,该装置包括:缺陷报告处理单元、频繁子序列处理单元、提纯单元、缺陷分组单元、缺陷分组精化单元;其中,
所述缺陷报告处理单元,用于从缺陷报告中提取缺陷对应的代码块,根据所提取的代码块生成缺陷相关代码块序列信息库;
所述频繁子序列处理单元,用于获取缺陷相关代码块序列信息库的基本频繁子序列;
所述提纯单元,用于消除所述基本频繁子序列中不满足约束条件的频繁子序列;
所述缺陷分组单元,用于依据当前频繁子序列对应的缺陷,对缺陷报告中的缺陷进行分组;
所述缺陷分组精化单元,用于根据预设的缺陷关联模式,精化分组的缺陷。
上述方案中,该装置还包括:确定单元和频繁子序列扩大单元;
所述确定单元,用于确定当前频繁子序列能否够组成更大的频繁子序列,能时触发所述频繁子序列扩大单元;
所述频繁子序列扩大单元,用于将当前频繁子序列组成更大的频繁子序列。
上述方案中,所述缺陷报告处理单元包括:缺陷相关代码块提取子单元、语句分析子单元、代码元素映射子单元、哈希值转换子单元、二进制转换子单元;其中,
所述缺陷相关代码块提取子单元,用于从缺陷报告中提取缺陷对应的变量声明代码、变量赋值处代码和缺陷发生处代码;
所述语句分析子单元,用于对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码进行语句分析及编译,而分别生成所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树;
所述代码元素映射子单元,用于对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树分别进行代码元素映射;
所述哈希值转换子单元,用于获取映射后的代码元素对应的哈希值;
所述二进制转换子单元,用于将所述映射后的代码元素对应的哈希值转换为二进制表示的缺陷相关代码块序列信息库。
上述方案中,所述提纯单元包括:第一提纯单元、第二提纯单元;其中,
所述第一提纯单元,用于删除频繁子序列中项集个数小于或等于设定阈值的频繁子序列;
所述第二提纯单元,用于删除项集间隔大于或等于设定阈值的频繁子序列。
上述方案中,所述缺陷分组精化单元包括:缺陷分组获取子单元、匹配子单元、精化子单元;其中,
所述缺陷分组获取子单元,用于获取缺陷分组Dk;其中k>=0,k为缺陷分组编号;
所述匹配子单元,用于据预设的缺陷关联模式Mi,对所有缺陷分组Dk中的缺陷进行模式匹配;其中i>=0,i为缺陷关联模式编号;
获得与所述缺陷关联模式Mi匹配的所有缺陷集合DMij;其中i>=0,j>=0,j为满足缺陷关联模式i的缺陷集合编号;
所述精化子单元,用于确定时,确定Dk为精化的缺陷分组,且该缺陷分组Dk的缺陷关联模式为Mi;其中,表示包含于;
确定时,从缺陷分组Dk中查找包含DMij的最大缺陷分组Dm,将DMij插入缺陷分组Dm中,并且从除Dm以外的缺陷分组Dk中删除DMij中的元素;精化的缺陷分组为删除DMij中的元素之后的缺陷分组Dk和插入DMij的缺陷分组Dm;其中,表示不包含于。
本发明提供的缺陷关联方法及装置,从缺陷报告中提取缺陷对应的代码块,根据所提取的代码块生成缺陷相关代码块序列信息库;获取所述缺陷相关代码块序列信息库的基本频繁子序列,并消除所述基本频繁子序列中不满足约束条件的频繁子序列;依据当前频繁子序列对应的缺陷,对缺陷报告中的缺陷进行分组;根据预设的缺陷关联模式,精化分组的缺陷。如此,可以对缺陷进行精确的分组,从而减少部分缺陷的识别工作,提高测试人员的工作效率。
附图说明
图1为本发明缺陷关联方法实现流程示意图;
图2为本发明缺陷关联装置的组成结构示意图;
图3为本发明缺陷报告处理单元的组成结构示意图;
图4为本发明提纯单元的组成结构示意图;
图5为本发明缺陷分组精化单元的组成结构示意图;
图6为本发明实施例中缺陷报告结果示意图;
图7为本发明实施例中缺陷关联模式示意图。
具体实施方式
为了能够更加详尽地了解本发明的特点与技术内容,下面结合附图对本发明的实现进行详细阐述,所附附图仅供参考说明之用,并非用来限定本发明。
图1为本发明缺陷关联方法实现流程示意图,如图1所示,该方法包括以下步骤:
步骤101:从缺陷报告中提取缺陷对应的代码块,根据所提取的代码块生成缺陷相关代码块序列信息库。
这里,所述缺陷报告中的缺陷包括:缺陷编号、缺陷类型、相关变量名、变量声明代码、变量赋值处代码、缺陷发生处代码等。
本步骤具体包括:
从缺陷报告中提取缺陷对应的变量声明代码、变量赋值处代码和缺陷发生处代码;
对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码进行语句分析及编译,而分别生成所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树;
对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树分别进行代码元素映射;
获取映射后的代码元素对应的哈希值;
将所述映射后的代码元素对应的哈希值转换为二进制表示的缺陷相关代码块序列信息库。
上述方案中,所述对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码进行语句分析及编译,而分别生成所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树具体可以是:将所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码输入到的程序语句语法分析器中,经编译后分别生成所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树。
上述方案中,所述代码元素包括:变量、操作符、常量、函数、关键词等。
对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树分别进行代码元素映射是为了容忍代码元素的修改。本发明制定了一个代码元素映射规则,处理的代码元素主要包括:注释、分隔符、标识符、关键字、基本数据类型及引用类型。制定的代码元素映射规则如下所述。
规则一:通过程序语法分析器过滤掉所有代码注释信息;这里,缺陷相关代码块中有可能包含注释信息,注释信息对于缺陷优化也非常有价值,但是考虑到对缺陷报告的优化效率,本发明通过程序语法分析器过滤掉所有代码注释信息。
规则二:程序的分隔符主要包括:语句分隔符分号“;”、语句块分隔符花括号“{}”和任意多的空格和换行。其中,分号代表一个程序语义的完整表达,故本发明保留分号;语句块分隔符花括号和空格对频繁子序列的挖掘产生影响,故本发明通过程序语法分析器将其过滤掉。
规则三:对关键字的映射规则如表1所示,包括三种情况:(1)关键字处理前后字符不变;(2)关键字同类替换,即静态(static)、私有(private)、保护(protected)、公共(public)这四个关键字将被替换为同一字符,在本发明中统一替换为public,这是因为本发明考虑到程序员可以通过这四个修饰符变换、以及进行类和方法的重用、以及容忍修饰符改变以检测这一类代码块的相似性;(3)过滤删除关键字,这是因为本发明认为关键字只改变程序的语义执行,引入关键字对检查代码相似性及方法的重用会造成困难,故本发明通过程序语法分析器将其过滤掉。
关键字 | 规则 | 备注 | 关键字 | 规则 | 备注 |
abstract | 不变 | public | 同类替换 | public | |
case | 不变 | switch | 不变 | ||
default | 不变 | throws | 不变 | ||
for | 不变 | const | 不变 | ||
native | 不变 | final | 不变 | ||
package | 不变 | implements | 不变 | ||
static | 同类替换 | public | return | 不变 | |
while | 不变 | synchronized | 不变 | ||
volatile | 不变 | transient | 不变 | ||
assert | 不变 | continue | 过滤删除 | ||
catch | 不变 | import | 不变 | ||
do | 过滤删除 | interface | 不变 | ||
goto | 过滤删除 | this | 不变 | ||
new | 不变 | try | 不变 | ||
private | 同类替换 | public | super | 不变 | |
void | 不变 | throw | 不变 | ||
extends | 不变 | break | 过滤删除 | ||
null | 不变 | class | 不变 |
protected | 同类替换 | public | else | 不变 | |
instanceof | 不变 | if | 不变 |
表1
规则四:程序的数据类型一般包括基本数据类型和引用数据类型;基本数据类型指的是整型(int)、浮点型(float)、双精度(double)、字节型(byte)、布尔型(boolean)、长整型(long)、短整形(short)、字符型(char)共8种类型。对于基本数据类型的映射规则如表2所示;本发明对int、float、double类型的标识统一替换为同一类型的标识;优选地,考虑到通过类型转换对一些代码进行重用,本发明可以检测数据类型改变后的相似代码;对long、short这两个修饰符,本发明通过程序语法分析器进行过滤。
关键字 | 映射规则 | 备注 |
int | type | 同类替换 |
float | type | 同类替换 |
double | type | 同类替换 |
byte | byte | 不变 |
boolean | boolean | 不变 |
long | 过滤删除 | 改变 |
short | 过滤删除 | 改变 |
char | char | 不变 |
表2
除基本数据类型以外的数据类型称为引用类型,引用类型数据以对象的形式存在,引用数据类型主要包括:类、接口、数组。本发明中,不对引用数据类型进行映射处理。
规则五:考虑到编程时对同一类型的对象往往容易采用相同或类似的映射规则,以及标识符重命名后进一步进行代码重用,因此本发明对变量名和对象名指定如下映射规则:(a)相同类型的变量和对象分别替换为同一类型的标识,本发明对相同类型的变量(基本类型)名统一替换为:类型名+变量(variable),对相同类型的对象(引用数据类型)名统一替换为:类型名+变量集(object);(b)将int、float、double的数据类型按相同数据类型对待。
本发明将缺陷代码块内的所有方法名称映射为同一标识,在本发明用函数(fun)标识方法名称。
规则六:本发明将所有字符串映射为同一标识,在本发明中用双引号“”标识字符串,本发明中,不对等号(=)、问号(?)及逗号(,)进行映射处理。
步骤102:获取所述缺陷相关代码块序列信息库的基本频繁子序列,并消除所述基本频繁子序列中不满足约束条件的频繁子序列。
本步骤具体包括:获取所述缺陷相关代码块序列信息库中支持数大于等于1、且项集间隔大于等于0的频繁子序列;
删除所述频繁子序列中项集个数小于或等于设定阈值的频繁子序列;以及,删除项集间隔大于或等于设定阈值的频繁子序列。
所述基本频繁子序列为支持数大于等于1、且项集间隔大于等于0的频繁子序列;这里,当支持数大于等于1、且项集间隔大于等于0为所有频繁子序列皆满足的条件。例如,序列数据库D={fabced;abecf;agbch;abijc;aklc},如果将项集间隔设置为任意大于0的数,那么子序列abc的支持序列为fabced;abecf;agbch;abijc,且子序列abc的支持数为4(表示有四个序列支持该子序列);如果将最大间隔设置为0,那么子序列abc的支持序列为fabced,且子序列abc的支持数为1;最大间隔为0意味着缺陷序列中项集间的插入或删除都不能支持子序列。
上述方案中,删除所述频繁子序列中项集个数小于或等于设定阈值的频繁子序列具体为:如果一个频繁子序列仅仅包含一至两个简单标识符,并且不能组成更大的子序列,那么就考虑将其删除。
上述方案中,删除项集间隔大于或等于设定阈值的频繁子序列具体为:频繁子序列的项集相对于源序列而言具有一定的间隔,因此设定一个最大项集间隔max_gap,如果该频繁子序列的项集间隔超过max_gap,则将该频繁子序列删除。这里,频繁子序列的项集具有间隔是为了识别出实际情况中几个代码片段总插入或删除一些标识符的情况。
步骤103:依据当前频繁子序列对应的缺陷,对缺陷报告中的缺陷进行分组。
本步骤之前,该方法还包括:确定当前频繁子序列能够组成更大的频繁子序列时,将当前频繁子序列组成更大的频繁子序列;
消除所述更大的频繁子序列中不满足约束条件的频繁子序列。
当两个相邻频繁子序列组合为一个更大频繁子序列的时候,那么这个更大频繁子序列的间隔被继续扩大,因此需要删除项集间隔大于或等于设定阈值的更大频繁子序列。
本步骤中,频繁子序列和缺陷具有映射关系;在获取频繁子序列的同时,添加并维护一个标识(ID,Identity)链表,该链表同步记录频繁子序列的支持序列(即缺陷所对应的序列),通过记录支持序列的ID,那么就能够定位到相应的缺陷,进而根据频繁子序列对缺陷进行分组。
步骤104:根据预设的缺陷关联模式,精化分组的缺陷。
这里,所述缺陷关联模式为本发明预设的缺陷关联模式,这些关联模式是可扩展的,是可以不断填充的。
本步骤具体包括:
获取缺陷分组Dk;其中k>=0,k为缺陷分组编号;
根据预设的缺陷关联模式Mi,对所有缺陷分组Dk中的缺陷进行模式匹配;其中i>=0,i为缺陷关联模式编号;
获得与所述缺陷关联模式Mi匹配的所有缺陷集合DMij;其中i>=0,j>=0,i为缺陷关联模式编号,j为满足缺陷关联模式i的缺陷集合编号;
时,确定Dk为精化的缺陷分组,且该缺陷分组Dk的缺陷关联模式为Mi;其中,DMij Dk为Dk包含DMij;
时,从缺陷分组Dk中查找包含DMij的最大缺陷分组Dm,将DMij插入缺陷分组Dm中,并且从不包含Dm的缺陷分组Dk中删除DMij中的元素;精化的缺陷分组为删除DMij中的元素之后的缺陷分组Dk和插入DMij的缺陷分组Dm;其中,为Dk不包含DMij。
通过使用本发明的关联技术,最终缺陷报告结果如图6所示:Dk为执行步骤103后得到的缺陷分组(其中k>=0),从图6可知,任意一个缺陷分组Dk经过步骤104后又进一步被缺陷关联模式优化。
例如,缺陷关联模式可以是:强关联、若关联、关联;优选地,判断Dk中的缺陷是否为关联模式中的强关联时,将Dk中缺陷的关键词与强关联模式中的关键词进行匹配,匹配的关键词可以是变量、指针等参数;判断Dk是否为关联模式中的若关联或者关联时,可以通过其他关键词进行匹配。
匹配之后,如果Dk包含所匹配的缺陷集合,则Dk为精华的缺陷分组,且该缺陷分组的缺陷关联模式为强关联;如果Dk不包含所匹配的缺陷集合,则将缺陷集合插入到包含该缺陷集合的最大缺陷分组中,同时删除其他缺陷分组中所述缺陷集合中的元素。新组成的缺陷分组的缺陷关联模式为强关联。
本发明中,将一个缺陷所对应的缺陷相关代码块称为一个序列。可以具体表示如下:
序列S=<t1,t2,t3…tn>
上式中,序列S为n个项集的有序集合,序列的最小单元为项,若干个项可以构成一个项集,若干个项集构成一个序列,序列的大小|S|是指序列中项集的个数,序列的长度是指序列中所有项的个数。
一个序列是对一组有序的代码元素的抽象。本发明中序列的项对应于代码元素。本发明中的代码元素是指:代码的注释及分隔符、标识符、关键字、基本数据类型、引用类型等。
本发明规定:(1)本发明中序列的项集对应于缺陷代码块的一行代码。(2)本发明中序列对应于每一个缺陷的缺陷代码块。下面给出本发明中所使用的子序列和频繁子序列的概念。
子序列是组成序列的项的一个子集,子序列中项的出现的次序与序列中出现的次序相同,相对于原始序列,子序列中的元素可以有一些间隔。
将达到一定出现次数的子序列称为频繁子序列。
对于一个序列,如果给定的子序列出现在该序列中,则将该序列称为此子序列的一个支持序列。
一个子序列在序列集合中出现次数被称为这个子序列的支持。一个子序列是否为频繁子序列是由设置的约束条件决定的。一般而言,所有的子序列的支持序列都会大于或者等于子序列的长度。
例如,一个序列数据库D有五个序列,D={fabced;abecf;agbch;abijc;aklc},子序列abc出现的次数是4次,序列agbch是abc的支持序列。加入把最小支持设定为4,那么频繁子序列分别为{a:5;b:4;c:5;ab:4;ac:5;bc:4;abc:4}。
本发明并不直接对由缺陷生成的代码元素序列进行操作,而是需要对代码元素序列进行数据转换,进而将待处理的序列数据库转化为二进制文件。本发明的转换法则如下:
(1)以项(代码的注释及分隔符、代码元素、关键字、基本数据类型、引用类型等每一个具体代码元素)为单位,将每一个项的字符串转换为哈希值。
(2)上述哈希值的每一位整数用4位16进制数来表示。
(3)在二进制文件中,项集与项集间用-1所对应的16进制来间隔,序列与序列之间用-2所对应的16进制来间隔。
(4)将上述内容存储到一个二进制文件中。
子序列中项的出现的次序与序列中出现的次序相同,相对于原始序列,子序列中的元素可以有一些间隔。如果间隔过大,必然会造成得到的子序列差异扩大,例如序列abdec为子序列abc提供支持,尽管abc不是连续的出现。子序列的这一属性可以使得的发明能够检查出带有轻微修改的相似缺陷相关代码。但是,子序列这一属性也使得的子序列计算引入更多的相似缺陷代码块,进而降低发明的精确性。为了解决这一问题,引入最大间隔策略,下面给出最大间隔的定义。
为了解决子序列间断过多而引起的关联误报问题,本发明添加一个间隔约束,在频繁子序列计算过程中本发明仅仅计算那些间隔不大于给定的临界值的子序列,称这一临界值为最大间隔。对于某一序列而言,如果一个子序列的间隔超过规定的最大间隔,那么本发明就将这个序列从支持序列中删除。
例如,序列数据库D={fabced;abecf;agbch;abijc;aklc},如果将最大间隔设置为0,那么子序列abc的支持序列为1;如果将最大间隔设置为1,那么子序列abc的支持序列为3;最大间隔为0意味着缺陷语句块间的插入或删除都不能识别,而最大间隔为1或2则意味着可以识别一到两个插入删除操作。
本发明包含的三个缺陷关联模式如图7所示:图7-(a)与图7-(b)表示同一对象,从图中可以看出对象值未改变,且该对象引发的两个(或多个)缺陷是相互关联的。在本发明中,称这些缺陷为强关联,并在缺陷分组中进一步标识该强关联。
图7-(c)表示同一对象,且对象值改变,该对象值改变前后引发的两个(或多个)缺陷是相互关联的。在本发明中,称这些缺陷为弱关联,并在缺陷分组中进一步标识该弱关联。
图7-(d)表示同一方法的返回值而引起的两个(或多个)缺陷,本发明中称这些缺陷为强关联。
图2为本发明缺陷关联装置组成结构示意图,如图2所示,该装置包括:缺陷报告处理单元21、频繁子序列处理单元22、提纯单元23、缺陷分组单元24、缺陷分组精化单元25;其中,
所述缺陷报告处理单元21,用于从缺陷报告中提取缺陷对应的代码块,根据所提取的代码块生成缺陷相关代码块序列信息库;
所述频繁子序列处理单元22,用于获取缺陷相关代码块序列信息库的基本频繁子序列;
所述提纯单元23,用于消除所述基本频繁子序中不满足约束条件的频繁子序列;还用于对更大的频繁子序进行提纯,消除不满足约束条件的频繁子序列;
所述缺陷分组单元24,用于依据当前频繁子序列对应的缺陷,对缺陷报告中的缺陷进行分组;
缺陷分组精化单元25,用于根据预设的缺陷关联模式,精化分组的缺陷。
优选地,该装置还包括:确定单元26和频繁子序列扩大单元27;
所述确定单元26,用于检测当前频繁子序列是否能够组成更大的频繁子序列,如果能,通知频繁子序列扩大单元;
所述频繁子序列扩大单元27,用于收到通知后,对所述更大的纯后的频繁子序组成更大的频繁子序列。
优选地,如图3所示,所述缺陷报告处理单元21进一步包括:缺陷相关代码块提取子单元211、语句分析子单元212、代码元素映射子单元213、哈希值转换子单元214、二进制转换子单元215;其中,
所述缺陷相关代码块提取子单元211,用于从缺陷报告中提取缺陷对应的变量声明代码、变量赋值处代码和缺陷发生处代码;
所述语句分析子单元212,用于对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码进行语句分析及编译,而分别生成所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树;
所述代码元素映射子单元213,用于对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树分别行代码元素映射;
所述哈希值转换子单元214,用于获取映射后的代码元素对应的哈希值;
所述二进制转换子单元215,用于将所述映射后的代码元素对应的哈希值转换为二进制表示的缺陷相关代码块序列信息库。
优选地,如图4所示,所述提纯单元23进一步包括:第一提纯单元231、第二提纯单元232;其中,
所述第一提纯单元231,用于删除频繁子序列中项集个数小于或等于设定阈值的频繁子序列;
例如,如果一个频繁子序列仅仅包含一至两个简单标识符,并且不能组成更大的子序列,那么就考虑将其删除;
所述第二提纯单元232,用于删除集间隔大于或等于设定阈值的频繁子序列。
优选地,如图5所示,所述缺陷分组精化单元25进一步包括:缺陷分组获取子单元251、匹配子单元252、精化子单元253;其中,
所述缺陷分组获取子单元251,用于获取缺陷分组Dk;其中k>=0,k为缺陷分组编号;
所述匹配子单元252,用于据预设的缺陷关联模式Mi,对所有缺陷分组Dk中的缺陷进行模式匹配;其中i>=0,i为缺陷关联模式编号;
获得与所述缺陷关联模式Mi匹配的所有缺陷集合DMij;其中i>=0,j>=0,i为缺陷关联模式编号,j为满足缺陷关联模式i的缺陷集合编号;
所述精化子单元253,用于确定时,确定Dk为精化的缺陷分组,且该缺陷分组Dk的缺陷关联模式为Mi;其中,为Dk包含DMij;
确定时,从缺陷分组Dk中查找包含DMij的最大缺陷分组Dm,将DMij插入缺陷分组Dm中,并且从除Dm以外的缺陷分组Dk中删除DMij中的元素;精化的缺陷分组为删除DMij中的元素之后的缺陷分组Dk和插入DMij的缺陷分组Dm;其中,为Dk不包含DMij。
这里,当,则说明本发明利用频繁子序列计算技术优化缺陷报告是精确的。
下面通过具体的实例对利用本发明提出的缺陷关联方法做进一步说明。
如下所述的代码中是使用静态缺陷检测工具DTS7.0检测的九个空指针缺陷相关代码片段:
Azureus_3.0.5.2/.../X509CertificateObject.java
45:public class X509CertificateObject
…
209:public byte[]getSigAlgParams()
…
230:return null;//defect1:return byte[0];
…
234:public boolean[]getIssuerUniqueID()
…
251:return null;//defect2return Boolean[];
…
254:public boolean[]getSubjectUniqueID()
…
271:return null;//defect3return Boolean[];
…
274:public boolean[]getKeyUsage()
…
304:return null;//defect4return Boolean[];
…
386:private byte[]getExtensionBytes(String oid)
…
399:return null;//defect5return byte[0];
…
402:public byte[]getExtensionValue(String oid)
…
428:return null;//defect6return byte[0];
Azureus_3.0.5.2/.../ADVMessageDecoder.java
public class ADVMessageDecoder implements MessageStreamDecoder{
183:ByteBuffer bb=decode_array[i];
…...
193:int remaining=bb.remaining();//defect
…..
}
Azureus_3.0.5.2/.../AZMessageDecoder.java
public class AZMessageDecoder implements MessageStreamDecoder{
231:ByteBuffer bbaz=decode_array[i];
…...
242:int remaining=bbaz.remaining();//defect
…..
}
Azureus_3.0.5.2/.../BTMessageDecoder.java
public class BTMessageDecoder implements MessageStreamDecoder{
215:ByteBuffer bbbt=decode_array[i];
…...
225:int remaining=bbbt.remaining();//defect
…..
}
下面利用本发明对上述九个缺陷相关代码片段处理的过程简要描述如下:
(1)执行图1所示的步骤101:
提取九个缺陷的缺陷相关代码块,并记录其缺陷编号;
将九个缺陷相关代码块分别输入到程序语句语法分析器中,生成9个缺陷相关代码对应的语法树。
利用程序语句的语法树信息,完成程序缺陷相关代码块的代码元素映射。九个缺陷对应的缺陷代码块被替换为表3所示的形式。
表3
获取代码元素对应的哈希值,将步骤映射后的代码元素用其对应的哈希值表示。
将哈希值数据存储为二进制文件,具体格式为:将一条缺陷的所有相关代码块组成为一个序列(sequences),每一个序列Seqm都有如下格式组成:
<(item_11,item_12,...,item_1n)(item_21,item_22,...item_2m)...>
-------------------------- -----------------------------
transaction1 transaction2......
其中,Seqm中的m代表第m个缺陷,Seqm代表第m个缺陷所对应的代码块序列。transaction1代表缺陷所对应的代码块的第一行,即变量的定义行,transaction2表示变量的赋值行,变量可以被多次赋值,所以可以有多个transaction。对于每一个transaction,即每一行代码,又将其拆分成若干元素,即上式中对应的item,每一个代码元素对应于一个item。项集与项集间用-1来间隔,序列与序列之间用-2来间隔。
(2)执行图1所示的步骤102:进行频繁子序列计算,本发明默认设定的min_support为2,默认最大代码元素max_gap为0,即默认不允许代码元素插入,只允代码元素许修改。
删除频繁子序列中项集个数小于或等于设定阈值的频繁子序列。例如,如果一个频繁子序列仅仅包含一至三个简单代码元素那么就考虑将其删除。
删除项集间隔大于或等于设定阈值的频繁子序列。这里,子序列具有一定间隔,就能够识别出实际情况中几个代码片段总插入或删除一些代码元素的情况。当两个相邻子序列组合为一个更大子序列时,组合后的子序列的间隔被继续扩大,因此本发明设定了一个最大代码元素间隔max_gap,如果组合后的子序列的间隔超过max_gap,则将该组合后的子序列删除。本发明中,默认max_gap为0,即不允许插入或删除,只允许修改,这样,进一步提高了分组精度。
将当前频繁子序列组成更大的频繁子序列,直至频繁子序列稳定,不能组成更大的频繁子序列为止。
经过上述三个步骤,本发明最终计算出的频繁子序列如表4所示:
表4
根据当前频繁子序列与具体缺陷编号映射关系,具有相同频繁子序列的缺陷被分为一组,生成初步优化的缺陷报告数据库。
(4)执行图1所示的步骤104:基于缺陷关联模式对缺陷分组进行求精。例如,缺陷编号为7、8、9的三个缺陷的相关变量都为remaining(),根据本发明已有缺陷关联模式,缺陷编号为7、8、9的三个缺陷为强关联,即如果一个为真,其余两个为真,如果一个是误报,那么其余两个也都是误报。
至此为止,经过本发明优化后的缺陷报告如表5所示:
表5
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
Claims (6)
1.一种缺陷关联方法,其特征在于,该方法包括:
从缺陷报告中提取缺陷对应的代码块,根据所提取的代码块生成缺陷相关代码块序列信息库;
获取所述缺陷相关代码块序列信息库的频繁子序列,并消除所述序列信息库中不含频繁子序列的序列;
依据当前序列信息库中的序列对应的缺陷,对缺陷报告中的缺陷进行分组;
根据预设的缺陷关联模式,精化所述分组后的缺陷;
其中,所述从缺陷报告中提取缺陷对应的代码块,根据所提取的代码块生成缺陷相关代码块序列信息库包括:
从缺陷报告中提取缺陷对应的变量声明代码、变量赋值处代码和缺陷发生处代码;
对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码进行语句分析及编译,而分别生成所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树;
对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树分别进行代码元素映射;
获取映射后的代码元素对应的哈希值;
将所述映射后的代码元素对应的哈希值转换为二进制表示的缺陷相关代码块序列信息库;
所述代码元素包括:注释、分隔符、标识符、关键字、基本数据类型及引用类型;
所述根据预设的缺陷关联模式,精化分组的缺陷包括:
获取缺陷分组Dk;其中k>=0,k为缺陷分组编号;
根据预设的缺陷关联模式Mi,对所有缺陷分组Dk中的缺陷进行模式匹配;其中i>=0,i为缺陷关联模式编号;
获得与所述缺陷关联模式Mi匹配的所有缺陷集合DMij;其中i>=0,j>=0,j为满足缺陷关联模式Mi的缺陷集合编号;
时,确定Dk为精化的缺陷分组,该缺陷分组Dk的缺陷关联模式为Mi;其中,表示包含于;
时,从缺陷分组Dk中查找包含DMij的最大的缺陷分组Dm,将DMij插入缺陷分组Dm中,并且从不包含Dm的缺陷分组Dk中删除DMij中的元素;精化的缺陷分组为删除DMij中的元素之后的缺陷分组Dk和插入DMij的缺陷分组Dm的集合,且该精化的缺陷分组的缺陷关联模式为Mi;其中,表示不包含于;
其中,所述缺陷关联模式包括:强关联、弱关联、关联;所述频繁子序列为达到一定出现次数的子序列;将对象值未改变的对象引发的两个或两个以上的缺陷称为强关联,将对象值改变前后引发的两个或两个以上的缺陷称为弱关联,所述对象为引用类型数据。
2.根据权利要求1所述的缺陷关联方法,其特征在于,该方法还包括:
确定当前相邻的频繁子序列能够组成更大的频繁子序列时,将当前频繁子序列组成更大的频繁子序列;
消除所述序列信息库中不含所述更大频繁子序列的序列。
3.根据权利要求1所述的缺陷关联方法,其特征在于,所述获取所述缺陷相关代码块序列信息库的频繁子序列,并消除所述序列信息库中不含频繁子序列的序列包括:
获取所述缺陷相关代码块序列信息库中含支持数大于等于1、且项集间隔大于等于0的频繁子序列的序列;
删除所述序列信息库中含项集个数小于或等于设定阈值的频繁子序列的序列;以及,删除含项集间隔大于或等于设定阈值的频繁子序列的序列;
其中,所述支持数为一个子序列在序列集合中出现的次数;所述项集为子序列中所有项的集合,所述项集间隔为所述项集在序列集合中出现的次序间隔。
4.一种缺陷关联装置,其特征在于,该装置包括:缺陷报告处理单元;频繁子序列处理单元、提纯单元、缺陷分组单元、缺陷分组精化单元;其中,
所述缺陷报告处理单元,用于从缺陷报告中提取缺陷对应的代码块,根据所提取的代码块生成缺陷相关代码块序列信息库;
所述频繁子序列处理单元,用于获取缺陷相关代码块序列信息库的频繁子序列;
所述提纯单元,用于消除所述序列信息库中不含频繁子序列的序列;
所述缺陷分组单元,用于依据当前序列信息库中的序列对应的缺陷,对缺陷报告中的缺陷进行分组;
所述缺陷分组精化单元,用于根据预设的缺陷关联模式,精化所述分组后的缺陷;
所述缺陷报告处理单元包括:缺陷相关代码块提取子单元、语句分析子单元、代码元素映射子单元、哈希值转换子单元、二进制转换子单元;其中,
所述缺陷相关代码块提取子单元,用于从缺陷报告中提取缺陷对应的变量声明代码、变量赋值处代码和缺陷发生处代码;
所述语句分析子单元,用于对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码进行语句分析及编译,而分别生成所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树;
所述代码元素映射子单元,用于对所述变量声明代码、所述变量赋值处代码和所述缺陷发生处代码对应的语法树分别进行代码元素映射,所述代码元素包括:注释、分隔符、标识符、关键字、基本数据类型及引用类型;
所述哈希值转换子单元,用于获取映射后的代码元素对应的哈希值;
所述二进制转换子单元,用于将所述映射后的代码元素对应的哈希值转换为二进制表示的缺陷相关代码块序列信息库;
所述缺陷分组精化单元包括:缺陷分组获取子单元、匹配子单元、精化子单元;其中,
所述缺陷分组获取子单元,用于获取缺陷分组Dk,其中k>=0,k为缺陷分组编号;
所述匹配子单元,用于据预设的缺陷关联模式Mi,对所有缺陷分组Dk中的缺陷进行模式匹配,其中i>=0,i为缺陷关联模式编号;
获得与所述缺陷关联模式Mi匹配的所有缺陷集合DMij,其中i>=0,j>=0,j为满足缺陷关联模式Mi的缺陷集合编号;
所述精化子单元,用于确定时,确定Dk为精化的缺陷分组,且该精化的缺陷分组Dk的缺陷关联模式为Mi,其中,表示包含于;
确定时,从缺陷分组Dk中查找包含DMij的最大的缺陷分组Dm,将DMij插入缺陷分组Dm中,并且从除Dm以外的缺陷分组Dk中删除DMij中的元素;精化的缺陷分组为删除DMij中的元素之后的缺陷分组Dk和插入DMij的缺陷分组Dm的集合,其中,表示不包含于;
其中,所述缺陷关联模式包括:强关联、弱关联、关联;所述频繁子序列为达到一定出现次数的子序列;将对象值未改变的对象引发的两个或两个以上的缺陷称为强关联,将对象值改变前后引发的两个或两个以上的缺陷称为弱关联,所述对象为引用类型数据。
5.根据权利要求4所述的缺陷关联装置,其特征在于,该装置还包括确定单元和频繁子序列扩大单元;其中,
所述确定单元,用于确定当前相邻的频繁子序列能否组成更大的频繁子序列,能时触发所述频繁子序列扩大单元;
所述频繁子序列扩大单元,用于将当前频繁子序列组成更大的频繁子序列。
6.根据权利要求4所述的缺陷关联装置,其特征在于,所述提纯单元包括第一提纯单元和第二提纯单元;其中,
所述第一提纯单元,用于删除序列信息库中含项集个数小于或等于设定阈值的频繁子序列的序列;
所述第二提纯单元,用于删除含项集间隔大于或等于设定阈值的频繁子序列的序列;
其中,所述项集为子序列中所有项的集合,所述项集间隔为所述项集在序列集合中出现的次序间隔。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310128097.XA CN103176905B (zh) | 2013-04-12 | 2013-04-12 | 一种缺陷关联方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310128097.XA CN103176905B (zh) | 2013-04-12 | 2013-04-12 | 一种缺陷关联方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103176905A CN103176905A (zh) | 2013-06-26 |
CN103176905B true CN103176905B (zh) | 2016-11-09 |
Family
ID=48636800
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310128097.XA Expired - Fee Related CN103176905B (zh) | 2013-04-12 | 2013-04-12 | 一种缺陷关联方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103176905B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108897678B (zh) * | 2018-06-20 | 2021-10-15 | 中国联合网络通信集团有限公司 | 静态代码检测方法和静态代码检测系统、存储设备 |
CN109558166B (zh) * | 2018-11-26 | 2021-06-29 | 扬州大学 | 一种面向缺陷定位的代码搜索方法 |
CN110427317A (zh) * | 2019-07-05 | 2019-11-08 | 深圳壹账通智能科技有限公司 | 一种相关值确定方法及装置 |
CN110502361B (zh) * | 2019-08-29 | 2023-05-30 | 扬州大学 | 面向bug报告的细粒度缺陷定位方法 |
CN113051156B (zh) * | 2021-03-16 | 2022-03-11 | 广东工业大学 | 一种基于区块链溯源与信息检索的软件缺陷定位方法 |
CN114816497B (zh) * | 2022-04-18 | 2023-11-28 | 南京航空航天大学 | 基于bert预训练模型的链接生成方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101452469A (zh) * | 2008-12-24 | 2009-06-10 | 天津大学 | 基于攻击模式的软件安全缺陷库系统及其管理方法 |
CN102156832A (zh) * | 2011-03-25 | 2011-08-17 | 天津大学 | 一种Firefox扩展的安全缺陷检测方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2005327036A (ja) * | 2004-05-13 | 2005-11-24 | Sony Corp | 情報処理装置および方法、記録媒体、並びにプログラム |
-
2013
- 2013-04-12 CN CN201310128097.XA patent/CN103176905B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101452469A (zh) * | 2008-12-24 | 2009-06-10 | 天津大学 | 基于攻击模式的软件安全缺陷库系统及其管理方法 |
CN102156832A (zh) * | 2011-03-25 | 2011-08-17 | 天津大学 | 一种Firefox扩展的安全缺陷检测方法 |
Non-Patent Citations (2)
Title |
---|
函数后置信息在软件静态测试中的应用;金大海 等;《北京邮电大学学报》;20101231;第33卷(第6期);第103-106页 * |
运行时异常对软件静态测试的影响研究;金大海 等;《计算机学报》;20110630;第34卷(第6期);第1090-1099页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103176905A (zh) | 2013-06-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103176905B (zh) | 一种缺陷关联方法及装置 | |
Lawrie et al. | Extracting meaning from abbreviated identifiers | |
CN104077147A (zh) | 一种基于代码克隆自动检测和及时提醒的软件复用方法 | |
KR101617696B1 (ko) | 데이터 정규표현식의 마이닝 방법 및 장치 | |
CN102360336B (zh) | 一种基于语法规则的自动化测试系统及方法 | |
CN104407872A (zh) | 代码克隆的检测方法 | |
CN105335246B (zh) | 一种基于问答网站分析的程序崩溃缺陷自动修复方法 | |
CN103020494B (zh) | 一种利用程序代码编程模式著作权归属检测模型检测著作权归属的方法 | |
KR100995861B1 (ko) | 온톨로지 스키마와 결합된 개체명 사전 및 마이닝 규칙을 이용한 용어의 개체명 결정모듈 및 방법 | |
Zibran et al. | IDE-based real-time focused search for near-miss clones | |
CN107066262A (zh) | 源代码文件克隆邻接表合并检测方法 | |
CN103294664A (zh) | 开放领域新词发现的方法及系统 | |
CN106919612A (zh) | 一种上线结构化查询语言脚本的处理方法及装置 | |
CN105095091B (zh) | 一种基于倒排索引技术的软件缺陷代码文件定位方法 | |
CN103164393B (zh) | 报表公式处理方法和系统 | |
CN107797916A (zh) | Ddl语句审核方法和装置 | |
CN102298681B (zh) | 一种基于数据流切片的软件识别方法 | |
Solanki et al. | Comparative study of software clone detection techniques | |
CN106294139B (zh) | 一种软件代码中重复片段的检测提取方法 | |
CN103729343A (zh) | 基于百科链接共现的语义消岐方法 | |
CN106547765A (zh) | 基于sql的数据库管理方法及装置 | |
Shrestha et al. | SLNET: A redistributable corpus of 3rd-party Simulink models | |
Zhang et al. | Permission set mining: Discovering practical and useful roles | |
CN102710833A (zh) | 一种手机测试用例及其自动生成方法 | |
CN112433753A (zh) | 基于参数信息的接口文档生成方法、装置、设备和介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20161109 |