CN113127339A - 一种Github开源平台数据的获取方法及源代码缺陷修复系统 - Google Patents
一种Github开源平台数据的获取方法及源代码缺陷修复系统 Download PDFInfo
- Publication number
- CN113127339A CN113127339A CN202110312352.0A CN202110312352A CN113127339A CN 113127339 A CN113127339 A CN 113127339A CN 202110312352 A CN202110312352 A CN 202110312352A CN 113127339 A CN113127339 A CN 113127339A
- Authority
- CN
- China
- Prior art keywords
- defect
- commit
- data
- bug
- fix
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/044—Recurrent networks, e.g. Hopfield networks
-
- 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/362—Software debugging
- G06F11/3628—Software debugging of optimised code
-
- 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/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/436—Semantic checking
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Evolutionary Computation (AREA)
- Biophysics (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Biomedical Technology (AREA)
- Data Mining & Analysis (AREA)
- Mathematical Physics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种Github开源平台数据的获取方法及源代码缺陷修复系统,所公开的方法包括:首先对Github平台中的数据集进行预处理,得到符合要求的变更记录及其对应的Bug‑Fix文件对;然后根据变更记录提取Bug‑Fix函数对;对Bug‑Fix函数根据控制流切片以扩充训练数量,之后对网络进行训练获得缺陷分类模型和补丁生成模型。对于待修复的缺陷文件,处理得到该目标文件缺陷所在函数的向量后,先输入到缺陷相似性分类模型,得到和目标代码最相似的分类集合,然后选择该集合训练的补丁生成模型生成对应的修复补丁。解决了目前基于源码进行学习的缺陷修复技术中面临的数据集过小、数据集质量低下导致模型泛化能力差的问题;且能够达到更高的正确补丁生成率。
Description
技术领域
本发明属于源代码审计领域,具体涉及一种Github开源平台数据的获取方法及源代码缺陷修复系统。
背景技术
软件缺陷,是指在计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷,又称为bug。
Github开源平台是目前流行的开源项目托管平台,Github中包含丰富的源代码数据、项目历史变更信息、缺陷修复信息等,并且具有实时更新的特点,使用Github上的数据可以为缺陷修复任务提供大量的缺陷修复信息。
现有从开源项目托管平台Github中获取数据的常用方法:根据简单的规则获取相关代码仓库的数据收集方法,例如Michele等人直接使用Google BigQuery APIs从Github中提取包含“fix”、“error”等简单关键字的数据,从而实现过滤其他不相关数据的目的。
现有技术仅使用API筛选的数据结果并不准确,由于Github中存在很多不规范的命名以及描述,关键词之间并不一定有联系,因此使用这种简单的模式匹配方法筛选数据无法避免一些低质量的数据,导致缺陷修复模型学习的特征有限,修复效率低下。
发明内容
针对现有技术的缺陷或不足,本发明一方面提供了一种Github开源平台数据的获取方法。为此,所提供的方法包括:
步骤1,获取Github开源平台的数据作为源数据,并筛选出源数据中的 Type类型为“fix”的commit记录;
步骤2,删除Type类型为“fix”的commit记录中不符合缺陷修复正则表达式规则的commit记录;
步骤3,采用commit记录分类网络对步骤2获得的commit记录进行分类,获取包含单一修改意图的commit message的commit记录;所述commit记录分类网络是将commit记录分为包含单一修改意图的commit message的commit 记录和包含多个修改意图的commitmessage的commit记录;
步骤4,删除步骤3所获得的commit记录中变更方法涉及多个项目文件的 commit记录及变更范围大于1M的commit记录,并去重后得到获取的数据。
可选的,步骤1中根据fork数排序获取Github开源平台的数据作为源数据。
可选的,所述commit记录分类网络采用Bi-LSTM网络。
本发明还提供了一种源代码缺陷修复模型的构建方法。为此,本发明提供的构建方法包括:
Step1,采用权利要求1所述方法获取数据;
Step2,对所获取的数据中的commit记录进行缺陷类型分类;
Step3,获取各种缺陷类型commit记录的变更前的文件对象Bug file和变更后的文件对象Fix file;
Step4,对获取的所有变更前的文件对象Bug file和变更后的文件对象 Fix file进行解析,提取Bug func和Fix func,之后进行切片得到Bug func 的至少一个切片函数和Fix func的至少一个切片函数,所有commit记录的Bug func的切片函数和Fix func的切片函数构成训练集;
Step5,对各切片函数进行序列化和第一向量化处理后,以同一缺陷类型的Bugfunc的切片函数向量为源输入、Fix func的切片函数向量为输出目标对Encoder-Decoder网络进行训练,得到各缺陷类型的补丁生成模型;
采用基于AST路径的源代码向量化对Bug func的至少一个切片函数进行第二向量化处理后,以所有Bug func的切片函数的向量为输入,缺陷类型为标签对Bi-LSTM网络进行训练得到源代码缺陷分类模型。
可选的,Step2中具体根据缺陷类型的关键字进行分类;所述缺陷类型采用CWE描述的缺陷类型。
可选的,Step5中采用分词算法对各切片函数进行序列化,接着采用 Word2Vec方法对序列化结果进行第一向量化处理。
进一步,本发明提供了一种源代码缺陷修复模型修复系统,所述系统包括:
数据预处理模块、上述方法所构建的源代码缺陷分类模型和各缺陷类型的补丁生成模型;所述对数据预处理模块待修复的源代码缺陷定位及预处理获得所述源代码缺陷分类模型和各缺陷类型的补丁生成模型可识别的输入数据。
同时,本发明提供了一种源代码缺陷修复模型修复方法,所述方法包括:
对待修复的源代码的进行缺陷定位,之后对缺陷所在数据进行预处理;
采用上述方法所构建的源代码缺陷分类模型对预处理后的数据进行缺陷分类;
对分类后的数据进行解析、切片、序列化和第一向量化处理后,输入上述所构建的相应缺陷类型的补丁生成模型进行修复。
基于上述方案:
(1)本发明对commit进行基于规则和基于双向LSTM分类模型的两次筛选,显著提升commit数据的质量。
(2)本发明用AST结构特征表示源代码,可以清楚地表达出源代码的结构信息、语法信息和语义信息,解决了传统的文本字符串表示法难以表达源代码的结构信息、语法信息和语义信息的问题。
(3)本发明使用基于代码相似性的缺陷相似性分类模型,提取缺陷代码中的AST结构特征,通过缺陷相似性分类模型自动学习和缺陷代码在语法结构上相似的补丁生成模型,提升基于文本序列特征的补丁生成模型的正确率。
(4)本发明基于大规模的开源代码库和机器学习方法,只需要更新数据集并继续用新的代码数据训练,缺陷修复模型即可更新,实现了跨代码修复方法之间的迁移过程。
附图说明
图1为Type类型为“fix”的commit记录示例;
图2为Bug Func切片过程示例;
图3为Fix Func切片过程示例;
图4为切片序列化示例;
图5为所构造的提取AST路径举例;
图6为构造的基于AST路径学习源码上下文表示向量的模型结构图;
图7为测试结果示例。
具体实施方式
除非另有说明,本文中的术语或方法根据相关领域普通技术人员的认识或公知方法理解或实现。部分术语或方法解释及示例如下,需要说明的是,以下示例内容用以理解本发明的构思和精神,并不对本发明的相关技术手段做唯一限定,相关领域技术人员在本发明构思基础上所做的等同变换均在本发明的保护范围之内。
本发明的数据获取是获取Github开源平台的数据作为源数据;筛选出源数据中的Type类型为“fix”的commit记录。具体数据中,每条commit记录包括更改相关的描述信息commit message、变更前的文件对象Bug file、变更后涉及的文件对象Fix file、当前文件和该次变更之间的差异diff,所述更改相关的描述信息commit message包括变更描述Subject和类型Type;所述类型Type包括“fix”、“solve”、“bug”、“issue”、“patch”五种。示例:Type类型为“fix”的commit记录示例如图1所示,该图所示为一个“fix”类型的commit示例,其中左侧commit中实线部分代表需要删除的行,虚线部分表示需要增加的行,分别对应右侧的Bug File和Fix File。
为了覆盖所有可能的缺陷类型,本发明正则表达式规则可包含几乎所有可能与缺陷修复相关的表达式和关键字,如Error、CWE、Exception、Fix 等,即优选的方案中本发明在获取数据是述缺陷修复正则表达式规则示例:“/Error|CWE|Exception|Fix|patch/”,其中“Error”表示程序错误、 CWE表示符合CWE描述、Exception表示程序异常、Fix表示修复、patch表示补丁。筛选出commit记录中包含这些关键字的commit记录。
本发明所述的commit记录分类网络可采用已知网络。其中一种示例如Bi-LSTM网络;该网络训练所用训练集:以Serena E等人基于Java项目手工收集和维护的缺陷数据集:Cédric Dangremont为正样本,以随机筛选得到的不合规commit(即包含多个修改意图的commit message)为负样本;标签:正样本为1,负样本为0。
本发明所述涉及多个项目文件的commit记录示例:“Document update for 2.0and error fixes”,该示例是将文档更新到2.0版本并且修复程序中的错误,涉及到文档和程序两个项目文件。
本发明所述CWE描述的缺陷类型为本领域公知技术,示例如表1所示。
表1 Defects4J缺陷数目表
本发明所述Bug func和Fix func、切片函数示例如图2和3所示:
首先对Bug Func进行切片,图2展示了详细的切片过程。程序从函数头开始执行,在第2行时碰见第一个if条件语句,受条件语句控制程序形成两个分支,如果条件表达式为true,则不会执行之后的程序,并将满足条件表达式的执行路径包含的代码行整合为切片1;当条件表达式结果为false时,程序会跳过if语句块内的第3行代码,直接执行第4行,这时又遇到一个if 条件语句,如果第4行条件表达式结果为true,则将满足第4行条件表达式的执行路径包含的代码行整合为切片2;当条件表达式结果为false时,程序不会执行第5行,而会从第6行开始执行else块里的语句,将这个路径中包含的代码行整合为切片3;当执行到函数尾部时,结束切片过程;
然后对Fix Func进行切片,图3展示了具体的切片过程,和对Bug Func 的切片过程相似,当程序执行到第2、4、6行时,根据if条件语句中条件表达式的结果分别将该执行路径中的代码行整合为切片1、切片2和切片3。其他分支语句都按该方法进行切片。
本发明所述的对切片函数的序列化示例参考图4所示,具体过程:
(1)本发明首先对Bug func和Fix func对应切片中的字符串和数字这两种变量类型的值进行抽象表示;具体操作步骤示例:使用词法分析器将Bug func和Fix func的对应切片转化为令牌序列;然后使用语法分析器 JavaParser对Bug func和Fix func对应切片的令牌序列进行语法解析,识别出其中的字符串和数字两种变量类型,并分别进行抽象表示,将字符串统一表示为“STRING”,数字统一表示为“NUM”,分别后缀所出现的次数,例如“NUM_1”、“NUM_2”等,如图4所示:将Bug func和Fix func对应切片中的数字表示为“NUM”,得到抽象化表示后Bug func和Fix func对应切片的序列;
(2)对上一步得到的抽象化表示后的Bug func和Fix func对应切片的序列中的所有单词子串的频率进行统计,得到Subword词汇表,然后按照子词大小对Subword词汇表由大到小进行排序,对于上述Bug func和Fix func 对应切片序列中的每个单词,依次遍历排序后的Subword词汇表,查找其中是否包含是当前单词子字符串的令牌,如果有,则根据这个令牌对单词进行拆分,单词的切分位置被表示为“<STOP>”;
(3)在(2)中生成在序列开端插入一个标记“<START>”表示序列开头,末端添加“<END>”表示结束,如图4所示;最终将Bug func和Fix func 对应切片转换为以子词表示的令牌序列。
本发明所述基于AST路径的源代码向量化对Bug func的切片函数进行向量化处理方法示例:
1)首先解析Bug func的切片函数并提取AST路径,具体可使用 JavaParser将Bugfunc切片(Bug Fix切片)转化为AST结构,AST是对源代码的抽象化表示,包含了叶子节点和非叶子节点两种类型,其中叶子节点表示代码中的标识符、变量类型及变量名,非叶子节点表示代码中一些特殊结构的抽象表示,例如方法声明等;然后提取AST中任意两个叶子节点之间经过的全部节点作为一条路径,所有叶子节点之间的路径组合成这个Bug func 切片的AST路径集合,如图5所示;
2)学习不同AST路径的上下文表示,使用Word2Vec方法对上述提取的不同AST路径进行向量化表示,网络结构如图6所示,使用卷积层网络学习AST 路径的局部节点特征,卷积操作通过滤波器提取特征范围内的局部信息,将多维向量映射到低维空间,进而可以用低维向量表示AST路径中的重点信息;对AST路径的局部特征提取完成之后,使用全连接层将上一次输出的特征进行组合,输出一维特征向量;最后,为了使缺陷分类模型在学习过程中更关注某些重要的AST路径特征,使用注意力机制对不同的AST路径分配不同的权重,实现对Bug func切片的分布式上下文特征向量表示的学习过程。
本发明所述的对待修复程序的缺陷定位可采取人工方法或相应算法,如缺陷定位算法。
实施例1:开源平台Github的数据获取
Github根据commit(变更)记录用户对项目的变更过程,保存与更改相关的描述信息commit message、变更前后所涉及的文件对象Bug-Fix、当前文件和该次变更之间的差异diff等;其中commit message即提交说明,包含变更描述Subject和类型Type,该实施例主要使用“fix”类型的commit作为数据来源;
首先根据fork数对2008-2020共13年Github中的Java仓库进行排序,并选择排名前15%的仓库作为初步数据来源;然后通过模式匹配和使用一个基于双向LSTM网络的分类模型对commit进行筛选,获得具有高质量的 commit;
根据commit message中的“Type”字段,使用Github REST API从上述的Java仓库中提取Type=‘fix’的commit;
然后通过匹配一组正则表达式规则筛选明显与缺陷修复无关的 commit,其中正则表达式规则包含了几乎所有可能与缺陷修复相关的表达式和关键字,如Error、CWE、Exception、Fix等,对上一步的commit进行匹配,匹配不成功的commit被认为不包含与缺陷修复相关的关键字而被删除;
接着使用训练好的双向LSTM网络作为检测模型对commit message进行分类,获取分类结果为正样本的commit记录;该实施例中训练所用数据集是通过手工的方式收集小型的“fix”类型的高质量commit集合,以其为正样本,标签设为1,再以随机筛选得到的不合规commit为负样本,标签设为0训练分类模型;具体训练过程是使用word2vec嵌入方法将样本对应的commit message的文本转换为适合网络学习的向量表示,再输入双向LSTM网络提取高质量的commit message的语义特征,模型最终输出commit message样本的预测结果,1表示和正样本具有相似语义的commit,0表示和负样本相似的 commit,通过commit分类模型,可以更精确的分类出具有规范描述的commit;
在上述步骤得到所有高质量commit后,提取其中所有变更方法,当变更方法涉及多个项目文件时,过滤这个commit;除此之外,删除变更范围 (diff)大于1M的commit,这类变更往往跨越多个函数范围,增加了后续模型学习的压力,接着对经过fork功能拷贝的仓库进行去重,只保留一个 commit;
经过上述处理得到获取的数据。
实施例2:
该实施例对实施例1所得数据进行缺陷类型分类、数据预处理、模型训练,获得分类模型和修复模型:
缺陷分类:
该实施例根据缺陷类型的关键字对实施例1得到的数据进行分类,从“2010 CWE/SANS Top 25 Most Dangerous Software Errors”中选取了10 种在Java语言中常出现的缺陷,依据缺陷类型的CWE描述,确定每一种缺陷用于模式匹配的关键词,如表1所示,为了在后续试验部分中进行更清晰直观的表述,并为每种缺陷类型设置唯一的分类标识代替CWE-ID,如表2 所示;
表2 CWE缺陷类型及描述
数据预处理:
(1)解析文件
根据获得的commit,使用Github REST API提取变更前后的源代码文件对Bug-Fix,其中Bug-File表示修改前含有缺陷的文件,Fix-File表示更改之后的正确版本文件;
然后对Bug-Fix进行解析,获得变更前后增加和删除的代码行号 change_line,首先使用GumTree AST Diff工具将Bug-Fix文件对转化为与 Java语言无关的抽象语法树(AST),然后计算两个抽象语法树节点之间的差异,包括节点增加、删除和移动三种操作,以此得到该commit影响的源文件的变更结构体:diff,并且获得源文件对应的更改行号change_line;
(2)提取Bug func和Fix func
使用Java语法解析器,即JavaParser根据上一步得到的change_line从源文件中提取变更前后的Bug-Fix函数体Bug func和Fix func,具体的提取步骤如下:首先使用JavaParser将Bug-Fix文件分别转换为对应的AST结构,针对每个Java源代码文件返回一个CompilationUnit节点,即为生成AST的根节点,再从中提取出包含change_line的MethodDeclaration节点,即为缺陷和对应修复所在的函数块;
(3)切片
该实施例基于程序控制流和数据流对Bug func和Fix func进行分解,生成对应的切片,具体采用动态切片技术保留与函数中某个输出相关的语句,删除对输出无影响的语句,函数中一组从函数头流入,至函数体流出的可执行语句路径集合为一个对应的函数切片;
在生成的切片集合中,删除不经过缺陷所在代码行的切片,因为该切片中已经不包含缺陷,同时也去除Fix中对应的切片;接着根据程序控制流对其余的Bug-Fix切片进行一一映射,去除不能对应的切片;
(4)基于文本序列的源代码向量化
该实施例使用Subword算法对代码序列中的单词进行切分,缩小词汇表的同时保留更多语义特征;之后用Word2Vec将字符串序列转化为向量表示;
(5)基于AST路径的源代码向量化
该步骤通过提取源代码中的AST路径来学习源代码的向量表示;
模型构建
缺陷分类模型:该实施例使用代码的AST结构特征向量作为缺陷相似性分类模型的输入,训练分类模型时,输入Bug切片的AST向量化表示和缺陷类别标签,输出是一个一维向量,表示对输入Bug的类别预测结果;根据Bug 的原始类别和模型预测结果,使用TensorFlow的softmax计算交叉熵,根据交叉熵计算loss值并传递给优化器进行优化;
补丁生成模型:使用Bug func的切片函数的文本特征向量作为输入,构建Encoder-Decoder模型学习从缺陷代码到修复代码的转换模式,其中 Encoder由双向LSTM网络构成,Decoder由LSTM构成;训练补丁生成模型时,输入为Bug func的切片函数的文本特征向量,模型每产生一个预测输出词时,和Fix序列中对应的词进行对比来计算loss值,并进一步优化网络。
优选的方案中,所用Encoder-Decoder模型可加入局部注意力机制,所述局部注意力机制相比其他注意力机制,只对当前生成单词对应的小范围输入单词产生关注,可以使Encoder-Decoder模型在训练与迭代过程中更加关注重点特征,提升模型学习序列映射关系的能力。
采用上述模型对目标缺陷文件进行修复时,首先使用缺陷定位算法得出缺陷的具体位置,再将源文件构造为AST,通过缺陷定位结果提取缺陷所在的函数块,接着将缺陷函数使用基于文本序列的向量化方法和基于AST结构的向量化方法分别进行向量化,再将基于AST结构的向量化表示输入训练好的缺陷相似性分类模型,输出一个和该缺陷代码在语法结构上相似的缺陷类型,再将该缺陷基于文本序列的向量化表示输入上述缺陷类别对应的补丁生成模型,模型根据所学习的缺陷代码修复模式对该缺陷函数生成对应的候选补丁。
本发明效果验证:
该实施例使用Github中的2008-2020共13年Java仓库作为缺陷相似性分类模型和补丁生成模型的训练数据源,使用Defects4J v2.0.0中的17个项目中的835个缺陷及其测试用例作为修复系统的评估数据集;补丁生成模型使用每种缺陷类型的数据单独训练并测试。
在对缺陷相似性分类模型训练和测试的过程中,首先生成每个Bug切片对应的类型标签class_id,由0-9表示十种类别;然后将Bug切片的AST向量化表示和对应标签作为缺陷相似性分类模型的输入,将其输入基于双向LSTM 网络,进行网络模型的训练和测试;在训练和测试的过程中,各缺陷种类的数目相等;将数据分为三部分,分别是训练集、验证集、测试集,比例为6: 2:2,使用训练集训练缺陷相似性分类模型,使用验证集判断训练出的各个网络模型的效果,选取效果最好的模型对测试集进行测试。
在补丁生成模型的训练和测试过程中,首先将Bug func的切片函数对应的文本向量化表示作为模型输入,对Encoder-Decoder网络模型进行训练和测试,将数据分为三部分,分别是训练集、验证集、测试集,比例为6:2: 2,使用训练集训练补丁生成模型,使用验证集判断训练出的各个网络模型的效果,选取效果最好的模型对测试集进行测试;
表3是Github中用于训练缺陷相似性分类模型的训练、验证和测试集的代码数目;表4是Github中用于训练补丁生成模型的训练、验证和测试集的代码数目。
表3 Github训练缺陷相似性分类模型的数据集数目
表4 Github训练补丁生成模型的数据集数目
缺陷类型 | 训练样本数 | 验证样本数 | 测试样本数 |
BufferError | 36000 | 12000 | 12000 |
IntegerError | 30000 | 10000 | 10000 |
ArrayError | 18000 | 6000 | 6000 |
OutofMemory | 24000 | 8000 | 8000 |
NullPointerError | 36000 | 12000 | 12000 |
Deadlock | 30000 | 10000 | 10000 |
FileError | 24000 | 8000 | 8000 |
Injection | 18000 | 6000 | 6000 |
FormatError | 24000 | 8000 | 8000 |
RaceError | 12000 | 4000 | 4000 |
模型训练
(1)训练模型的硬件平台
NVIDIA GeForce GTX 1080 GPU、Intel Xeon E5-1620 CPU;
(2)缺陷分类模型参数
本发明将基于双向LSTM的相似性分类模型视作一个黑盒,输入代码的 AST结构向量表示和缺陷类型,输出一维向量作为预测结果;
该实施例将模型参数设置为自然语言处理领域常用的参数值,设置模型输入维度为100维,训练的batch size为128,学习率为0.001,模型迭代次数为10000;
该实施例将Bug-Fix的文本特征向量化表示输入基于Encoder-Decoder 的补丁生成网络中,并将模型参数设置为:输入维度为512,Encoder使用两层双向LSTM网络,Decoder使用四层LSTM结构,使用局部注意力机制学习与输出相关的输入上下文特征,训练的batchsize为64,学习率为0.001,模型迭代次数为10000。
验证结果:
(1)缺陷相似性分类模型准确率高、误分类率低
经过双向LSTM的训练,针对Github数据集的测试集,本发明的测试结果如下表5所示。True Positive(TP)表示某种缺陷类型的样本被正确的分类为该类型样本,FalseNegative(FN)表示某种缺陷类型的样本被错误的分类为其他缺陷样本,False Positive(FP)表示其他类型的样本被错误的分类为该样本,Accuracy表示预测正确的样本占总样本的比值,Precision 衡量每种类型的预测情况,表示某种缺陷类型的正确预测样本占该缺陷类型所有真实样本的比例,Precision=TP/(TP+FP)。最后本发明使用 Micro-average衡量整体分类结果,代表最终的Accuracy。
表5
表5展示了对Github测试集的分类检测结果。从检测结果可以看到,对 10种类型的分类测试都在有很高的检出率(Accuracy)的同时具有很低的误报率。
(2)补丁生成模型生成候选补丁正确率高
该实施例使用Defects4J中Java项目的缺陷文件和配套测试用例评估缺陷修复系统的补丁生成结构:首先对Defects4J中的数据进行预处理,得到缺陷所在的函数块,对其提取文本特征的向量化表示和AST结构的向量化表示,再将AST结构的向量化表示输入训练好的缺陷相似性分类模型,选择与待修复缺陷相似的缺陷集合,再将文本特征的向量化表示输入对应相似缺陷集合训练好的补丁生成模型中,通过补丁生成模型生成对应的候选补丁。
最后使用配套测试用例评估生成的候选补丁,表6是本发明方法对 Defects4J的修复结果,最终正确修复了65个缺陷,表明本发明可以有效修复 Java中的实际缺陷。
表6 Defects4J的修复结果
测试
使用自动测试用例生成工具EvoSuite生成Bug func对应的测试用例集,并使用Junit自动测试框架在测试用例集上执行本发明方法生成的补丁,如果测试用例集全部能正确通过,说明生成了正确的补丁。
部分测试用例如表7和图7所示。
表7
Claims (8)
1.一种Github开源平台数据的获取方法,其特征在于,方法包括
步骤1,获取Github开源平台的数据作为源数据,并筛选出源数据中的Type类型为“fix”的commit记录;
步骤2,删除Type类型为“fix”的commit记录中不符合缺陷修复正则表达式规则的commit记录;
步骤3,采用commit记录分类网络对步骤2获得的commit记录进行分类,获取包含单一修改意图的commit message的commit记录;所述commit记录分类网络是将commit记录分为包含单一修改意图的commit message的commit记录和包含多个修改意图的commitmessage的commit记录;
步骤4,删除步骤3所获得的commit记录中变更方法涉及多个项目文件的commit记录及变更范围大于1M的commit记录,并去重后得到获取的数据。
2.如权利要求1所述的Github开源平台数据的获取方法,其特征在于,步骤1中根据fork数排序获取Github开源平台的数据作为源数据。
3.如权利要求1所述的Github开源平台数据的获取方法,其特征在于,所述commit记录分类网络采用Bi-LSTM网络。
4.一种源代码缺陷修复模型的构建方法,其特征在于,方法包括:
Step1,采用权利要求1所述方法获取数据;
Step2,对所获取的数据中的commit记录进行缺陷类型分类;
Step3,获取各种缺陷类型commit记录的变更前的文件对象Bug file和变更后的文件对象Fix file;
Step4,对获取的所有变更前的文件对象Bug file和变更后的文件对象Fix file进行解析,提取Bug func和Fix func,之后进行切片得到Bug func的至少一个切片函数和Fixfunc的至少一个切片函数,所有commit记录的Bug func的切片函数和Fix func的切片函数构成训练集;
Step5,对各切片函数进行序列化和第一向量化处理后,以同一缺陷类型的Bug func的切片函数向量为源输入、Fix func的切片函数向量为输出目标对Encoder-Decoder网络进行训练,得到各缺陷类型的补丁生成模型;
采用基于AST路径的源代码向量化对Bug func的至少一个切片函数进行第二向量化处理后,以所有Bug func的切片函数的向量为输入,缺陷类型为标签对Bi-LSTM网络进行训练得到源代码缺陷分类模型。
5.如权利要求4所述的源代码缺陷修复模型的构建方法,其特征在于,Step2中具体根据缺陷类型的关键字进行分类;所述缺陷类型采用CWE描述的缺陷类型。
6.如权利要求4所述的源代码缺陷修复模型的构建方法,其特征在于,Step5中采用分词算法对各切片函数进行序列化,接着采用Word2Vec方法对序列化结果进行第一向量化处理。
7.一种源代码缺陷修复模型修复系统,其特征在于,所述系统包括:
数据预处理模块、权利要求4所构建的源代码缺陷分类模型和各缺陷类型的补丁生成模型;所述对数据预处理模块待修复的源代码缺陷定位及预处理获得所述源代码缺陷分类模型和各缺陷类型的补丁生成模型可识别的输入数据。
8.一种源代码缺陷修复模型修复方法,其特征在于,方法包括:
对待修复的源代码的进行缺陷定位,之后对缺陷所在数据进行预处理;
采用权利要求4所构建的源代码缺陷分类模型对预处理后的数据进行缺陷分类;
对分类后的数据进行解析、切片、序列化和第一向量化处理后,输入权利要求4所构建的相应缺陷类型的补丁生成模型进行修复。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110312352.0A CN113127339B (zh) | 2021-03-24 | 2021-03-24 | 一种Github开源平台数据的获取方法及源代码缺陷修复系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110312352.0A CN113127339B (zh) | 2021-03-24 | 2021-03-24 | 一种Github开源平台数据的获取方法及源代码缺陷修复系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113127339A true CN113127339A (zh) | 2021-07-16 |
CN113127339B CN113127339B (zh) | 2023-02-10 |
Family
ID=76774075
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110312352.0A Active CN113127339B (zh) | 2021-03-24 | 2021-03-24 | 一种Github开源平台数据的获取方法及源代码缺陷修复系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113127339B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113688036A (zh) * | 2021-08-13 | 2021-11-23 | 北京灵汐科技有限公司 | 一种数据处理方法、装置、设备以及存储介质 |
CN114064472A (zh) * | 2021-11-12 | 2022-02-18 | 天津大学 | 基于代码表示的软件缺陷自动修复加速方法 |
CN114238124A (zh) * | 2021-12-20 | 2022-03-25 | 南京邮电大学 | 一种基于图神经网络的重复Pull Request检测方法 |
CN114416421A (zh) * | 2022-01-24 | 2022-04-29 | 北京航空航天大学 | 一种代码缺陷的自动定位与修复方法 |
CN115016961A (zh) * | 2022-04-27 | 2022-09-06 | 大连海事大学 | 一种基于注意力网络的代码修复方法 |
CN114416421B (zh) * | 2022-01-24 | 2024-05-31 | 北京航空航天大学 | 一种代码缺陷的自动定位与修复方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109697162A (zh) * | 2018-11-15 | 2019-04-30 | 西北大学 | 一种基于开源代码库的软件缺陷自动检测方法 |
US20190228319A1 (en) * | 2018-01-21 | 2019-07-25 | Microsoft Technology Licensing, Llc. | Data-driven automatic code review |
CN110134613A (zh) * | 2019-05-22 | 2019-08-16 | 北京航空航天大学 | 一种基于代码语义及背景信息的软件缺陷数据采集系统 |
CN110688303A (zh) * | 2019-08-28 | 2020-01-14 | 武汉大学 | 一种基于一体化开发平台的软件工件关系的挖掘方法 |
CN111459799A (zh) * | 2020-03-03 | 2020-07-28 | 西北大学 | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 |
CN111813412A (zh) * | 2020-06-28 | 2020-10-23 | 中国科学院计算机网络信息中心 | 构建评测二进制代码比对工具的测试数据集的方法及系统 |
-
2021
- 2021-03-24 CN CN202110312352.0A patent/CN113127339B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20190228319A1 (en) * | 2018-01-21 | 2019-07-25 | Microsoft Technology Licensing, Llc. | Data-driven automatic code review |
CN109697162A (zh) * | 2018-11-15 | 2019-04-30 | 西北大学 | 一种基于开源代码库的软件缺陷自动检测方法 |
CN110134613A (zh) * | 2019-05-22 | 2019-08-16 | 北京航空航天大学 | 一种基于代码语义及背景信息的软件缺陷数据采集系统 |
CN110688303A (zh) * | 2019-08-28 | 2020-01-14 | 武汉大学 | 一种基于一体化开发平台的软件工件关系的挖掘方法 |
CN111459799A (zh) * | 2020-03-03 | 2020-07-28 | 西北大学 | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 |
CN111813412A (zh) * | 2020-06-28 | 2020-10-23 | 中国科学院计算机网络信息中心 | 构建评测二进制代码比对工具的测试数据集的方法及系统 |
Non-Patent Citations (2)
Title |
---|
SARIM ZAFAR: "Towards Standardizing and Improving Classification of Bug-Fix Commits", 《2019 ACM/IEEE INTERNATIONAL SYMPOSIUM ON EMPIRICAL SOFTWARE ENGINEERING AND MEASUREMENT (ESEM)》 * |
齐晴: "GitHub中软件生态系统的演化", 《计算机研究与发展》 * |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113688036A (zh) * | 2021-08-13 | 2021-11-23 | 北京灵汐科技有限公司 | 一种数据处理方法、装置、设备以及存储介质 |
CN114064472A (zh) * | 2021-11-12 | 2022-02-18 | 天津大学 | 基于代码表示的软件缺陷自动修复加速方法 |
CN114064472B (zh) * | 2021-11-12 | 2024-04-09 | 天津大学 | 基于代码表示的软件缺陷自动修复加速方法 |
CN114238124A (zh) * | 2021-12-20 | 2022-03-25 | 南京邮电大学 | 一种基于图神经网络的重复Pull Request检测方法 |
CN114416421A (zh) * | 2022-01-24 | 2022-04-29 | 北京航空航天大学 | 一种代码缺陷的自动定位与修复方法 |
CN114416421B (zh) * | 2022-01-24 | 2024-05-31 | 北京航空航天大学 | 一种代码缺陷的自动定位与修复方法 |
CN115016961A (zh) * | 2022-04-27 | 2022-09-06 | 大连海事大学 | 一种基于注意力网络的代码修复方法 |
CN115016961B (zh) * | 2022-04-27 | 2024-04-26 | 大连海事大学 | 一种基于注意力网络的代码修复方法 |
Also Published As
Publication number | Publication date |
---|---|
CN113127339B (zh) | 2023-02-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113127339B (zh) | 一种Github开源平台数据的获取方法及源代码缺陷修复系统 | |
CN108446540B (zh) | 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统 | |
CN113191148B (zh) | 一种基于半监督学习和聚类的轨道交通实体识别方法 | |
CN109492106B (zh) | 一种文本代码相结合的缺陷原因自动分类方法 | |
CN111459799A (zh) | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 | |
CN113138920B (zh) | 基于知识图谱与语义角色标注的软件缺陷报告分派方法及装置 | |
CN111475820A (zh) | 基于可执行程序的二进制漏洞检测方法、系统及存储介质 | |
CN111858323B (zh) | 一种基于代码表示学习的即时软件缺陷预测方法 | |
CN114185769A (zh) | 基于双向长短期记忆神经网络的软件缺陷预测方法及终端 | |
CN113190219A (zh) | 一种基于递归神经网络模型的代码注释生成方法 | |
CN115066674A (zh) | 使用源代码元素的数值数组表示来评估源代码的方法 | |
CN116702160B (zh) | 一种基于数据依赖增强程序切片的源代码漏洞检测方法 | |
US6889219B2 (en) | Method of tuning a decision network and a decision tree model | |
CN116166789A (zh) | 一种方法命名精准推荐和审查方法 | |
CN114385491A (zh) | 一种基于深度学习的js转译器缺陷检测方法 | |
CN115033659A (zh) | 基于深度学习的子句级自动摘要模型系统及摘要生成方法 | |
CN115048929A (zh) | 敏感文本监测方法及装置 | |
CN114780403A (zh) | 基于增强代码属性图的软件缺陷预测方法及预测装置 | |
Xiong et al. | BUAA_AntiPlagiarism: A System To Detect Plagiarism for C Source Code | |
Ouyang et al. | Binary vulnerability mining based on long short-term memory network | |
CN116989838B (zh) | 一种基于语法树的仪表计量检测校准方法及系统 | |
CN113313184B (zh) | 一种异质集成的自承认技术债务自动检测方法 | |
Jiang et al. | A deep learning approach to locate buggy files | |
CN112579444B (zh) | 基于文本认知的自动分析建模方法、系统、装置及介质 | |
CN117435246B (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 |