CN106991050A - 一种静态测试空指针引用缺陷假阳性识别方法 - Google Patents
一种静态测试空指针引用缺陷假阳性识别方法 Download PDFInfo
- Publication number
- CN106991050A CN106991050A CN201710216872.5A CN201710216872A CN106991050A CN 106991050 A CN106991050 A CN 106991050A CN 201710216872 A CN201710216872 A CN 201710216872A CN 106991050 A CN106991050 A CN 106991050A
- Authority
- CN
- China
- Prior art keywords
- npd
- defect
- defects
- static test
- attribute
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3692—Test management for test results analysis
Abstract
一种静态测试空指针引用缺陷假阳性识别方法,针对软件静态测试空指针引用缺陷假阳性问题,提取待测程序静态测试缺陷报告和软件历史仓库中的空指针引用缺陷知识;通过空指针引用缺陷模式提取空指针引用缺陷引发条件并与空指针引用缺陷知识对比,确定空指针引用缺陷关联属性组,构造空指针引用缺陷数据集;通过基于粗糙集理论属性重要性的ID3算法分类空指针引用缺陷数据集,用分类结果进行空指针引用缺陷假阳性识别,确认真实空指针引用缺陷。本发明结合空指针引用缺陷知识和基于粗糙集理论属性重要性的ID3分类算法进行静态测试空指针引用缺陷假阳性识别,提高了静态测试空指针引用缺陷检测效率和稳定性,降低了空指针引用缺陷确认开销。
Description
技术领域
本发明属于软件测试技术领域,特别是在静态测试技术领域,用于进行静态测试中空指针引用缺陷假阳性识别,降低空指针引用缺陷确认开销,提高了静态测试空指针引用缺陷检测效率和稳定性,是一种静态测试空指针引用缺陷优化方法。
背景技术
软件测试是一种保障软件质量的过程,旨在尽早尽可能的发现软件缺陷,降低测试成本。在静态测试过程中,测试人员通过检查源程序的文法、结构、过程、接口等而不运行程序来找出程序中可能导致缺陷的结构异常、数据流异常等。现有的静态测试研究通常分为两大类:静态测试过程中的缺陷定位、静态测试优化。在过去的几年中,静态测试研究主要集中在测试过程中的缺陷定位,其主要任务是如何在静态测试过程中精益求精尽可能提升缺陷定位的正确率,保证软件质量,然而静态测试过程往往会在分析精度和检测时间中寻求平衡,大多数语义类缺陷模式的检测存在假阳性。
静态测试优化是指根据静态测试过程中的相关信息在自动化静态测试工具运行后进行缺陷检测优化,其从另一个角度提升了静态测试工具的检测效率和精度,但需要在测试后对检测的缺陷进行确认。静态测试优化主要针对缺陷定位中的假阳性缺陷。与传统人工审查不同,静态测试优化强调借助自动化静态测试工具进行缺陷检测和缺陷确认辅助检测待测代码,以期提高检测效率并降低缺陷确认开销。当前的静态测试优化主要基于扩增缺陷模式库、缺陷关联等静态测试优化技术,大体上可以分为两类:第1类是面向行为的静态测试优化技术,即在测试过程中分析代码的抽象解释推断代码的执行动作;第2类是面向缺陷模式的静态测试优化技术,即分析测试代码可疑语句与缺陷模式的吻合度。
已有的静态测试优化方法以自动化静态测试工具为基础对检测出的空指针引用(Null Pointer Dereference,NPD)缺陷进行优化,这些工具主要依赖类型推导、抽象解释、符号执行等传统生技术在测试过程中搜集相关缺陷信息,限制条件多且缺陷检测后会生成大量假阳性NPD缺陷。
因此,本发明提出NPD缺陷知识和基于粗糙集理论属性重要性的ID3分类算法(Rough Set ID3,RSID3)结合的静态测试空指针引用缺陷优化方法,能够有效识别静态测试过程中的假阳性NPD缺陷,是一种静态测试空指针引用缺陷优化方法。
发明内容
本发明解决的问题:克服动态测试方法很难设计出覆盖率高的测试用例来检测Java项目中的NPD缺陷,而自动化静态测试工具会报告大量假阳性NPD缺陷的不足,首次利用NPD缺陷知识,将数据挖据中RSID3分类算法应用于静态测试NPD缺陷假阳性识别问题,提供一种利用已有NPD缺陷知识判定假阳性NPD缺陷,降低NPD缺陷确认开销,提高静态测试NPD缺陷检测效率和稳定性的静态测试空指针引用缺陷识别方法。
本发明的技术方案:一种静态测试空指针引用缺陷假阳性识别方法,其特点在于主要包括以下步骤:
(1)针对程序P使用静态测试工具进行静态测试后生成的.xml格式的静态测试缺陷报告SR,SR是由不同级别元素组成的结构化数据存储文件,所有元素都有文本内容和属性,所有元素都有子元素,将与缺陷相关的内容包含在元素中,SR使用一系列标记描述数据,通过开始标记和结束标记限定元素在SR中描述缺陷内容的范围,解析静态测试缺陷报告SR中包含空指针引用(Null Pointer Dereference,NPD)缺陷内容的所有元素的文本内容,获取元素的属性及属性值并直接存储在.csv格式的二维表中,二维表的列为属性,二维表的行为属性值,将二维表中的内容作为SR中的NPD缺陷知识RKNPD;
(2)代码修改和修改日志均与软件缺陷存在关联,挖掘软件历史仓库中所有的代码修改,修改日志内容由多条记录构成,每条记录主要包括五种属性,分别为本次代码修改对象中的NPD缺陷是否真实、代码修改对象中的NPD缺陷是否修复、版本号、修改人员、修改时间,通过从修改日志中搜索修复NPD缺陷的关键词,可以从所有代码修改中识别出修复NPD缺陷的代码修改,然后通过分析源程序中引发NPD缺陷的程序点L处第1次代码修改到第(n-1)次代码修改,从修复程序点L处NPD缺陷的第n次代码修改的修改日志中提取修复NPD缺陷的记录,获取记录的属性及属性值并直接存储在.csv格式的二维表中,二维表的列为属性,二维表的行为属性值,将二维表中的内容作为软件历史仓库中的NPD缺陷知识HKNPD;
(3)NPD缺陷模式用NPD缺陷有限状态机MNPD表示为:
MNPD=<S,T,C>
其中,S={Sstart,Snot,Spossible,Snpddefect,Send}是MNPD所有可达状态集,Sstart仅有入口,Send是仅有出口,Snot和Spossible分别代表非空状态和可能为空状态,Snpddefect是引发NPD缺陷时的状态,与NPD缺陷模式有关,全部MNPD都有的状态集T为{Sstart,Snpddefect,Send},T={<ni,nj>|ni,nj∈S}是状态迁移集,指MNPD从状态ni迁移到状态nj,T:S×C→S,C是状态迁移条件;NPD缺陷仅与指针的指向有关,指针的指向状态包括空、非空和可能为空三种状态,其中,空状态会引发NPD缺陷,非空状态不会引发NPD缺陷,可能为空状态可能会引发NPD缺陷,根据程序P语义知识中引发NPD缺陷程序点L处指针的指向状态对每个被引用的指针构造MNPD实例,引发NPD缺陷对象X指X的状态从始态Sstart经一系列状态迁移到达末态Snpddefect,在MNPD实例上进行状态迁移到达状态Snpddefect时,通过分析P执行到引发NPD缺陷的程序点L处的程序状态信息,这里的程序状态信息包括对象X取值信息ρ(L,X)、P执行到L处时被调方法之间的调用关系及执行顺序和引发NPD缺陷的指针的解引用位置,根据引发NPD缺陷时X在MNPD上的迁移过程确定NPD缺陷的具体模式,得到NPD缺陷模式集M* NPD=<S*,T*, 其中,NPD缺陷模式表示局部变量为空,NPD缺陷模式表示全局变量为空,NPD缺陷模式表示函数形参为空,NPD缺陷模式表示函数实参为空,NPD缺陷模式表示函数返回值为空;
(4)通过NPD缺陷状态迁移集描述M* NPD中的NPD缺陷模式,由于引发NPD缺陷的对象X从始态Sstart到达末态Snpddefect的状态迁移不同,识别M* NPD中各NPD缺陷模式的NPD缺陷需要满足的条件,即NPD缺陷引发条件不同,使对象X在NPD缺陷有限状态机MNPD实例上进行迁移,根据X到达状态Snpddefect时状态迁移集中的状态迁移T和迁移条件C提取M* NPD中各模式对应NPD缺陷引发条件DCNPD *,则DCNPD *=(Vlocal=nullMay)||(Vglobal=nullMay)||(FPfunction=nullMay)||(APfunction=null)||(RVmethod=nullMay),将NPD缺陷知识RKNPD和NPD缺陷知识HKNPD分别与NPD缺陷引发条件DCNPD *进行对比,这里的NPD缺陷知识RKNPD和NPD缺陷知识HKNPD分别从静态测试缺陷报告SR和软件历史仓库两个角度提取,确定一组包含NPD缺陷引发条件的NPD缺陷关联属性,NPD缺陷关联属性组包括属性type、属性priority、属性role、属性category、属性is-fixed、属性is-true,其中,属性type指定NPD缺陷引发原因,属性priority指定NPD缺陷优先级,属性role指定引发NPD缺陷时状态信息,取决于NPD缺陷条件,属性category指定NPD缺陷类别,属性is-fixed说明NPD缺陷是否修复,属性is-true说明NPD缺陷的真实性;
(5)一组NPD缺陷关联属性的对应取值为一个NPD缺陷实例,一个NPD缺陷实例与程序P在静态测试过程中检测出的某个NPD缺陷对应,累积程序P中所有NPD缺陷实例,即直到对每个NPD缺陷实例都存在程序P在静态测试过程中检测出的一个NPD缺陷与之对应,以NPD缺陷关联属性组和NPD缺陷实例为基本分量,构造覆盖程序P中所有NPD缺陷实例的二维表,二维表的列代表NPD缺陷关联属性,二维表的行代表NPD缺陷实例,此步骤构造NPD缺陷数据集时,NPD缺陷数据集的基本分量中的NPD缺陷关联属性是离散型描述属性,对SR中指定引发NPD缺陷优先级的NPD缺陷关联属性priority的属性值1、2、3、分别用high、middle、low三个级别表示,进行离散化处理,将描述NPD缺陷关联属性间关系的二维表作为NPD缺陷数据集;
(6)对NPD缺陷数据集利用基于粗糙集理论属性重要性的ID3分类算法进行分类,分类结果有两种,一种是真实NPD缺陷实例,另一种是假阳性NPD缺陷实例,根据NPD缺陷实例分类结果对程序P在静态测试过程中检测出的NPD缺陷进行NPD缺陷假阳性识别,通过识别出的假阳性NPD缺陷确认程序P在静态测试过程中检测出的真实NPD缺陷。
本发明的特点在于:(1)提出了利用静态测试缺陷报告中NPD缺陷知识并结合软件历史仓库中的NPD缺陷知识进行静态测试中NPD缺陷的假阳性识别;(2)结合NPD缺陷有限状态机确定了造成NPD缺陷模式中引发NPD缺陷时状态差异的原因——NPD缺陷引发条件,确定NPD缺陷数据集的基本分量,构造NPD缺陷数据集;(3)将数据挖掘RSID3分类算法应用于静态测试进行NPD缺陷假阳性识别,实验表明,本发明能够以较低的代价更稳定的进行NPD缺陷假阳性识别。
本发明通过获取并解析静态测试缺陷报告,提取静态测试缺陷报告和软件历史仓库中的NPD缺陷知识;用NPD缺陷有限状态机来表示NPD缺陷模式,通过NPD缺陷模式提取NPD缺陷引发条件并与NPD缺陷知识对比,确定包含NPD缺陷引发条件的一组NPD缺陷关联属性,然后以NPD缺陷关联属性组和NPD缺陷实例为基本分量构造NPD缺陷数据集;通过RSID3算法分类NPD缺陷数据集中NPD缺陷实例,根据分类结果对程序P在静态测试过程中检测出的NPD缺陷进行NPD缺陷假阳性识别。该静态测试空指针引用缺陷假阳性识别方法,可以应用于程序静态测试中假阳性NPD缺陷识别,降低NPD缺陷确认开销,提高静态测试NPD缺陷检测效率和稳定性。
附图说明
图1是本发明的流程图
图2是检测出的某个NPD缺陷所在程序代码简化图
图3为缺陷报告组织结构图
图4引发NPD缺陷的程序点L1处代码修改历史情况
图5NPD缺陷有限状态机实例状态迁移图
图6利用本发明进行静态测试NPD缺陷假阳性识别的NPD缺陷假阳性降低率变化情况
图7NPD缺陷确认效率变化情况
具体实施方式
以程序P在静态测试过程中检测的某个NPD缺陷为例,结合图1具体说明本发明的静态测试NPD缺陷假阳性识别方法的实施方式。
(1)针对程序P使用静态测试工具进行静态测试后生成的.xml格式的静态测试缺陷报告SR,SR是由不同级别元素组成的结构化数据存储文件,所有元素都有文本内容和属性,所有元素都有子元素,将与缺陷有关的内容包含在元素中,SR使用一系列标记描述数据,通过开始标记和结束标记限定元素在SR中描述缺陷内容的范围,图2代码段所在程序P执行到L1处时引发了一个NPD缺陷为图3是对程序P生成的静态测试缺陷报告SR的组织结构,在示例中,SR将程序P在静态测试过程中检测出的某个缺陷的相关内容用BugInstance元素包含,并通过开始标记<BugInstance>和结束标记</BugInstance>限定BugInstance元素描述缺陷内容的范围,可以通过解析包含NPD缺陷内容的BugInstance元素的文本内容方便的获取示例程序SR中的NPD缺陷知识,图3静态测试缺陷报告SR中标记内容的元素及其说明如表1所示;
表1标记NPD缺陷内容的元素及其说明
标记NPD缺陷内容的元素 | 说明 |
BugInstance | 标记NPD缺陷相关内容的元素 |
Class | 标记引发NPD缺陷时所在类相关内容的子元素 |
Method | 标记引发NPD缺陷时所在方法相关内容的子元素 |
LocalVariable | 标记引发NPD缺陷时变量相关内容的子元素 |
SourceLine | 标记引发NPD缺陷时对应源码中位置的子元素 |
针对图2程序P执行到L1处检测出的通过Dom4j解析图3静态测试缺陷报告SR中标记内容的所有元素的文本内容,获取表1所有元素的全部属性和属性值按表2格式直接存储在.csv格式的二维表中,表2仅列举标记内容的元素的属性和属性值,其余包含NPD缺陷内容的元素的属性和属性值存储格式与表2保持一致,将二维表中的内容作为SR中的NPD缺陷知识
表2缺陷报告中的NPD缺陷知识
属性 | type | priority | rank | abbrev | role | category |
属性值 | path-exception | 2 | 11 | np | Vlocal-null | correctness |
(2)代码修改和修改日志均与软件缺陷存在关联,挖掘软件历史仓库中所有的代码修改,代码修改一般分为buggy代码修改和clean代码修改两类,buggy代码修改会产生缺陷,clean代码修改不会产生缺陷,通过对软件历史仓库中的软件版本控制系统SVN进行签出svn checkout命令操作和查看日志svn logt命令操作,使用签出命令抽取软件历史仓库中所有代码修改,使用查看日志命令查看日志内容,日志内容由多条记录构成,每条记录主要包括本次代码修改对象中的NPD缺陷是否修复、代码修改对象中的NPD缺陷是否真实、版本号、修改人员、修改时间五种属性,通过从修改日志搜索Null Pointer DereferenceBug、Null Pointer Dereference Fixed、Null Pointer Dereference defect和NPD四种修复NPD缺陷的关键词,可以从所有代码修改中识别出修复的代码修改,通过分析代码修改中图4引发的程序点L1处修改历史,从修复的代码修改处开始往回追溯,能识别出buggy代码修改和clean代码修改,在程序P的代码修改中,这里的代码修改包括clean代码修改和buggy代码修改,通过分析源程序中引发的程序点L1处第1次代码修改到第(n-1)次代码修改,从修复程序点L1处的第n次代码修改的修改日志中提取修复的记录,获取记录的属性及属性值,其中,属性包括is-fixed、is-true、version、person、time,属性值分别为N、Y、13、Lisa、time并按表3格式直接存储在.csv格式的二维表中,二维表的列为属性,二维表的行为属性值,将二维表中的内容作为软件历史仓库中的NPD缺陷知识
表3软件历史仓库中的NPD缺陷知识
属性 | is-fixed | is-true | version | person | time |
属性值 | Y | no | 13 | Lisa | 2010-03-14 |
步骤(2)在程序P的buggy代码修改中由于修复程序点L处NPD缺陷的第n次代码修改会产生新的缺陷,这种情况视为修改对象中的NPD缺陷没有被修复。
(3)NPD缺陷模式用NPD缺陷有限状态机MNPD表示为:
MNPD=<S,T,C>
其中,S={Sstart,Snot,Spossible,Snpddefect,Send}是MNPD所有可达状态集,Sstart仅有入口,Send是仅有出口,Snot和Spossible分别代表非空状态和可能为空状态,是引发NPD缺陷时的状态,与NPD缺陷模式有关,全部MNPD都有的状态集T为T={<ni,nj>|ni,nj∈S}是状态迁移集,指MNPD从状态ni迁移到状态nj,T:S×C→S,C是状态迁移条件;
NPD缺陷仅与指针的指向有关,指针的指向状态包括空、非空和可能为空三种状态,其中,空状态会引发NPD缺陷,非空状态不会引发NPD缺陷,可能为空状态可能会引发NPD缺陷,根据程序P语义知识中引发NPD缺陷程序点L处指针的指向状态对每个被引用的指针构造MNPD实例,引发对象obj1指obj1的状态从始态Sstart经一系列状态迁移到达末态MNPD实例状态迁移如图5所示,图2程序P简化代码段包含method1、method2、method3和method4四个基本方法,1个构造方法foo和一个main方法且P执行到L1处时引发了obj1在MNPD实例上进行状态迁移到达状态程序P执行到L1处时并未提供对的处理程序,P立即终止运行并将与引发相关的程序状态信息保存在实时堆栈中,利用程序调试接口,将当前实时堆栈信息输出到外部文件,实时堆栈信息如下:
exception in thread"main"java.lang.nullpointer exception
at cn.edu.cumt.slicer4j.test.foo.method1(foo.java:9)
at cn.edu.cumt.slicer4j.test.foo.method4(foo.java:18)
at cn.edu.cumt.slicer4j.test.foo.main(foo.java:25)
上述信息表明,程序P执行到L1处时引发了并依次保存的是P执行method1、method4和main三个方法之间的调用关系及执行顺序,由于main方法在L2处调用方法method4,method4在L3处调用方法method1,而method1执行L1处的语句时,对象obj1值为null,从而引发了根据此时obj1在MNPD上的迁移过程Sstart→Spossible→Snpddefect→Send,确定的缺陷模式表示局部变量为null,与上述状态迁移相同的NPD缺陷均可用模式表示;
(4)通过NPD缺陷状态迁移集描述M* NPD中的NPD缺陷模式,给定NPD缺陷状态集S={t1,t2,t3,t4,t5},状态t1,t2,t3,t4,t5分别代表始态sstart、非空状态snot、可能为空状态spossible、引发NPD缺陷的状态snpddefect,即空状态,结束状态send,结合图5NPD缺陷有限状态机MNPD实例状态迁移,通过表4NPD缺陷状态迁移集描述M* NPD中的NPD缺陷模式,其状态迁移T和迁移条件C需结合程序相关状态信息分析后设定,生成NPD缺陷状态迁移集;
表4 NPD缺陷状态迁移集
迁移关系顺序 | 状态迁移(T) | 迁移条件(C) |
T1 | t1×C2→t2 | C2:obj1作用域内且obj1=not |
T2 | t1×C1→t3 | C1:obj1作用域内且obj1=possible |
T3 | t2×C1→t3 | C1:obj1=possible |
T4 | t3×C2→t2 | C2:obj1=not |
T5 | t3×C3→t4 | C3:调用obj1且obj1=possible |
T6 | t3×C4→t5 | C4:超出obj1作用范围 |
T7 | t4×C5→t5 | C5:自动迁移,无条件 |
T8 | t2×C4→t5 | C4:超出obj1作用范围 |
T9 | t1×C6→t1,t2×C6→t2,t3×C6→t3 | C6:其他 |
使引发的对象obj1在图5有限状态机MNPD实例上进行迁移,obj1到达状态时的状态迁移为T2,根据T2中的T和C,提取识别模式的的NPD缺陷引发条件将NPD缺陷知识和NPD缺陷知识分别与进行对比,确定一组包含的NPD缺陷关联属性,对应NPD缺陷关联属性及其说明如表5所示,此时关联属性中的role属性取决于NPD缺陷引发条件
表5 NPD缺陷关联属性及其说明
(5)一组NPD缺陷关联属性的对应取值为一个NPD缺陷实例,一个NPD缺陷实例与程序P在静态测试过程中检测出的某个NPD缺陷对应,累积程序P中所有NPD缺陷实例,即直到对每个NPD缺陷实例都存在程序P在静态测试过程中检测出的一个NPD缺陷与之对应,以NPD缺陷关联属性组和NPD缺陷实例为基本分量,构造覆盖程序P中所有NPD缺陷实例的二维表,二维表的列代表NPD缺陷关联属性,二维表的行代表NPD缺陷实例,将描述NPD缺陷关联属性间关系的二维表作为NPD缺陷数据集如表6所示,表6中NPD缺陷实例1对应程序P在静态测试过程中执行到程序点L1处检测出的NPD缺陷
表6 NPD缺陷数据集
序号 | type(a1) | priority(a2) | role(a3) | category(a4) | is-fixed(a5) | is-true(d) |
1 | path-exception | middle | Vlocal-null | correctness | Y | no |
2 | param-deref | high | FPfunction-null | bad-practice | N | yes |
3 | path-exception | low | Vlocal-null | correctness | Y | no |
(6)对程序P构造的表6所示NPD缺陷数据集利用RSID3分类算法进行分类,分类结果有两种:NPD缺陷实例2是真实NPD缺陷实例,NPD缺陷实例1和NPD缺陷实例3是假阳性NPD缺陷实例,根据上述NPD缺陷实例分类结果识别出程序P在静态测试过程中检测出的NPD缺陷中的假阳性NPD缺陷为NPD缺陷实例1和NPD缺陷实例3对应的NPD缺陷,确认程序P在静态测试过程中检测出的真实NPD缺陷为NPD缺陷实例2对应的NPD缺陷,减少了2个NPD缺陷的确认工作,使NPD缺陷的确认开销降低,随着待测程序中检测出的NPD缺陷数量的增加,降低NPD缺陷确认开销的效果会更加明显,从而使静态测试NPD缺陷检测效率提高。
本发明涉及的RSID3分类算法的基本思想是以覆盖程序P中所有NPD缺陷实例的描述NPD缺陷关联属性间关系的二维表为输入指导划分属性的选择,根据属性重要性调整NPD缺陷关联属性信息增益并通过为NPD缺陷数据集D和NPD缺陷关联属性集A建立的索引数组遍历D和A,平衡算法搜索效率,最终达到准确分类NPD缺陷的目的。
在步骤(6)中利用RSID3分类算法作用于NPD缺陷数据集进行NPD缺陷分类的主要过程如下:
①设划分元组S=(D,C,Ak,V,f),其中,D是数据集,R=C∪Ak,C是条件属性集,Ak是划分属性集,V是所有属性取值集合,f是D中每个数据到属性值的映射函数,f:D*A→V,Card(D)是模糊集标准函数,指D中数量,posA(Ak)是粗糙集标准正域函数。NPD缺陷数据集D如表6所示,NPD缺陷关联属性集A={a1,a2,a3,a4,a5,d},为D和A建立索引数组,从D中任一数据的任一属性ai∈A索引开遍历,将d设为初始划分属性集Ak={d}。
②根据当前划分属性Ak对当前NPD缺陷关联属性集A的依赖度,自适应调整RSID3分类算法NPD缺陷关联属性集A中NPD缺陷关联属性a4对划分属性Ak的重要性γ(a4),其具体的调整方法为:
首先计算划分属性Ak对当前NPD缺陷关联属性集A的依赖度k(A,Ak)调整方案如下:
(a)若k(A,Ak)=0时,则认为Ak完全不依赖于A;
(b)若0<k(A,Ak)<1时,则认为Ak部分依赖于A;
(c)若k(A,Ak)=1时,Ak完全依赖于A。
显然0≤k(A,Ak)≤1,而Card(posA(Ak))={1,2},则Ak部分依赖于A,然后结合各数据属性取值和k(A,Ak)调整a4∈A对划分属性Ak的重要性γ(a4,A,Ak)表明将NPD缺陷关联属性a4从A中去掉后对NPD缺陷分类的影响程度,也就是将属性a4从A中去除后被分类错误的概率,即a4∈A对Ak的重要性。最后将γ(ai)作用于按某NPD缺陷关联属性划分后NPD缺陷数据集信息熵并结合当前NPD缺陷数据集信息熵调整NPD缺陷关联属性信息增益方程为:
其中,I(s1,...,sm)是当前NPD缺陷数据集信息熵;是按某NPD缺陷关联属性划分后NPD缺陷数据集信息熵;是NPD缺陷数据子集sj信息熵。
③根据NPD缺陷关联属性信息增益方程计算继续搜索Gain(A)Max对应的属性索引,若则Ak+1更新为新的划分属性,删除其NPD缺陷数据集索引和属性索引并更新索引数组。
通过以上过程可以实现软件静态测试的NPD缺陷假阳性识别,利用结合NPD缺陷知识和基于RSID3分类算法的NPD缺陷假阳性识别方法对9个典型的Java开源项目执行上述过程,基准程序基本信息如表7所示,包括基准程序名称、含NPD缺陷的源文件数、含NPD缺陷的源代码行数和NPD缺陷数据集实例数,记录基准程序的NPD缺陷总数、NPD缺陷降低数并计算NPD缺陷假阳性降低率,结果如表8所示。
表7基准程序基本信息
基准程序名称 | 含NPD缺陷源文件数 | 含NPD缺陷源代码行数 | NPD缺陷数据集实例数 |
Jstock-1.0.4 | 8 | 2136 | 29 |
Weka-3-6 | 17 | 6448 | 32 |
SweetHome3D-1.8 | 11 | 2710 | 70 |
Robocode-1.6 | 21 | 3014 | 69 |
Freemind-0.8.1 | 35 | 7329 | 95 |
MegaMek0.41.23 | 18 | 19943 | 31 |
MegaMek0.41.24 | 16 | 18713 | 26 |
MegaMek0.41.25 | 21 | 20784 | 37 |
MegaMek0.41.26 | 23 | 20800 | 34 |
表8 NPD缺陷假阳性识别结果表
程序 | NPD缺陷总数 | NPD缺陷降低数 | NPD缺陷假阳性降低率(%) |
Jstock-1.0.4 | 142 | 3 | 10.3 |
Weka-3-6 | 271 | 8 | 25.0 |
Sweethome3D-1.8 | 156 | 13 | 18.6 |
Robocode-1.6 | 265 | 17 | 24.6 |
Freemind-0.8.1 | 335 | 19 | 20.0 |
MegaMek0.41.23 | 151 | 11 | 35.5 |
MegaMek0.41.24 | 113 | 9 | 34.6 |
MegaMek0.41.25 | 151 | 13 | 35.1 |
MegaMek0.41.26 | 151 | 12 | 35.3 |
从中可以看出,利用本发明所述的方法对NPD缺陷进行假阳性识别后,能检测出较少的NPD缺陷,将原来使用自动化静态测试工具检测出的NPD缺陷数量降低,通过其假阳性降低率可以看出NPD缺陷假阳性识别效果好。
图6给出通过本发明进行静态测试NPD缺陷假阳性识别的NPD缺陷假阳性降低率变化情况,可知本发明方法在NPD缺陷假阳性识别过程中其NPD缺陷假阳性降低率最高为35.5%且在MegaMek项目各版本中NPD缺陷假阳性降低率基本稳定在35%。综合分析表8、图6结果说明该方法NPD缺陷检测效率好。
目前FindBugs是检测Java项目中NPD缺陷的主流自动化静态测试工具,分别使用本发明和基FindBugs的方法统计静态测试过程中的真实NPD缺陷,从表8可以计算出两种方法在静态测试过程中过程中检测出的真实NPD缺陷的标准差分别为19.74和23.21,说明该方法稳定性好。
图7以各基准程序为例,给出NPD缺陷确认效率变化情况,可知通过本发明方法进行NPD缺陷假阳性识别后NPD缺陷确认效率均值为82%,表明本发明方法在静态测试NPD缺陷后较快的确认了真实NPD缺陷,使静态测试后NPD缺陷确认开销降低了。
通过上述过程可以实现对自动化工具在静态测试过程中产生的假阳性NPD缺陷进行识别。该实例分析表明,相同条件下,在使用自动化静态测试工具进行静态测试产生大量NPD缺陷的情况下,首先实施NPD缺陷的假阳性识别,不仅可以有效降低静态测试后NPD缺陷确认开销,还可以提高静态测试NPD缺陷检测效率和稳定性。
Claims (4)
1.一种静态测试空指针引用缺陷假阳性识别方法,其特征在于包括以下步骤:
(1)针对程序P使用静态测试工具进行静态测试后生成的.xml格式的静态测试缺陷报告SR,SR是由不同级别元素组成的结构化数据存储文件,所有元素都有文本内容和属性,所有元素都有子元素,将与缺陷相关的内容包含在元素中,SR使用一系列标记描述数据,通过开始标记和结束标记限定元素在SR中描述缺陷内容的范围,解析静态测试缺陷报告SR中包含空指针引用(Null Pointer Dereference,NPD)缺陷内容的所有元素的文本内容,获取元素的属性及属性值并直接存储在.csv格式的二维表中,二维表的列为属性,二维表的行为属性值,将二维表中的内容作为SR中的NPD缺陷知识RKNPD;
(2)代码修改和修改日志均与软件缺陷存在关联,挖掘软件历史仓库中所有的代码修改,修改日志内容由多条记录构成,每条记录主要包括五种属性,分别为本次代码修改对象中的NPD缺陷是否真实、代码修改对象中的NPD缺陷是否修复、版本号、修改人员、修改时间,通过从修改日志中搜索修复NPD缺陷的关键词,可以从所有代码修改中识别出修复NPD缺陷的代码修改,然后通过分析源程序中引发NPD缺陷的程序点L处第1次代码修改到第(n-1)次代码修改,从修复程序点L处NPD缺陷的第n次代码修改的修改日志中提取修复NPD缺陷的记录,获取记录的属性及属性值并直接存储在.csv格式的二维表中,二维表的列为属性,二维表的行为属性值,将二维表中的内容作为软件历史仓库中的NPD缺陷知识HKNPD;
(3)NPD缺陷模式用NPD缺陷有限状态机MNPD表示为:
MNPD=<S,T,C>
其中,S={Sstart,Snot,Spossible,Snpddefect,Send}是MNPD所有可达状态集,Sstart仅有入口,Send是仅有出口,Snot和Spossible分别代表非空状态和可能为空状态,Snpddefect是引发NPD缺陷时的状态,与NPD缺陷模式有关,全部MNPD都有的状态集T为{Sstart,Snpddefect,Send},T={<ni,nj>|ni,nj∈S}是状态迁移集,指MNPD从状态ni迁移到状态nj,T:S×C→S,C是状态迁移条件;NPD缺陷仅与指针的指向有关,指针的指向状态包括空、非空和可能为空三种状态,其中,空状态会引发NPD缺陷,非空状态不会引发NPD缺陷,可能为空状态可能会引发NPD缺陷,根据程序P语义知识中引发NPD缺陷程序点L处指针的指向状态对每个被引用的指针构造MNPD实例,引发NPD缺陷对象X指X的状态从始态Sstart经一系列状态迁移到达末态Snpddefect,在MNPD实例上进行状态迁移到达状态Snpddefect时,通过分析P执行到引发NPD缺陷的程序点L处的程序状态信息,这里的程序状态信息包括对象X取值信息ρ(L,X)、P执行到L处时被调方法之间的调用关系及执行顺序和引发NPD缺陷的指针的解引用位置,根据引发NPD缺陷时X在MNPD上的迁移过程确定NPD缺陷的具体模式,得到NPD缺陷模式集 其中,NPD缺陷模式表示局部变量为空,NPD缺陷模式表示全局变量为空,NPD缺陷模式表示函数形参为空,NPD缺陷模式表示函数实参为空,NPD缺陷模式表示函数返回值为空;
(4)通过NPD缺陷状态迁移集描述M* NPD中的NPD缺陷模式,由于引发NPD缺陷的对象X从始态Sstart到达末态Snpddefect的状态迁移不同,识别M* NPD中各NPD缺陷模式的NPD缺陷需要满足的条件,即NPD缺陷引发条件不同,使对象X在NPD缺陷有限状态机MNPD实例上进行迁移,根据X到达状态Snpddefect时状态迁移集中的状态迁移T和迁移条件C提取M* NPD中各模式对应NPD缺陷引发条件DCNPD *,则DCNPD *=(Vlocal=nullMay)||(Vglobal=nullMay)||(FPfunction=nullMay)||(APfunction=null)||(RVmethod=nullMay),将NPD缺陷知识RKNPD和NPD缺陷知识HKNPD分别与NPD缺陷引发条件DCNPD *进行对比,确定一组包含NPD缺陷引发条件的NPD缺陷关联属性,NPD缺陷关联属性组包括属性type、属性priority、属性role、属性category、属性is-fixed、属性is-true,其中,属性type指定NPD缺陷引发原因,属性priority指定NPD缺陷优先级,属性role指定引发NPD缺陷时状态信息,取决于NPD缺陷条件,属性category指定NPD缺陷类别,属性is-fixed说明NPD缺陷是否修复,属性is-true说明NPD缺陷的真实性;
(5)一组NPD缺陷关联属性的对应取值为一个NPD缺陷实例,一个NPD缺陷实例与程序P在静态测试过程中检测出的某个NPD缺陷对应,累积程序P中所有NPD缺陷实例,即直到对每个NPD缺陷实例都存在程序P在静态测试过程中检测出的一个NPD缺陷与之对应,以NPD缺陷关联属性组和NPD缺陷实例为基本分量,构造覆盖程序P中所有NPD缺陷实例的二维表,二维表的列代表NPD缺陷关联属性,二维表的行代表NPD缺陷实例,将描述NPD缺陷关联属性间关系的二维表作为NPD缺陷数据集;
(6)对NPD缺陷数据集利用基于粗糙集理论属性重要性的ID3分类算法进行分类,分类结果有两种,一种是真实NPD缺陷实例,另一种是假阳性NPD缺陷实例,根据NPD缺陷实例分类结果对程序P在静态测试过程中检测出的NPD缺陷进行NPD缺陷假阳性识别,通过识别出的假阳性NPD缺陷确认程序P在静态测试过程中检测出的真实NPD缺陷。
2.根据权利要求1所述的一种静态测试空指针引用缺陷假阳性识别方法,其特征在于:提高NPD缺陷知识的充分性从两个角度考虑,一个是静态测试缺陷报告中的NPD缺陷知识,另一个是软件历史仓库中的NPD缺陷知识,充分性好的NPD缺陷知识对程序在静态测试过程中检测出的NPD缺陷的引发条件达到较高的覆盖度,能够更准确的识别出假阳性NPD缺陷,因此本方法从以上两个角度提取NPD缺陷知识。
3.根据权利要求1所述的一种静态测试空指针引用缺陷假阳性识别方法,其特征在于:步骤(5)构造的NPD缺陷数据集的基本分量中的NPD缺陷关联属性是离散型描述属性,因此在构造NPD缺陷数据集时对静态测试缺陷报告中指定引发NPD缺陷优先级的NPD缺陷关联属性priority的属性值1、2、3、分别用high、middle、low三个级别表示,进行离散化处理。
4.根据权利要求1所述的一种静态测试空指针引用缺陷假阳性识别方法,其特征在于:该方法可以用于识别静态测试中假阳性NPD缺陷,降低NPD缺陷确认开销,提高静态测试NPD缺陷检测效率和稳定性。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710216872.5A CN106991050B (zh) | 2017-04-05 | 2017-04-05 | 一种静态测试空指针引用缺陷假阳性识别方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710216872.5A CN106991050B (zh) | 2017-04-05 | 2017-04-05 | 一种静态测试空指针引用缺陷假阳性识别方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106991050A true CN106991050A (zh) | 2017-07-28 |
CN106991050B CN106991050B (zh) | 2020-05-29 |
Family
ID=59416135
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710216872.5A Active CN106991050B (zh) | 2017-04-05 | 2017-04-05 | 一种静态测试空指针引用缺陷假阳性识别方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106991050B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111679983A (zh) * | 2020-06-08 | 2020-09-18 | 中国银行股份有限公司 | Java接口静态测试方法及装置 |
CN112783765A (zh) * | 2021-01-13 | 2021-05-11 | 北京轩宇信息技术有限公司 | 一种适用于指针的单元测试用例生成方法及装置 |
WO2023240589A1 (en) * | 2022-06-17 | 2023-12-21 | Nokia Shanghai Bell Co., Ltd. | Apparatus, method and computer program |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040264367A1 (en) * | 2003-06-26 | 2004-12-30 | Microsoft Corporation | Data flow chasing |
CN102508766A (zh) * | 2011-09-29 | 2012-06-20 | 中国航天科技集团公司第七一〇研究所 | 一种航天嵌入式c语言软件运行时错误的静态分析方法 |
CN102981953A (zh) * | 2012-11-12 | 2013-03-20 | 中国矿业大学 | 一种空指针异常的自动故障定位方法 |
CN103218296A (zh) * | 2013-04-22 | 2013-07-24 | 北京邮电大学 | 一种充分检测空指针引用缺陷的方法 |
-
2017
- 2017-04-05 CN CN201710216872.5A patent/CN106991050B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040264367A1 (en) * | 2003-06-26 | 2004-12-30 | Microsoft Corporation | Data flow chasing |
CN102508766A (zh) * | 2011-09-29 | 2012-06-20 | 中国航天科技集团公司第七一〇研究所 | 一种航天嵌入式c语言软件运行时错误的静态分析方法 |
CN102981953A (zh) * | 2012-11-12 | 2013-03-20 | 中国矿业大学 | 一种空指针异常的自动故障定位方法 |
CN103218296A (zh) * | 2013-04-22 | 2013-07-24 | 北京邮电大学 | 一种充分检测空指针引用缺陷的方法 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111679983A (zh) * | 2020-06-08 | 2020-09-18 | 中国银行股份有限公司 | Java接口静态测试方法及装置 |
CN111679983B (zh) * | 2020-06-08 | 2023-10-24 | 中国银行股份有限公司 | Java接口静态测试方法及装置 |
CN112783765A (zh) * | 2021-01-13 | 2021-05-11 | 北京轩宇信息技术有限公司 | 一种适用于指针的单元测试用例生成方法及装置 |
CN112783765B (zh) * | 2021-01-13 | 2024-02-09 | 北京轩宇信息技术有限公司 | 一种适用于指针的单元测试用例生成方法及装置 |
WO2023240589A1 (en) * | 2022-06-17 | 2023-12-21 | Nokia Shanghai Bell Co., Ltd. | Apparatus, method and computer program |
Also Published As
Publication number | Publication date |
---|---|
CN106991050B (zh) | 2020-05-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108932192B (zh) | 一种基于抽象语法树的Python程序类型缺陷检测方法 | |
US10347019B2 (en) | Intelligent data munging | |
CN101866317B (zh) | 一种基于聚类分析的回归测试用例选择方法 | |
US8676731B1 (en) | Data extraction confidence attribute with transformations | |
US20140046954A1 (en) | Software tool for creation and management of document reference templates | |
CN102063374A (zh) | 一种使用半监督信息进行聚类的回归测试用例选择方法 | |
KR101588027B1 (ko) | 소프트웨어 현지화를 위한 테스트 케이스 생성 장치 및 방법 | |
CN106355375B (zh) | 一种物料自动确认方法 | |
CN105824756B (zh) | 一种基于代码依赖关系的过时需求自动检测方法及系统 | |
CN109408385B (zh) | 一种基于缺陷规则和分类反馈的缺陷发现方法 | |
CN106991050A (zh) | 一种静态测试空指针引用缺陷假阳性识别方法 | |
CN112364352A (zh) | 可解释性的软件漏洞检测与推荐方法及系统 | |
CN111045670B (zh) | 一种二进制代码与源代码间复用关系的识别方法与装置 | |
Huang et al. | Towards smarter diagnosis: A learning-based diagnostic outcome previewer | |
CN107977454A (zh) | 双语语料清洗的方法、装置及计算机可读存储介质 | |
US7992126B2 (en) | Apparatus and method for quantitatively measuring the balance within a balanced scorecard | |
CN108228232B (zh) | 一种针对程序中循环问题的自动修复方法 | |
CN113886373A (zh) | 一种数据处理方法、装置及电子设备 | |
KR102411291B1 (ko) | 스마트공장 데이터 품질평가 방법 | |
CN110287114B (zh) | 一种数据库脚本性能测试的方法及装置 | |
CN105229494A (zh) | 属性重要性确定 | |
JP5940018B2 (ja) | データ名称抽出装置及びプログラム | |
CN114631122A (zh) | 半导体应用的协作学习模型 | |
US9753798B1 (en) | Method and apparatus for electronic design automation | |
CN117391643B (zh) | 一种基于知识图谱的医保单据审核方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |