CN114168478A - 一种基于多图多标记学习的软件Bug检测方法 - Google Patents

一种基于多图多标记学习的软件Bug检测方法 Download PDF

Info

Publication number
CN114168478A
CN114168478A CN202111514505.6A CN202111514505A CN114168478A CN 114168478 A CN114168478 A CN 114168478A CN 202111514505 A CN202111514505 A CN 202111514505A CN 114168478 A CN114168478 A CN 114168478A
Authority
CN
China
Prior art keywords
graph
mark
data
label
source code
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
Application number
CN202111514505.6A
Other languages
English (en)
Other versions
CN114168478B (zh
Inventor
印莹
赵宇海
任晨凤
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Northeastern University China
Original Assignee
Northeastern University China
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Northeastern University China filed Critical Northeastern University China
Priority to CN202111514505.6A priority Critical patent/CN114168478B/zh
Publication of CN114168478A publication Critical patent/CN114168478A/zh
Application granted granted Critical
Publication of CN114168478B publication Critical patent/CN114168478B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9024Graphs; Linked lists
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/22Matching criteria, e.g. proximity measures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/24Classification techniques
    • G06F18/241Classification techniques relating to the classification model, e.g. parametric or non-parametric approaches
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/20Natural language analysis
    • G06F40/237Lexical tools
    • G06F40/242Dictionaries
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/08Learning methods

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Artificial Intelligence (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Evolutionary Computation (AREA)
  • Software Systems (AREA)
  • Databases & Information Systems (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Health & Medical Sciences (AREA)
  • Bioinformatics & Cheminformatics (AREA)
  • Bioinformatics & Computational Biology (AREA)
  • Evolutionary Biology (AREA)
  • Computational Linguistics (AREA)
  • General Health & Medical Sciences (AREA)
  • Biophysics (AREA)
  • Computing Systems (AREA)
  • Mathematical Physics (AREA)
  • Audiology, Speech & Language Pathology (AREA)
  • Molecular Biology (AREA)
  • Biomedical Technology (AREA)
  • Quality & Reliability (AREA)
  • Computer Hardware Design (AREA)
  • Debugging And Monitoring (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种基于多图多标记学习的软件Bug检测方法,属于软件缺陷检测技术领域。该方法充分利用源代码中的图结构信息,并充分利用源代码和Bug报告之间深层次的语义关联,找到多图和多标记的对应关系,提供了基于程序源代码和对应Bug报告的多图多标记Bug检测数据的产生方法,将源代码和Bug报告转化为多图多标记数据来解决Bug的检测问题;并从图级和包级两个方面考虑,提出针对多图多标记数据的区分子图度量准则,进一步将多图多标记数据转化成计算机可以处理的向量形式的多示例多标记数据;传统的分类器链不能恰当地考虑标记排序问题,随机进行标记排列可能会造成性能下降,而本发明考虑了多标记之间的依赖关系可以极大地提高检测精度。

Description

一种基于多图多标记学习的软件Bug检测方法
技术领域
本发明属于软件缺陷检测技术领域,具体涉及一种基于多图多标记学习的软件Bug检测方法。
背景技术
由于软件缺陷是影响软件开发效率和软件质量的关键因素,软件缺陷发现成为了软件工程领域的热点问题,缺陷发现的目的是定位缺陷具体所在的源代码的位置(如组件、包、文件或代码行),进而引导开发人员及时消除缺陷,以提高软件开发效率和提升软件质量,节省软件开发成本。目前,在海量的代码仓库背景下,基于文本静态分析的软件缺陷检测方法受到了越来越多的关注。
基于文本静态分析的软件缺陷检测方法主要基于Bug报告和程序源代码两个语料库来进行缺陷发现。如Zhou等人提出的Bug检测方法是基于Bug报告和程序源代码两个语料库的,该方法在语料库中使用诸如停用词删除、词干提取等文本处理方法,进一步通过向量空间模型(rVSM)测量两个语料库的相似性,该方法准确性不高。Lukins等人提出基于方法级Bug检测方法,该方法以源代码中的方法为度量单位,使用停用词删除、词干处理等技术来处理源代码,最后,使用潜在语义索引(LSI)识别Bug报告和方法的概念之间的关系,进行缺陷发现。但该方法忽视了程序的结构信息,这使得缺陷检测的精度不高。Rahman S等人提出基于语句级的Bug检测方法,该方法从源代码中识别带有Bug的语句,对带缺陷语句的方法进行排序,对于每个排序的方法,构造一个方法级别的依赖图(MSDG),每个语句都是该图的一个节点,生成节点-先驱节点依赖关系图(NPDG)。该方法通过使用向量空间模型(VSM)在缺陷和NPDG中的每个节点之间测量相似度。该方法构建的节点依赖关系图只考虑了节点之间的执行顺序,没有考虑程序之间的数据依赖关系,会丢掉一些重要信息。综上,目前基于文本静态分析的缺陷检测方法存在以下不足:
1)、现有的缺陷检测技术大多关注于源代码语义信息的提取,没有充分利用程序的图结构信息。考虑到软件工程中的程序代码是带有执行依赖关系和数据依赖关系的图结构信息,这些图结构信息包含了程序语句之间的调用依赖关系和数据依赖关系,进而忽视了程序源代码和缺陷报告之间的深层次的语义关联,导致Bug检测的精度不高;
2)、没有充分考虑到程序代码的多Bug特性,一个项目的软件源代码中可能不仅仅包含一个Bug信息而是多个Bug信息同时存在,这就意味着缺陷检测不能仅仅局限于单bug检测问题,而是要考虑多Bug的检测问题。然而,目前考虑基于程序源代码的多Bug检测问题的研究较少。
发明内容
针对现有技术存在的不足,本发明提出一种基于多图多标记学习的软件Bug检测方法,旨在充分考虑源代码中的图结构信息和对应的多Bug标记,结合代码仓库中的Bug报告实现软件Bug的检测,以提高Bug检测的精度。
本发明的的技术方案为:
一种基于多图多标记学习的软件Bug检测方法,该方法包括以下步骤:
步骤1:基于程序源代码对应的Bug报告获得所述程序源代码的Bug多标记,从而生成程序源代码的多标记数据;
步骤2:生成程序源代码的多图数据MG,从而获得与程序源代码相对应的多图多标记数据;
步骤3:从步骤2获得的多图数据MG中挖掘频繁子图,获得频繁子图集frequencyG;
步骤4:从步骤3获得的频繁子图集frequencyG中筛选出能够区分不同标记的子图,将这些子图命名为区分子图,所有区分子图构成区分子图集featureG;
步骤5:基于步骤4获得的区分子图集featureG实现多图的向量化,将每个程序源代码文件对应的多图多标记数据转化成多示例多标记数据;
步骤6:将步骤5获得的多示例多标记数据退化为单示例多标记数据;
步骤7:利用步骤6获得的单示例多标记数据对神经元网络学习模型进行学习训练;
步骤8:将待检测的程序源代码输入到训练后的神经元网络学习模型中执行软件Bug检测,模型返回结果即为Bug检测结果。
进一步地,根据所述的基于多图多标记学习的软件Bug检测方法,所述的步骤1包括如下步骤:
步骤1-1:获取原始的程序源代码和对应的Bug报告,给定停用词表ST和标记个数L;
步骤1-2:初始化文本列表T1为空,初始化向量列表T2为空;
步骤1-3:根据停用词表ST将Bug报告中的停用词删除,将删除后剩下的词存入文本列表T1中,作为语料库;
步骤1-4:将T1中的单词构建成词典Dic并计算文本向量,且将文本向量存入向量列表T2中;
步骤1-5:计算T1中每个单词的TF-IDF值;
步骤1-6:根据每个单词的TF-IDF值、给定的标记个数L以及所述词典Dic和步骤1-4得到的向量列表T2,获得每个Bug报告对应的关键词信息,并以这些关键词作为对应程序源代码的Bug多标签,生成多标记数据D1。
进一步地,根据所述的基于多图多标记学习的软件Bug检测方法,所述生成程序源代码的多图数据MG的方法为:针对每一个程序源代码文件P,以方法为粒度,将每个方法均转换成对应的程序依赖图PDG,且由于一个方法对应一个程序依赖图,而一个源代码文件中包括很多方法,因此,一个程序源代码文件P对应一个图包Bag,从而获得该程序源代码文件P对应的多图数据MG。
进一步地,根据所述的基于多图多标记学习的软件Bug检测方法,使用gspan算法从步骤2获得的多图数据MG中挖掘频繁子图。
进一步地,根据所述的基于多图多标记学习的软件Bug检测方法,所述的步骤4包括如下步骤:
步骤4-1:输入步骤3得到的频繁子图集frequencyG和预期的区分子图个数k,k由用户指定;
步骤4-2:初始化区分子图集featureG为空,区分度阈值τ为0;
步骤4-3:遍历频繁子图集frequencyG,对于其中的每一个子图,若已选择的子图个数小于k或者该子图的区分度大于当前的区分度阈值τ,则将该频繁子图添加到区分子图集featureG中;若区分子图集featureG中的区分子图个数大于k,则剔除区分子图集featureG中区分度最小的子图,并将区分度阈值τ更新为当前区分子图集featureG中具有最小区分度的子图的区分度;
所述区分度阈值τ按照下式进行更新:
Figure BDA0003406321460000031
其中gi表示区分子图集featureG中的第i个子图;Ds表示区分度;
步骤4-4:返回区分子图集featureG。
进一步地,根据所述的基于多图多标记学习的软件Bug检测方法,所述区分度的计算公式如下:
Figure BDA0003406321460000032
上式中,m代表图包中的子图总数,k表示第k个子图;sij表示图包Bi和Bj的相似度;
Figure BDA0003406321460000033
Figure BDA0003406321460000034
Figure BDA0003406321460000035
是一个整体,它是图包B的向量化表示,表示图包B中是否包含子图gk,若包含,该值为1,否则该值为0;
Figure BDA0003406321460000041
表示图G中是否包含子图gk,若包含,该值为1,否则该值为0;Lr是图包的标记比。
进一步地,根据所述的基于多图多标记学习的软件Bug检测方法,基于步骤4获得的区分子图集featureG使用Graph2vec算法实现多图的向量化。
进一步地,根据所述的基于多图多标记学习的软件Bug检测方法,所述将步骤5获得的多示例多标记数据退化为单示例多标记数据的方法为:首先输入目标聚类簇数N和步骤5获得的多示例数据Bag={Y1,Y2..Yn},其中Y为一个示例包,包含多个示例;然后计算两两示例包之间的豪斯多夫距离;根据豪斯多夫距离对示例包进行聚类,将第i个示例包Yi到第j个簇中心之间的距离作为示例包Yi对应的单示例的第j维数据,这样将原来的多示例转化成大小为1*N的向量,其中N为聚类过程中簇的个数,从而得到单示例多标记数据SIML。
进一步地,根据所述的基于多图多标记学习的软件Bug检测方法,所述步骤7包括如下步骤:
步骤7-1:输入步骤6获取的单示例多标记数据SIML;
步骤7-2:对于单示例多标记数据SIML中的每一个样本,将标记按照重要性进行排序;
步骤7-3:将按照标记重要性排序之后的单示例多标记数据SIML1,使用深度学习框架Pytorch,随机初始化神经元网络学习模型,进行学习训练。
进一步地,根据所述的基于多图多标记学习的软件Bug检测方法,所述步骤7-2包括如下步骤:
步骤7-2-1;初始化标记计数字典LCD为空、标记共现矩阵L1为全零矩阵、标记相关矩阵L2为全零矩阵;
步骤7-2-2:对于样本中的每一个标记,标记计数字典LCD中该标记对应的数值增加1;
步骤7-2-3:对于该标记之后的每一个新标记,如果标记计数字典LCD中该标记以及新标记数目都大于0,那么标记共现矩阵L1中对应行列的值增加1;
步骤7-2-4:根据标记共现矩阵L1以及标记计数字典LCD,计算标记之间出现的条件概率:
Figure BDA0003406321460000042
其中,p(a|b)表示第a个标记针对第b个标记的条件概率,t表示总的标记数目,proab表示标记共现矩阵L1的第a行第b列取值,labela表示第a个标记的个数;
步骤7-2-5:根据步骤7-2-4得到的条件概率计算调和中项得到标记相关矩阵L2;
步骤7-2-6:根据标记相关矩阵L2和标记计数字典LCD计算标记频度和标记重要性向量;所述标记频度是指某一个标记在数据集所有样本中出现的频率;所述标记重要性向量按下式计算:
importa=Aa·Yratio
其中,importa表示标记a的标记重要性向量;Aa表示标记相关矩阵L2中与标记a相关的一行数据;Yratio为所有标记的标记频度;
步骤7-2-7:将得到的标记重要性向量中的值按照标记的索引进行排序,得到按重要性排序的标记列表F2。
总体而言,通过本发明所构思的以上技术方案较现有技术具有以下有益效果:
(1)该方法充分利用源代码中的图结构信息,并充分利用源代码和Bug报告之间深层次的语义关联,将源代码和Bug报告转化为多图多标记数据来解决Bug的检测问题。
(2)目前没有现成的多图多标记的Bug检测数据可供使用,本发明提供了基于程序源代码和对应的Bug报告的多图多标记Bug检测数据的产生方法;
(3)本发明找到了多图和多标记的对应关系,确定多标记之间的依赖关系,并从图级和包级两个方面考虑,提出针对多图多标记数据的区分子图度量准则,并进一步将多图多标记数据转化成计算机可以处理的向量形式的多示例多标记数据;
(4)在多标记检测过程中考虑了标记之间的依赖关系。传统的分类器链不能恰当地考虑标记排序问题,随机进行标记排列可能会造成性能下降。而本发明考虑了多标记之间的依赖关系可以极大地提高Bug检测的精度。
附图说明
图1为本实施方式基于多图多标记学习的软件Bug检测方法的流程示意图;
图2为本发明实施例将程序源代码转化为源代码的多图数据MG的流程示意图;
图3为本发明实施例将多示例多标记数据退化成单示例多标记数据的过程示意图;
图4为本发明方法与其他方法在评价指标one_error上的对比结果示意图;
图5为本发明方法与其他方法在评价指标converage上的对比结果示意图;
图6为本发明方法与其他方法在评价指标rloss上的对比结果示意图;
图7为本发明方法与其他方法在评价指标avg_pre上的对比结果示意图;
图8为本发明方法与其他方法在评价指标hloss上的对比结果示意图。
具体实施方式
为了使本发明的目的、技术方案及优势更加清晰,下面结合附图和具体实施例对本发明做进一步详细说明。此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
本实施方式中以表1示出的软件工程真实数据集AspectJ、Tomcat、JDT、SWT、Eclipse_Platform_UI为实施例对本发明的基于多图多标记学习的软件Bug检测方法进行详细说明。表1示出的这五个数据集均是Github上知名的开源项目,数据来源真实可靠。
表1五个公开数据集的相关信息
Figure BDA0003406321460000061
图1是本实施例基于多图多标记学习的软件Bug检测方法的流程示意图,如图1所示,所述基于多图多标记学习的软件Bug检测方法包括如下步骤:
步骤1:基于程序源代码对应的Bug报告获得所述程序源代码的Bug多标签,从而生成程序源代码的多标记数据;
步骤1-1:从代码仓库中获取原始的程序源代码和对应的Bug报告,给定停用词表ST和标记个数L;
所述代码仓库是存放大量源代码的仓库,例如现在有很多代码托管平台,用于保存程序源代码。停用词表可以采用现有的停用词表,如哈工大停用词表或百度停用词表等,也可以用户自己指定。标记个数L由用户指定。
步骤1-2:初始化文本列表T1为空,初始化向量列表T2为空;
步骤1-3:根据停用词表ST将Bug报告中的停用词删除,再将删除操作后Bug报告中留下的词存入文本列表T1中,作为语料库。
步骤1-4:将步骤1-3获得的文本列表T1中的单词构建成词典Dic并计算文本向量,且将文本向量存入向量列表T2中;
对步骤1-3获得的文本列表T1,调用文本处理库,例如使用Python的常用库函数Gensim将T1中的单词构建成词典Dic并计算文本向量,且将计算出的文本向量存入向量列表T2中,此处是存储每个Bug报告对应的向量。
步骤1-5:计算文本列表T1中每个单词的TF-IDF值;
步骤1-6:根据每个单词的TF-IDF值、给定的标记个数L以及所述词典Dic和步骤1-4得到的向量列表T2,使用LDA主题模型获得每个Bug报告对应的关键词信息,并以这些关键词作为对应源代码的Bug多标签,生成多标记数据D1;
表2示出的是本实施例使用的每个数据集中的不同标记对应的文件个数,从中可以看出不同的数据集中各个标记的占比情况。
表2
Figure BDA0003406321460000071
步骤2:生成程序源代码的多图数据MG,从而获得与程序源代码相对应的多图多标记数据;
对每一个源代码文件P,以方法为粒度,如图2所示,将每个方法都转换成对应的程序依赖图PDG。由于一个方法对应一个程序依赖图,而一个源代码文件中包括很多方法(即函数function)。因此,一个源代码文件P对应一个图包Bag(一个图包中包含很多方法,即程序依赖图),如图2所示。最终,获得该源代码文件P对应的多图数据MG。这里所述的方法是软件源代码的一个粒度,软件源代码从大到小可分成不同的粒度,例如文件,其次是类、比类再小的粒度就是方法即函数function。
这样经过步骤1和步骤2后就获得了每个程序源代码文件对应的多图多标记数据。
步骤3:从步骤2获得的多图数据MG中挖掘频繁子图,获得频繁子图集frequencyG;
为去除图数据中大量的冗余信息,只保留频繁出现的子图结构,需进行频繁子图挖掘,方法如下:
首先输入多图数据MG;然后初始化频繁子图支持度阈值min_sup,初始化频繁子图集frequencyG为空;再然后使用gspan算法挖掘频繁子图,若当前子图的兄弟节点与当前子图相似且不满足支持度阈值min_sup时,就不再继续搜索,否则继续执行深度搜索,并将该子图添加入frequencyG中;最后返回挖掘后的频繁子图集frequencyG。
将源程序转化成图之后可以得到原数据集对应的图结构数据,如表3所示。表3示出了源程序转化成图之后的数据集情况,其中根据统计的图的总数和表1已知的每个数据集的源程序个数,可以得知每个数据集对应的图包中的平均图数。可以看到,SWT数据集中平均每个包中图数量最大,达到115.14个;AspectJ数据集中平均每个包中图数量最小,只有17.6个。除此之外,可以看到转化后的图有些是规模很大的,最大边数可达2073,最大节点数可达754。这些复杂的图结构处理起来是需要耗费很大时间和精力的,而且有些子图是对结果不起任何作用的,因此也印证了本文进行子图挖掘的必要性。
表3各数据集对应的图结构数据
Figure BDA0003406321460000081
步骤4:从步骤3获得的频繁子图集frequencyG中筛选出能够区分不同标记的子图,构成区分子图集featureG;
所述区分子图为能够区分不同标记也就是能够区分不同Bug类的子图。因为频繁子图在分类中不能很好地区分标记,这就要求在频繁子图的基础上进行区分子图的挖掘,以用于区分不同标记的分类模型的学习;
具体包括如下步骤:
步骤4-1:输入步骤3得到的频繁子图集frequencyG和预期的区分子图个数k,k由用户指定;
步骤4-2:初始化区分子图集featureG为空,区分度阈值τ为0;
所述区分度是一个度量函数,作为区分子图的度量值。
步骤4-3:遍历频繁子图集frequencyG,对于其中的每一个子图,若已选择的子图个数小于k或者该子图的区分度大于当前的区分度阈值τ,则将该频繁子图添加到区分子图集featureG中;若区分子图集featureG中的区分子图个数大于k,则剔除区分子图集featureG中区分度最小的子图,并将区分度阈值τ更新为当前区分子图集featureG中具有最小区分度的子图的区分度;所述区分度是一个度量函数,指的是能区分不同类的子图的评价函数。
所述区分度的计算公式如下:
Figure BDA0003406321460000082
上式中,m代表图包中的子图总数,k表示第k个子图;sij表示图包Bi和Bj的相似度,计算公式如公式(2)所示。
Figure BDA0003406321460000083
Figure BDA0003406321460000084
Figure BDA0003406321460000085
是一个整体,它是图包B的向量化表示,表示图包B中是否包含子图gk,若包含,该值为1,否则该值为0;例如[g1,g2,…,gn]=[1,0,…,0],代表g1=1,即图包B包含子图g1,不包含其他子图。同理,
Figure BDA0003406321460000091
表示图G中是否包含子图gk,若包含,该值为1,否则该值为0。Lr是图包的标记比。
图包之间的相似度:有两个图包Bi和Bj,#label为数据集中标记个数,定义这两个图包之间的相似度为:
Figure BDA0003406321460000092
上式中⊙为同或运算符,即相同为1,相异为0。分母表示标记的个数。
图包的标记比:已知图包的标记个数和数据集中标记的总个数,定义图包的标记比为:
Figure BDA0003406321460000093
所述区分度阈值τ按照下式进行更新:
Figure BDA0003406321460000094
其中τ表示区分度阈值,featureG表示区分子图集,gi表示区分子图集featureG中的第i个子图,Ds表示区分度。
步骤4-4:返回区分子图集featureG;
步骤5:基于步骤4获得的区分子图集featureG实现多图的向量化,将每个程序源代码文件对应的多图多标记数据转化成多示例多标记数据。
在本实施例中,基于获得的区分子图集featureG,将多图多标记数据转化为多示例多标记数据时,是使用Graph2vec算法获取每个方法对应的程序依赖图PDG对应的向量,具体是判断图中是否包括步骤4获得的区分子图,如果存在该区分子图,则该子图对应向量中的属性值为1,否则,该该子图对应向量中的属性值为0。所有方法对应的程序依赖图PDG均转化为向量之后,多图数据MG就被转化为多示例数据Bag。
步骤6:将步骤5获得的多示例多标记数据退化为单示例多标记数据;
所述退化,实际上是针对多示例数据进行退化,如图3所示,即将多示例多标记数据退化成单示例多标记数据,具体步骤如下;
步骤6-1:输入目标聚类簇数N和步骤5获得的多示例数据Bag={Y1,Y2..Yn},其中Y为一个示例包,包含多个示例;
步骤6-2:计算两两示例包之间的豪斯多夫距离。
步骤6-3:按照豪斯多夫距离对示例包进行聚类,将第i个示例包Yi到第j个簇中心之间的距离作为示例包Yi对应的单示例的第j维数据,这样原来的多示例转化成大小为1*N的向量,其中N为聚类过程中簇的个数,最终得到单示例多标记数据SIML,保存每个示例对应的向量。
步骤7:利用步骤6获得的单示例多标记数据对神经元网络学习模型进行学习训练;
步骤7-1:输入步骤6获取的单示例多标记数据SIML;
步骤7-2:对于单示例多标记数据SIML中的每一个样本,将标记按照重要性进行排序;步骤如下:
步骤7-2-1;初始化标记计数字典LCD为空、标记共现矩阵L1为全零矩阵、标记相关矩阵L2为全零矩阵;
步骤7-2-2:对于样本中的每一个标记,标记计数字典LCD中该标记对应的数值增加1;
步骤7-2-3:对于该标记之后的每一个新标记,如果标记计数字典LCD中该标记以及新标记数目都大于0,那么标记共现矩阵L1中对应行列的值增加1;
步骤7-2-4:根据标记共现矩阵L1以及标记计数字典LCD,计算标记之间出现的条件概率;
条件概率的计算方式具体为:
Figure BDA0003406321460000101
其中,p(a|b)表示第a个标记针对第b个标记的条件概率,t表示总的标记数目,proab表示标记共现矩阵L1的第a行第b列取值,labela表示第a个标记的个数;
步骤7-2-5:根据步骤7-2-4得到的条件概率计算调和中项得到标记相关矩阵L2;
调和中项具体计算方式为:
Figure BDA0003406321460000102
其中p(a|b)表示第a个标记针对第b个标记的条件概率,p(b|a)表示第b个标记针对第a个标记的条件概率。
步骤7-2-6:根据标记相关矩阵L2和标记计数字典LCD计算标记频度和标记重要性向量,目的是将标记按照重要性进行排序;
标记频度是指某一个标记在数据集所有样本中出现的频率,计算方式为:
Figure BDA0003406321460000103
其中aratio表示标记a的标记频度;公式中
Figure BDA0003406321460000104
表示所有标记的数目之和;
Figure BDA0003406321460000105
Figure BDA0003406321460000106
表示标记a出现的次数;
Figure BDA0003406321460000107
代表第i个标记是a,则它的值为1,否则为0。
标记重要性向量计算方式为:
impOrta=Aa·Yratio
其中,importa表示标记a的标记重要性向量;Aa表示标记相关矩阵L2中与标记a相关的一行数据;Yratio为所有标记的标记频度,Yratio=[y1ratio,…,ynratio],其中y1ratio为标记y1的标记频度,ynratioo为标记yn的标记频度。
步骤7-2-7:将得到的标记重要性向量中的值按照标记的索引进行排序,得到按重要性排序的标记列表F2;
步骤7-3:将按照标记重要性排序之后的单示例多标记数据SIML1,使用深度学习框架Pytorch,随机初始化神经元网络学习模型,进行学习训练;具体步骤是:
步骤7-3-1:将单示例多标记样本SIML1中每条数据输入到神经元网络学习模型中进行训练,之后更新训练样本。
更新样本的方法为:
data=data+labeli (8)
label=labeli+1 (9)
1≤i<L (10)
其中L为五个数据集中的标记个数,data为神经元网络学习模型输入,label为训练样本的标记,labeli为第i个训练样本。
步骤7-3-2:重复步骤7-3-1,完成训练,返回当前神经元网络学习模型的参数,获得训练好的神经元网络学习模型;
步骤8:使用训练好的神经元网络学习模型执行缺陷检测,将待检测的软件源代码输入到模型中,模型返回结果即为缺陷检测结果。
本发明方法用MGML_DNN简写,而作为对比,使用基于上下文学习神经网络模型的Bug检测方法记为traditional_DNN。在本实施例中,对比了5个数据集采用这两个方法的Bug检测效果,结果如表4到表8所示。本发明实施例中采用交叉验证的方法,具体为采用10折交叉验证(10-fold cross validation),将每个数据集分成10份,轮流将其中9份做训练,1份做验证,10次结果的均值作为对结果精度的估计。表4对应AspectJ数据集的情况,表5对应Tomcat数据集的情况,表6对应JDT数据集的情况,表7对应SWT数据集的情况,表8对应Eclipse_Platform_UI数据集的情况。在表4到表8中最优结果用加粗字体表示,↓表示相应指标的值越低越好,↑表示相应指标的值越高越好。
表4 AspectJ数据集
Figure BDA0003406321460000111
Figure BDA0003406321460000121
表5 Tomcat数据集
Figure BDA0003406321460000122
表6 JDT数据集
Figure BDA0003406321460000123
表7 SWT数据集
Figure BDA0003406321460000124
表8 Eclipse_Platform_UI数据集
Figure BDA0003406321460000125
使用的评价指标简介如下:
(1)错误率(One-error):错误率反映的是输出排名最靠前的标记不属于样本真实标记的情况。当每个样本只有一个标记时,即为传统分类误差,该值在[0-1]之间,值越小越好,最优值为0。
(2)覆盖率(Coverage):覆盖率反应的是所有标记中排名最靠后的真正标记的排序平均值。该值越小越好,最优值为0。
(3)排名损失(Ranking Loss,rloss):排名损失度量的是排序错误对(即不相关标记的排名比相关标记靠前)出现的比率,该值越小越好,最优值为0。
(4)平均精度(Average Precision,avg_pre):平均精度考虑的是相关标记排名之前仍是相关标记的情况,该值越大越好,最优值为1。
(5)海明损失(Hamming Loss,hloss):海明损失度量的是预测标记和真实标记的不一样程度,即相关标记没有被预测或不相关标记被预测的情况出现的概率。当数据集中的每个样本都是单标记时,海明损失是传统误分类率的2/q倍,q是标签的个数,该值越小越好,最优值为0。
从表中可以观察到,基于退化的多图多标记(MGML-DNN)算法解决Bug检测问题比传统基于上下文的Bug检测方法更有效。大约在每个评价指标上都能提升1%~10%。由表4可知,在AspectJ数据集上提升最大的指标是coverage,MGML-DNN提升了大约12个百分点;由表5可知,在Tomcat数据集上提升最多的指标也是converage,其中MGML-DNN模型提升了大约8个百分点;由表6可知,在JDT数据集上从结果上看各指标相差不大,但总体来看MGML-DNN要优于traditional_DNN;由表7可知,在SWT数据集上同JDT数据集一样,各指标相差无几;由表8可知,在Eclipse_Platform_UI数据集上,one_error指标和hloss指标提升都相对较大,one_error指标大约提升7个百分点,hloss指标大约提升9个百分点。
将上述数据考虑评价指标可得到可视化数据,AspectJ数据集上各评价指标的分布图如图4所示,Tomcat数据集上各评价指标的分布图如图5所示,JDT数据集上各评价指标的分布图如图6所示,SWT数据集上各评价指标的分布图如图7所示,Eclipse_Platform_UI数据集上各评价指标的分布图如图8所示。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解;其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换。

Claims (10)

1.一种基于多图多标记学习的软件Bug检测方法,其特征在于,该方法包括以下步骤:
步骤1:基于程序源代码对应的Bug报告获得所述程序源代码的Bug多标记,从而生成程序源代码的多标记数据;
步骤2:生成程序源代码的多图数据MG,从而获得与程序源代码相对应的多图多标记数据;
步骤3:从步骤2获得的多图数据MG中挖掘频繁子图,获得频繁子图集frequencyG;
步骤4:从步骤3获得的频繁子图集frequencyG中筛选出能够区分不同标记的子图,将这些子图命名为区分子图,所有区分子图构成区分子图集featureG;
步骤5:基于步骤4获得的区分子图集featureG实现多图的向量化,将每个程序源代码文件对应的多图多标记数据转化成多示例多标记数据;
步骤6:将步骤5获得的多示例多标记数据退化为单示例多标记数据;
步骤7:利用步骤6获得的单示例多标记数据对神经元网络学习模型进行学习训练;
步骤8:将待检测的程序源代码输入到训练后的神经元网络学习模型中执行软件Bug检测,模型返回结果即为Bug检测结果。
2.根据权利要求1所述的基于多图多标记学习的软件Bug检测方法,其特征在于,所述步骤1进一步包括如下步骤:
步骤1-1:获取原始的程序源代码和对应的Bug报告,给定停用词表ST和标记个数L;
步骤1-2:初始化文本列表T1为空,初始化向量列表T2为空;
步骤1-3:根据停用词表ST将Bug报告中的停用词删除,将删除后剩下的词存入文本列表T1中,作为语料库;
步骤1-4:将T1中的单词构建成词典Dic并计算文本向量,且将文本向量存入向量列表T2中;
步骤1-5:计算T1中每个单词的TF-IDF值;
步骤1-6:根据每个单词的TF-IDF值、给定的标记个数L以及所述词典Dic和步骤1-4得到的向量列表T2,获得每个Bug报告对应的关键词信息,并以这些关键词作为对应程序源代码的Bug多标签,生成多标记数据D1。
3.根据权利要求1所述的基于多图多标记学习的软件Bug检测方法,其特征在于,所述生成程序源代码的多图数据MG的方法为:针对每一个程序源代码文件P,以方法为粒度,将每个方法均转换成对应的程序依赖图PDG,且由于一个方法对应一个程序依赖图,而一个源代码文件中包括很多方法,因此,一个程序源代码文件P对应一个图包Bag,从而获得该程序源代码文件P对应的多图数据MG。
4.根据权利要求1所述的基于多图多标记学习的软件Bug检测方法,其特征在于,使用gspan算法从步骤2获得的多图数据MG中挖掘频繁子图。
5.根据权利要求3所述的基于多图多标记学习的软件Bug检测方法,其特征在于,所述步骤4进一步包括如下步骤:
步骤4-1:输入步骤3得到的频繁子图集frequencyG和预期的区分子图个数k,k由用户指定;
步骤4-2:初始化区分子图集featureG为空,区分度阈值τ为0;
步骤4-3:遍历频繁子图集frequencyG,对于其中的每一个子图,若已选择的子图个数小于k或者该子图的区分度大于当前的区分度阈值τ,则将该频繁子图添加到区分子图集featureG中;若区分子图集featureG中的区分子图个数大于k,则剔除区分子图集featureG中区分度最小的子图,并将区分度阈值τ更新为当前区分子图集featureG中具有最小区分度的子图的区分度;
所述区分度阈值τ按照下式进行更新:
Figure FDA0003406321450000021
其中gi表示区分子图集featureG中的第i个子图;Ds表示区分度;
步骤4-4:返回区分子图集featureG。
6.根据权利要求5所述的基于多图多标记学习的软件Bug检测方法,其特征在于,所述区分度的计算公式如下:
Figure FDA0003406321450000022
上式中,m代表图包中的子图总数,k表示第k个子图;sij表示图包Bi和Bj的相似度;
Figure FDA0003406321450000023
Figure FDA0003406321450000024
是一个整体,它是图包B的向量化表示,表示图包B中是否包含子图gk,若包含,该值为1,否则该值为0;
Figure FDA0003406321450000025
表示图G中是否包含子图gk,若包含,该值为1,否则该值为0;Lr是图包的标记比。
7.根据权利要求1所述的基于多图多标记学习的软件Bug检测方法,其特征在于,基于步骤4获得的区分子图集featureG使用Graph2vec算法实现多图的向量化。
8.根据权利要求5所述的基于多图多标记学习的软件Bug检测方法,其特征在于,所述将步骤5获得的多示例多标记数据退化为单示例多标记数据的方法为:首先输入目标聚类簇数N和步骤5获得的多示例数据Bag={Y1,Y2..Yn},其中Y为一个示例包,包含多个示例;然后计算两两示例包之间的豪斯多夫距离;根据豪斯多夫距离对示例包进行聚类,将第i个示例包Yi到第j个簇中心之间的距离作为示例包Yi对应的单示例的第j维数据,这样将原来的多示例转化成大小为1*N的向量,其中N为聚类过程中簇的个数,从而得到单示例多标记数据SIML。
9.根据权利要求1所述的基于多图多标记学习的软件Bug检测方法,其特征在于,所述步骤7包括如下步骤:
步骤7-1:输入步骤6获取的单示例多标记数据SIML;
步骤7-2:对于单示例多标记数据SIML中的每一个样本,将标记按照重要性进行排序;
步骤7-3:将按照标记重要性排序之后的单示例多标记数据SIML1,使用深度学习框架Pytorch,随机初始化神经元网络学习模型,进行学习训练。
10.根据权利要求9所述的基于多图多标记学习的软件Bug检测方法,其特征在于,所述步骤7-2包括如下步骤:
步骤7-2-1;初始化标记计数字典LCD为空、标记共现矩阵L1为全零矩阵、标记相关矩阵L2为全零矩阵;
步骤7-2-2:对于样本中的每一个标记,标记计数字典LCD中该标记对应的数值增加1;
步骤7-2-3:对于该标记之后的每一个新标记,如果标记计数字典LCD中该标记以及新标记数目都大于0,那么标记共现矩阵L1中对应行列的值增加1;
步骤7-2-4:根据标记共现矩阵L1以及标记计数字典LCD,计算标记之间出现的条件概率:
Figure FDA0003406321450000031
其中,p(a|b)表示第a个标记针对第b个标记的条件概率,t表示总的标记数目,proab表示标记共现矩阵L1的第a行第b列取值,labela表示第a个标记的个数;
步骤7-2-5:根据步骤7-2-4得到的条件概率计算调和中项得到标记相关矩阵L2;
步骤7-2-6:根据标记相关矩阵L2和标记计数字典LCD计算标记频度和标记重要性向量;所述标记频度是指某一个标记在数据集所有样本中出现的频率;所述标记重要性向量按下式计算:
importa=Aa·Tratio
其中,importa表示标记a的标记重要性向量;Aa表示标记相关矩阵L2中与标记a相关的一行数据;Yratio为所有标记的标记频度;
步骤7-2-7:将得到的标记重要性向量中的值按照标记的索引进行排序,得到按重要性排序的标记列表F2。
CN202111514505.6A 2021-12-13 2021-12-13 一种基于多图多标记学习的软件Bug检测方法 Active CN114168478B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111514505.6A CN114168478B (zh) 2021-12-13 2021-12-13 一种基于多图多标记学习的软件Bug检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111514505.6A CN114168478B (zh) 2021-12-13 2021-12-13 一种基于多图多标记学习的软件Bug检测方法

Publications (2)

Publication Number Publication Date
CN114168478A true CN114168478A (zh) 2022-03-11
CN114168478B CN114168478B (zh) 2024-05-28

Family

ID=80485841

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111514505.6A Active CN114168478B (zh) 2021-12-13 2021-12-13 一种基于多图多标记学习的软件Bug检测方法

Country Status (1)

Country Link
CN (1) CN114168478B (zh)

Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102231134A (zh) * 2011-07-29 2011-11-02 哈尔滨工业大学 基于静态分析的冗余代码缺陷检测方法
CN104731696A (zh) * 2013-12-19 2015-06-24 腾讯科技(深圳)有限公司 定位程序代码中bug的方法及相关装置
CN106201790A (zh) * 2015-05-08 2016-12-07 深圳市祈飞科技有限公司 一种基于dsdt表的调试方法及调试系统
CN107992426A (zh) * 2017-12-26 2018-05-04 河南工业大学 一种基于频繁子图挖掘的软件错误定位方法及处理装置
US20180150742A1 (en) * 2016-11-28 2018-05-31 Microsoft Technology Licensing, Llc. Source code bug prediction
CN108491865A (zh) * 2018-03-05 2018-09-04 南京邮电大学 一种基于度量学习的多示例多标记分类方法
US20190227902A1 (en) * 2018-01-21 2019-07-25 Microsoft Technology Licensing, Llc. Time-weighted risky code prediction
CN111459826A (zh) * 2020-04-03 2020-07-28 中国建设银行股份有限公司 代码缺陷识别方法及系统
WO2020199345A1 (zh) * 2019-04-02 2020-10-08 广东石油化工学院 一种基于GitHub的半监督异构软件缺陷预测算法
WO2021022571A1 (zh) * 2019-08-05 2021-02-11 南京智谷人工智能研究院有限公司 一种基于交互建模的多标记距离度量学习方法
CN112395198A (zh) * 2020-11-19 2021-02-23 东北大学 一种基于区分子图挖掘的软件缺陷发现方法

Patent Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102231134A (zh) * 2011-07-29 2011-11-02 哈尔滨工业大学 基于静态分析的冗余代码缺陷检测方法
CN104731696A (zh) * 2013-12-19 2015-06-24 腾讯科技(深圳)有限公司 定位程序代码中bug的方法及相关装置
CN106201790A (zh) * 2015-05-08 2016-12-07 深圳市祈飞科技有限公司 一种基于dsdt表的调试方法及调试系统
US20180150742A1 (en) * 2016-11-28 2018-05-31 Microsoft Technology Licensing, Llc. Source code bug prediction
CN107992426A (zh) * 2017-12-26 2018-05-04 河南工业大学 一种基于频繁子图挖掘的软件错误定位方法及处理装置
US20190227902A1 (en) * 2018-01-21 2019-07-25 Microsoft Technology Licensing, Llc. Time-weighted risky code prediction
CN108491865A (zh) * 2018-03-05 2018-09-04 南京邮电大学 一种基于度量学习的多示例多标记分类方法
WO2020199345A1 (zh) * 2019-04-02 2020-10-08 广东石油化工学院 一种基于GitHub的半监督异构软件缺陷预测算法
WO2021022571A1 (zh) * 2019-08-05 2021-02-11 南京智谷人工智能研究院有限公司 一种基于交互建模的多标记距离度量学习方法
CN111459826A (zh) * 2020-04-03 2020-07-28 中国建设银行股份有限公司 代码缺陷识别方法及系统
CN112395198A (zh) * 2020-11-19 2021-02-23 东北大学 一种基于区分子图挖掘的软件缺陷发现方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
李娜;潘志松;周星宇;: "基于多标记重要性排序的分类器链算法", 模式识别与人工智能, no. 06, 15 June 2016 (2016-06-15) *
王一宾;程玉胜;裴根生;: "结合均值漂移的多示例多标记学习改进算法", 南京大学学报(自然科学), no. 02, 30 March 2018 (2018-03-30) *

Also Published As

Publication number Publication date
CN114168478B (zh) 2024-05-28

Similar Documents

Publication Publication Date Title
Zhang et al. Improving crowdsourced label quality using noise correction
CN110245496B (zh) 一种源代码漏洞检测方法及检测器和其训练方法及系统
EP3020005B1 (en) Active featuring in computer-human interactive learning
US7711736B2 (en) Detection of attributes in unstructured data
US10929775B2 (en) Statistical self learning archival system
CN109885180B (zh) 纠错方法和装置、计算机可读介质
CN111325264A (zh) 一种基于熵的多标签数据分类方法
KR20130137048A (ko) 사전 생성 장치, 사전 생성 방법 및 사전 생성 프로그램을 기억하는 컴퓨터 판독 가능 기록 매체
CN115858773A (zh) 适用于长文档的关键词挖掘方法、装置及介质
JP5049965B2 (ja) データ処理装置及び方法
CN110968693A (zh) 基于集成学习的多标签文本分类计算方法
Li et al. THU QUANTA at TAC 2009 KBP and RTE Track.
CN111737694B (zh) 一种基于行为树的恶意软件同源性分析方法
CN114168478A (zh) 一种基于多图多标记学习的软件Bug检测方法
CN112580691B (zh) 一种元数据字段的术语匹配方法、匹配系统和存储介质
CN110807096A (zh) 一种小样本集上的信息对匹配方法及系统
US12014140B2 (en) Utilizing machine learning and natural language processing to determine mappings between work items of various tools
Wang et al. Edcleaner: Data cleaning for entity information in social network
de Bruin Record Linkage Toolkit Documentation
Gustafsson et al. Fast parallel construction of variable-length Markov chains
Hadžić et al. Different similarity measures to identify duplicate records in relational databases
Singh et al. DataVinci: Learning Syntactic and Semantic String Repairs
Adler et al. An extensible perceptron framework for revision rtl debug automation
CN113283242B (zh) 一种基于聚类与预训练模型结合的命名实体识别方法
US20220269981A1 (en) Machine learning pipeline skeleton instantiation

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