CN110134435A - 一种代码修复案例获取方法、装置、设备及存储介质 - Google Patents

一种代码修复案例获取方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN110134435A
CN110134435A CN201910458219.9A CN201910458219A CN110134435A CN 110134435 A CN110134435 A CN 110134435A CN 201910458219 A CN201910458219 A CN 201910458219A CN 110134435 A CN110134435 A CN 110134435A
Authority
CN
China
Prior art keywords
code
source code
target source
increment
version
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
CN201910458219.9A
Other languages
English (en)
Other versions
CN110134435B (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.)
Beijing Baidu Netcom Science and Technology Co Ltd
Original Assignee
Beijing Baidu Netcom Science and Technology Co Ltd
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 Beijing Baidu Netcom Science and Technology Co Ltd filed Critical Beijing Baidu Netcom Science and Technology Co Ltd
Priority to CN201910458219.9A priority Critical patent/CN110134435B/zh
Publication of CN110134435A publication Critical patent/CN110134435A/zh
Application granted granted Critical
Publication of CN110134435B publication Critical patent/CN110134435B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding

Abstract

本发明实施例公开了一种代码修复案例获取方法、装置、设备及存储介质,方法包括:根据待修复代码行的指纹信息确定目标指纹信息,其在目标源代码的当前版本中存在,在目标源代码的增量版本中不存在;依据目标源代码的当前版本对应的修复前抽象语法树,在目标源代码中定位目标指纹信息所属的目标函数的当前版本代码范围和目标函数特征信息;依据目标源代码的增量版本对应的修复后抽象语法树和目标函数特征信息,在目标源代码的增量版本中定位目标函数的增量版本代码范围;根据当前版本代码范围和增量版本代码范围,分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例。本发明实施例利用抽象语法树技术实现自动化、高效提取修复案例。

Description

一种代码修复案例获取方法、装置、设备及存储介质
技术领域
本发明实施例涉及计算机技术领域,尤其涉及一种代码修复案例获取方法、装置、设备及存储介质。
背景技术
源代码自动修复技术是业界的一大趋势,而实现自动修复的前提是有大量的源代码修复案例信息,包括Bug内容、修复前的代码片段和修复后的代码片段。
传统方式中,样本的收集需要手工介入,那么对于以机器学习为代表的自动修复技术来讲,手工获取代码Bug修复案例效率低,远远达不到实际使用的需求。
发明内容
本发明实施例提供了一种代码修复案例获取方法、装置、设备及存储介质,以解决现有技术中通过手工收集的代码修复案例数量有限且收集案例效率低的技术问题。
第一方面,本发明实施例提供了一种代码修复案例获取方法,包括:
分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息,其中,所述指纹信息用于对代码行进行唯一性描述;
比较目标源代码的不同版本中待修复代码行的指纹信息,确定目标指纹信息,其中,所述目标指纹信息在当前版本中存在,并且在增量版本中不存在;
获取目标源代码的当前版本对应的修复前抽象语法树,并依据所述修复前抽象语法树,在所述目标源代码中定位目标指纹信息所属的目标函数的当前版本代码范围和目标函数特征信息;
获取目标源代码的增量版本对应的修复后抽象语法树,依据所述目标函数特征信息和修复后抽象语法树,在目标源代码的增量版本中定位所述目标函数的增量版本代码范围;
根据所述当前版本代码范围和增量版本代码范围,分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例。
第二方面,本发明实施例还提供了一种代码修复案例获取装置,包括:
指纹信息提取模块,用于分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息,其中,所述指纹信息用于对代码行进行唯一性描述;
筛选模块,用于比较目标源代码的不同版本中待修复代码行的指纹信息,确定目标指纹信息,其中,所述目标指纹信息在当前版本中存在,并且在增量版本中不存在;
第一定位模块,用于获取目标源代码的当前版本对应的修复前抽象语法树,并依据所述修复前抽象语法树,在所述目标源代码中定位目标指纹信息所属的目标函数的当前版本代码范围和目标函数特征信息;
第二定位模块,用于获取目标源代码的增量版本对应的修复后抽象语法树,依据所述目标函数特征信息和修复后抽象语法树,在目标源代码的增量版本中定位所述目标函数的增量版本代码范围;
案例获取模块,用于根据所述当前版本代码范围和增量版本代码范围,分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例。
第三方面,本发明实施例还提供了一种设备,包括:
一个或多个处理器;
存储器,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如本发明任一实施例所述的代码修复案例获取方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明任一实施例所述的代码修复案例获取方法。
本发明实施例提供了一种代码修复案例获取方法、装置、设备及存储介质,通过比较目标源代码的当前版本和增量版本中各自存在待修复的代码行的指纹信息,确定已修复的缺陷代码的目标指纹信息,基于抽象语法树技术,定位目标指纹信息所属的目标函数在当前版本代码范围和目标函数特征信息,再根据目标函数特征信息和抽象语法树技术,确定目标函数在增量版本的目标源代码中的增量版本代码范围,根据所述代码范围分别提取目标函数在不同版本的目标源代码中对应的代码片段,作为代码修复案例。本发明实施例利用抽象语法树技术实实现了自动化提取修复案例,有效解决了修复案例数量准备不足的问题,提升修复案例收集效率,同时确保获取到的修复案例的正确性。
附图说明
图1是本发明实施例一提供的一种代码修复案例获取方法的流程示意图;
图2是本发明实施例二提供的一种代码修复案例获取方法的流程示意图;
图3是本发明实施例三提供的一种代码修复案例获取装置的结构示意图;
图4是本发明实施例四提供的一种设备的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
实施例一
图1是本发明实施例一提供的一种代码修复案例获取方法的流程图,本实施例可适用于针对源代码自动修复的需求自动获取代码修复案例的情况,该方法可以由相应的代码修复案例获取装置执行,该装置可以采用软件和/或硬件的方式实现,并可配置于设备上,例如计算机设备。
如图1所示,代码修复案例获取方法可以包括:
S101、分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息,其中,所述指纹信息用于对代码行进行唯一性描述。
由于在代码入库前,需要对代码进行迭代修复其中的缺陷代码,因此目标源代码的增量版本也即是在目标源代码的当前版本基础上修复部分缺陷代码后的迭代版本或后续更新版本。目标源代码中的任一代码行都有唯一的指纹信息进行描述,其中,指纹信息以哈希值存储,例如将代码行的信息转化为哈希值存储为指纹,代码行的信息例如可以包括代码来自哪个库、哪个文件、哪个函数、类名或者行号等,可以唯一对代码行进行描述的信息,因此,不同代码行的哈希值,也就是代码行的指纹,都是不同的。
而在本实施例中,分别获取目标源代码的当前版本和增量版本中待修复代码行(即缺陷代码行)的指纹信息,通过比对即可确定目标源代码的当前版本中已被修复的缺陷代码行。示例性的,可通过静态代码扫描工具对代码进行扫描,分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息。其中,静态代码扫描指的是在不运行代码的方式下,通过文本分析和正则匹配等技术扫描代码,发现代码中存在的规范性、安全性问题,输出静态扫描结果,并以指纹的形式保存。其中,静态扫描结果可以包括至少一个待修复代码行的指纹信息,每个待修复代码行的指纹信息可以包括待修复代码行位置信息和待修复代码行描述信息,待修复代码行位置信息示例性的为待修复代码行的行号,待修复代码行描述信息示例性的为缺陷类型。
S102、比较目标源代码的不同版本中待修复代码行的指纹信息,确定目标指纹信息,其中,所述目标指纹信息在当前版本中存在,并且在增量版本中不存在。
比较目标源代码的不同版本中待修复代码行的指纹信息,如果目标指纹信息在当前版本中存在,并且在增量版本中不存在,则表明目标指纹信息对应的当前版本中的待修复代码行(即缺陷代码行)在增量版本中已被修复。因此,可将目标指纹信息对应的当前版本中的待修复代码行,及其对应的修复后的代码作为修复案例,具体的,可按照S103-S105进行提取。
S103、获取目标源代码的当前版本对应的修复前抽象语法树,并依据所述修复前抽象语法树,在所述目标源代码中定位目标指纹信息所属的目标函数的当前版本代码范围和目标函数特征信息。
其中,抽象语法树具有多个节点,例如父节点、子节点和兄弟节点等,每个节点用于对目标源代码中的代码字符串进行表征,例如,表征变量名、函数、类名、条件语句、循环语句等,同时节点还表征其对应的代码字符串所属的范围,以及对应的代码字符串在目标源代码中的行号,抽象语法树通过不同节点及不同节点之间的关系定义源代码的结构信息。
示例性的,可通过静态代码扫描,获取当前版本的目标源代码对应的修复前抽象语法树。虽然不同的语言其代码编写语法和规则均不同,但是依据修复前抽象语法树,不管是哪种语言编写的代码,都可以依据语法树定义的源代码的结构信息,依据该语言的语法和规则,即可定位目标指纹信息在目标源代码中所属的目标函数的当前版本代码范围和目标函数特征信息,其中,目标函数特征信息可唯一的标识不同版本中的同一目标函数,示例性的,目标函数特征信息包括目标函数的定义行的指纹信息。而定义行是指函数定义的代码行,一个完整的代码文件中同样的函数可能会重复出现,但是对函数的定义都是不同的,是唯一的,因此函数定义行的指纹信息在不同版本代码中可以唯一标识同一函数。
进一步的,可以按照如下操作确定目标指纹信息在目标源代码中所属的目标函数的当前版本代码范围和目标函数特征信息:
S1031.通过静态代码扫描,获取目标源代码的当前版本对应的修复前抽象语法树,以及所述目标指纹信息对应的待修复代码行在当前版本的目标源代码中的行号。
S1032.根据所述行号和修复前抽象语法树定义的结构信息,在所述修复前抽象语法树中进行节点遍历,定位目标函数的当前版本代码范围,并获取目标函数特征信息。
由于抽象语法树的每个节点可表征其对应的代码字符串所属的范围,以及对应的代码字符串在目标源代码中的行号。因此基于修复前抽象语法树定义的结构信息,在修复前抽象语法树中进行节点遍历,将待修复代码行在当前版本的目标源代码中的行号与节点表征的代码字符串在目标源代码中的行号进行匹配,确定待修复代码行对应的节点,根据确定的节点,进一步的确定该节点所属的目标函数以及该目标函数的起始节点和结束节点,依据起始节点和结束节点分别表征的代码字符串在目标源代码中的行号,确定定位目标函数的当前版本代码范围。同时,在确定目标函数后,可通过遍历目标函数的节点以获取目标函数的定义行的指纹信息,将其作为目标函数特征信息,以便在不同版本的目标源代码中查找该目标函数。在此需要说明的是,不同语言编写的代码,由于语法规则不同,具体定位函数起始和定义行也就不一样,但均可以依据语法树记载的结构信息进行。
S104、获取目标源代码的增量版本对应的修复后抽象语法树,依据所述目标函数特征信息和修复后抽象语法树,在目标源代码的增量版本中定位目标函数的增量版本代码范围。
示例性的,所述目标函数特征信息包括目标函数中定义行的指纹信息,并且可通过静态代码扫描,获取目标源代码的增量版本对应的修复后抽象语法树,在获得修复后抽象语法树后,可按照如下操作确定目标函数的增量版本代码范围:
S1041.在修复后抽象语法树中进行节点遍历,获取目标源代码中全部函数的定义行的指纹信息。
通过节点遍历的方式,根据各节点所表征的代码字符串,确定修复后抽象语法树所包括的全部函数,并获取目标源代码中全部函数的定义行的指纹信息。
S1042.在全部函数的定义行的指纹信息中,依据目标函数中定义行的指纹信息进行比对,确定目标源代码的增量版本中目标函数的定义行的行号。
由于目标函数的定义行的指纹信息可以表征不同版本中的目标函数,因此,将目标函数的定义行的指纹信息与全部函数的定义行的指纹信息进行比对,确定目标源代码的增量版本中目标函数的定义行所在的位置,例如确定目标函数定义行在目标源代码的增量版本中的行号。
S1043.依据目标源代码的增量版本中目标函数的定义行的行号,以及所述修复后抽象语法树,确定目标函数的增量版本代码范围。
基于修复后抽象语法树定义的结构信息,在修复后抽象语法树中进行节点遍历,将目标函数的定义行在目标源代码的增量版本中的行号与各节点表征的代码字符串在目标源代码的增量版本中的行号进行匹配,确定目标函数的定义行对应的节点,进一步的,确定目标函数的起始节点和结束节点,依据起始节点和结束节点分别表征的代码字符串在目标源代码的增量版本中的行号,确定目标函数的增量版本代码范围。
S105、根据所述当前版本代码范围和增量版本代码范围,分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例。
根据当前版本代码范围,提取目标源代码的当前版本中对应的代码片段作为待修复代码片段;根据增量版本代码范围,提取目标源代码的增量版本中对应的代码片段作为修复后代码片段。将待修复代码片段和修复后代码片段作为代码修复案例。在此需要说明的是,待修复代码片段和修复后代码片段都是以函数为基本代码片段。
本发明实施例中,通过比较目标源代码的当前版本和增量版本中各自存在的待修复代码行的指纹信息,确定已修复的缺陷代码的目标指纹信息,基于抽象语法树技术,定位目标指纹信息所属的目标函数在当前版本代码范围和目标函数特征信息,再根据目标函数特征信息和抽象语法树技术,确定目标函数在增量版本代码范围,分别提取目标函数在不同版本的目标源代码中对应的代码片段,作为代码修复案例。本发明实施例利用抽象语法树技术实现了自动化提取修复案例,有效解决了修复案例数量准备不足的问题,提升修复案例收集效率。
实施例二
图2为本发明实施例二提供的一种代码修复案例获取方法的流程示意图。本实施例以上述实施例为基础,在提取对应代码片段之前增加了对代码片段中待修复代码行的指纹信息的检验操作。
如图2所示,代码修复案例获取方法可以包括:
S201、分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息,其中,所述指纹信息用于对代码行进行唯一性描述。
S202、比较目标源代码的不同版本中待修复代码行的指纹信息,确定目标指纹信息,其中,所述目标指纹信息在当前版本中存在,并且在增量版本中不存在。
S203、获取目标源代码的当前版本对应的修复前抽象语法树,并依据所述修复前抽象语法树,在所述目标源代码中定位目标指纹信息所属的目标函数的当前版本代码范围和目标函数特征信息。
S204、获取目标源代码的增量版本对应的修复后抽象语法树,依据所述目标函数特征信息和修复后抽象语法树,在目标源代码的增量版本中定位所述目标函数的增量版本代码范围。
S205、判断所述当前版本代码范围和增量版本代码范围对应的代码片段中,是否存在除所述目标指纹信息之外的其他待修复代码行的指纹信息;如果不存在,则执行S206。
示例性的,根据目标源代码的当前版本和增量版本中待修复代码行的指纹信息,检测当前版本代码范围和增量版本代码范围对应的代码片段中,是否存在除目标指纹信息之外的其他待修复代码行的指纹信息,并在检测结果为否时,执行代码片段提取的操作,由此保证在已经修复问题的增量版本中没有引入新的待修复问题,保证获得的代码修复案例中没有其他待修复的代码行,即修复案例中没有缺陷代码,由此保证了修复案例自身的正确性。
S206、根据所述当前版本代码范围和增量版本代码范围,分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例。
本发明实施例中,通过检测当前版本代码范围和增量版本代码范围对应的代码片段中,不存在除目标指纹信息之外的其他待修复代码行的指纹信息后,提取对应的代码片段,由此保证最终得到的修复案例的正确性。
实施例三
图3是本发明实施例三提供的一种代码修复案例获取装置的结构示意图。如图3所示,该装置包括:
指纹信息提取模块301,用于分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息,其中,所述指纹信息用于对代码行进行唯一性描述;
筛选模块302,用于比较目标源代码的不同版本中待修复代码行的指纹信息,确定目标指纹信息,其中,所述目标指纹信息在当前版本中存在,并且在增量版本中不存在;
第一定位模块303,用于获取目标源代码的当前版本对应的修复前抽象语法树,并依据所述修复前抽象语法树,在所述目标源代码中定位目标指纹信息所属的目标函数的当前版本代码范围和目标函数特征信息;
第二定位模块304,用于获取目标源代码的增量版本对应的修复后抽象语法树,依据所述目标函数特征信息和修复后抽象语法树,在目标源代码的增量版本中定位所述目标函数的增量版本代码范围;
案例获取模块305,用于根据所述当前版本代码范围和增量版本代码范围,分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例。
本实施例中,通过比较目标源代码的当前版本和增量版本中各自存在的待修复代码行的指纹信息,确定已修复的缺陷代码的目标指纹信息,基于抽象语法树技术,定位目标指纹信息所属的目标函数在当前版本代码范围和目标函数特征信息,再根据目标函数特征信息和抽象语法树技术,确定目标函数在增量版本代码范围,分别提取目标函数在不同版本的目标源代码中对应的代码片段,作为代码修复案例。本发明实施例利用抽象语法树技术实现了自动化提取修复案例,有效解决了修复案例数量准备不足的问题,提升修复案例收集效率。
在上述实施例的基础上,所述指纹信息提取模块具体用于:
通过静态代码扫描,分别获取目标源代码的当前版本和增量版本中存在的待修复的代码行的指纹信息。
在上述实施例的基础上,所述第一定位模块包括:
第一获取单元,用于通过静态代码扫描,获取目标源代码的当前版本对应的修复前抽象语法树,以及所述目标指纹信息对应的待修复代码行在目标源代码的当前版本中的行号,其中,所述抽象语法树具有多个节点,每个节点用于对目标源代码中的代码字符串进行表征,所述抽象语法树通过不同节点及不同节点之间的关系定义源代码的结构信息;
第一定位单元,用于根据所述行号和修复前抽象语法树定义的结构信息,在所述修复前抽象语法树中进行节点遍历,定位目标函数的当前版本代码范围,并获取目标函数特征信息。
在上述实施例的基础上,所述目标函数特征信息包括目标函数中定义行的指纹信息;
相应的,所述第二定位模块包括:
第二获取单元,用于通过静态代码扫描,获取目标源代码的增量版本对应的修复后抽象语法树;
第三获取单元,用于在所述修复后抽象语法树中进行节点遍历,获取目标源代码中全部函数的定义行的指纹信息;
筛选单元,在所述全部函数的定义行的指纹信息中,依据所述目标函数中定义行的指纹信息进行比对,确定目标源代码的增量版本中所述目标函数的定义行的行号;
第二定位单元,用于依据所述目标源代码的增量版本中目标函数的定义行的行号,以及所述修复后抽象语法树,确定所述目标函数的增量版本代码范围。
在上述实施例的基础上,所述装置还包括判断模块,用于:
根据所述目标源代码的当前版本和增量版本中待修复代码行的指纹信息,判断所述当前版本代码范围和增量版本代码范围对应的代码片段中,是否存在除所述目标指纹信息之外的其他待修复代码行的指纹信息;
如果不存在,则由所述案例获取模块继续执行所述分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例的操作。
本发明实施例所提供的代码修复案例获取装置可执行本发明任意实施例所提供的代码修复案例获取方法,具备执行方法相应的功能模块和有益效果。
实施例四
图4为本发明实施例四提供的设备的结构示意图。图4示出了适于用来实现本发明实施方式的示例性设备12的框图。图4显示的设备12仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图4所示,设备12以通用计算设备的形式表现。设备12的组件可以包括但不限于:一个或者多个处理器或者处理器16,存储器28,连接不同系统组件(包括存储器28和处理器16)的总线18。
总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。
设备12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被设备12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM)30和/或高速缓存存储器32。设备12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图4未显示,通常称为“硬盘驱动器”)。尽管图4中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如CD-ROM,DVD-ROM或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。
具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括但不限于操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。
设备12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该设备12交互的设备通信,和/或与使得该设备12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22进行。并且,设备12还可以通过网络适配器20与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与设备12的其它模块通信。应当明白,尽管图中未示出,可以结合设备12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
处理器16通过运行存储在存储器28中的程序,从而执行各种功能应用以及数据处理,例如实现本发明实施例所提供的代码修复案例获取方法,包括:
分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息,其中,所述指纹信息用于对代码行进行唯一性描述;
比较目标源代码的不同版本中待修复代码行的指纹信息,确定目标指纹信息,其中,所述目标指纹信息在当前版本中存在,并且在增量版本中不存在;
获取目标源代码的当前版本对应的修复前抽象语法树,并依据所述修复前抽象语法树,在所述目标源代码中定位目标指纹信息所属的目标函数的当前版本代码范围和目标函数特征信息;
获取目标源代码的增量版本对应的修复后抽象语法树,依据所述目标函数特征信息和修复后抽象语法树,在目标源代码的增量版本中定位所述目标函数的增量版本代码范围;
根据所述当前版本代码范围和增量版本代码范围,分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例。
实施例五
本发明实施例中提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种代码修复案例获取方法,该方法包括:
分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息,其中,所述指纹信息用于对代码行进行唯一性描述;
比较目标源代码的不同版本中待修复代码行的指纹信息,确定目标指纹信息,其中,所述目标指纹信息在当前版本中存在,并且在增量版本中不存在;
获取目标源代码的当前版本对应的修复前抽象语法树,并依据所述修复前抽象语法树,在所述目标源代码中定位目标指纹信息所属的目标函数的当前版本代码范围和目标函数特征信息;
获取目标源代码的增量版本对应的修复后抽象语法树,依据所述目标函数特征信息和修复后抽象语法树,在目标源代码的增量版本中定位所述目标函数的增量版本代码范围;
根据所述当前版本代码范围和增量版本代码范围,分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例。
当然,本发明实施例中所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任意实施例中所提供的代码修复案例获取方法中的相关操作。
本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

Claims (12)

1.一种代码修复案例获取方法,其特征在于,所述方法包括:
分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息,其中,所述指纹信息用于对代码行进行唯一性描述;
比较目标源代码的不同版本中待修复代码行的指纹信息,确定目标指纹信息,其中,所述目标指纹信息在当前版本中存在,并且在增量版本中不存在;
获取目标源代码的当前版本对应的修复前抽象语法树,并依据所述修复前抽象语法树,在所述目标源代码中定位目标指纹信息所属的目标函数的当前版本代码范围和目标函数特征信息;
获取目标源代码的增量版本对应的修复后抽象语法树,依据所述目标函数特征信息和修复后抽象语法树,在目标源代码的增量版本中定位所述目标函数的增量版本代码范围;
根据所述当前版本代码范围和增量版本代码范围,分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例。
2.根据权利要求1所述的方法,其特征在于,所述分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息,包括:
通过静态代码扫描,分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息。
3.根据权利要求1所述的方法,其特征在于,所述获取目标源代码的当前版本对应的修复前抽象语法树,并依据所述修复前抽象语法树,在所述目标源代码中定位目标指纹信息所属的目标函数的当前版本代码范围和目标函数特征信息,包括:
通过静态代码扫描,获取目标源代码的当前版本对应的修复前抽象语法树,以及所述目标指纹信息对应的待修复代码行在目标源代码的当前版本中的行号,其中,所述抽象语法树具有多个节点,每个节点用于对目标源代码中的代码字符串进行表征,所述抽象语法树通过不同节点及不同节点之间的关系定义源代码的结构信息;
根据所述行号和修复前抽象语法树定义的结构信息,在所述修复前抽象语法树中进行节点遍历,定位目标函数的当前版本代码范围,并获取目标函数特征信息。
4.根据权利要求3所述的方法,其特征在于,所述目标函数特征信息包括目标函数中定义行的指纹信息;
相应的,所述获取目标源代码的增量版本对应的修复后抽象语法树,依据所述目标函数特征信息和修复后抽象语法树,在目标源代码的增量版本中定位所述目标函数的增量版本代码范围,包括:
通过静态代码扫描,获取目标源代码的增量版本对应的修复后抽象语法树;
在所述修复后抽象语法树中进行节点遍历,获取目标源代码中全部函数的定义行的指纹信息;
在所述全部函数的定义行的指纹信息中,依据所述目标函数中定义行的指纹信息进行比对,确定目标源代码的增量版本中所述目标函数的定义行的行号;
依据所述目标源代码的增量版本中所述目标函数的定义行的行号,以及所述修复后抽象语法树,确定所述目标函数的增量版本代码范围。
5.根据权利要求1所述的方法,其特征在于,在根据所述当前版本代码范围和增量版本代码范围,分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例之前,所述方法还包括:
根据所述目标源代码的当前版本和增量版本中待修复代码行的指纹信息,判断所述当前版本代码范围和增量版本代码范围对应的代码片段中,是否存在除所述目标指纹信息之外的其他待修复代码行的指纹信息;
如果不存在,则继续执行所述分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例的操作。
6.一种代码修复案例获取装置,其特征在于,所述装置包括:
指纹信息提取模块,用于分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息,其中,所述指纹信息用于对代码行进行唯一性描述;
筛选模块,用于比较目标源代码的不同版本中待修复代码行的指纹信息,确定目标指纹信息,其中,所述目标指纹信息在当前版本中存在,并且在增量版本中不存在;
第一定位模块,用于获取目标源代码的当前版本对应的修复前抽象语法树,并依据所述修复前抽象语法树,在所述目标源代码中定位目标指纹信息所属的目标函数的当前版本代码范围和目标函数特征信息;
第二定位模块,用于获取目标源代码的增量版本对应的修复后抽象语法树,依据所述目标函数特征信息和修复后抽象语法树,在目标源代码的增量版本中定位所述目标函数的增量版本代码范围;
案例获取模块,用于根据所述当前版本代码范围和增量版本代码范围,分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例。
7.根据权利要求6所述的装置,其特征在于,所述指纹信息提取模块具体用于:
通过静态代码扫描,分别获取目标源代码的当前版本和增量版本中待修复代码行的指纹信息。
8.根据权利要求6所述的装置,其特征在于,所述第一定位模块包括:
第一获取单元,用于通过静态代码扫描,获取目标源代码的当前版本对应的修复前抽象语法树,以及所述目标指纹信息对应的待修复代码行在目标源代码的当前版本中的行号,其中,所述抽象语法树具有多个节点,每个节点用于对目标源代码中的代码字符串进行表征,所述抽象语法树通过不同节点及不同节点之间的关系定义源代码的结构信息;
第一定位单元,用于根据所述行号和修复前抽象语法树定义的结构信息,在所述修复前抽象语法树中进行节点遍历,定位目标函数的当前版本代码范围,并获取目标函数特征信息。
9.根据权利要求8所述的装置,其特征在于,所述目标函数特征信息包括目标函数中定义行的指纹信息;
相应的,所述第二定位模块包括:
第二获取单元,用于通过静态代码扫描,获取目标源代码的增量版本对应的修复后抽象语法树;
第三获取单元,用于在所述修复后抽象语法树中进行节点遍历,获取目标源代码中全部函数的定义行的指纹信息;
筛选单元,在所述全部函数的定义行的指纹信息中,依据所述目标函数中定义行的指纹信息进行比对,确定目标源代码的增量版本中所述目标函数的定义行的行号;
第二定位单元,用于依据所述目标源代码的增量版本中所述目标函数的定义行的行号,以及所述修复后抽象语法树,确定所述目标函数的增量版本代码范围。
10.根据权利要求6所述的装置,其特征在于,所述装置还包括判断模块,用于:
根据所述目标源代码的当前版本和增量版本中待修复代码行的指纹信息,判断所述当前版本代码范围和增量版本代码范围对应的代码片段中,是否存在除所述目标指纹信息之外的其他待修复代码行的指纹信息;
如果不存在,则由所述案例获取模块继续执行所述分别提取目标源代码在不同版本中对应的代码片段,作为代码修复案例的操作。
11.一种设备,其特征在于,包括:
一个或多个处理器;
存储器,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-5中任一所述的代码修复案例获取方法。
12.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-5中任一所述的代码修复案例获取方法。
CN201910458219.9A 2019-05-29 2019-05-29 一种代码修复案例获取方法、装置、设备及存储介质 Active CN110134435B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910458219.9A CN110134435B (zh) 2019-05-29 2019-05-29 一种代码修复案例获取方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910458219.9A CN110134435B (zh) 2019-05-29 2019-05-29 一种代码修复案例获取方法、装置、设备及存储介质

Publications (2)

Publication Number Publication Date
CN110134435A true CN110134435A (zh) 2019-08-16
CN110134435B CN110134435B (zh) 2023-01-10

Family

ID=67582692

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910458219.9A Active CN110134435B (zh) 2019-05-29 2019-05-29 一种代码修复案例获取方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN110134435B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112306499A (zh) * 2020-11-24 2021-02-02 中国工商银行股份有限公司 程序要素提取方法及装置

Citations (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20150347128A1 (en) * 2014-05-28 2015-12-03 International Business Machines Corporation Synchronizing comments in source code with text documents
WO2016032234A1 (ko) * 2014-08-27 2016-03-03 주식회사 파수닷컴 소스 코드 분석 장치, 이를 위한 컴퓨터 프로그램, 그 기록매체
US9477461B1 (en) * 2014-03-12 2016-10-25 Cloud Linux Zug GmbH Systems and methods for generating and applying operating system live updates
CN106843849A (zh) * 2016-12-28 2017-06-13 南京大学 一种基于文档的库函数的代码模型的自动合成方法
CN106970820A (zh) * 2017-04-26 2017-07-21 腾讯科技(深圳)有限公司 代码存储方法及代码存储装置
US20170286077A1 (en) * 2016-03-31 2017-10-05 Ca, Inc. Interface definition language compiler with version reconciliation
US10055198B1 (en) * 2017-06-13 2018-08-21 Sap Se Systems and methods for probably approximate intent matching of procurement rules
CN108491228A (zh) * 2018-03-28 2018-09-04 清华大学 一种二进制漏洞代码克隆检测方法及系统
US10114624B1 (en) * 2017-10-12 2018-10-30 Devfactory Fz-Llc Blackbox matching engine
CN108932192A (zh) * 2017-05-22 2018-12-04 南京大学 一种基于抽象语法树的Python程序类型缺陷检测方法
WO2019040874A1 (en) * 2017-08-24 2019-02-28 The Regents Of The University Of Colorado, A Body Corporate SYSTEMS AND METHODS FOR RECORDING LINK
CN109445844A (zh) * 2018-11-05 2019-03-08 浙江网新恒天软件有限公司 基于哈希值的代码克隆检测方法、电子设备、存储介质

Patent Citations (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9477461B1 (en) * 2014-03-12 2016-10-25 Cloud Linux Zug GmbH Systems and methods for generating and applying operating system live updates
US20150347128A1 (en) * 2014-05-28 2015-12-03 International Business Machines Corporation Synchronizing comments in source code with text documents
WO2016032234A1 (ko) * 2014-08-27 2016-03-03 주식회사 파수닷컴 소스 코드 분석 장치, 이를 위한 컴퓨터 프로그램, 그 기록매체
US20170286077A1 (en) * 2016-03-31 2017-10-05 Ca, Inc. Interface definition language compiler with version reconciliation
CN106843849A (zh) * 2016-12-28 2017-06-13 南京大学 一种基于文档的库函数的代码模型的自动合成方法
CN106970820A (zh) * 2017-04-26 2017-07-21 腾讯科技(深圳)有限公司 代码存储方法及代码存储装置
CN108932192A (zh) * 2017-05-22 2018-12-04 南京大学 一种基于抽象语法树的Python程序类型缺陷检测方法
US10055198B1 (en) * 2017-06-13 2018-08-21 Sap Se Systems and methods for probably approximate intent matching of procurement rules
WO2019040874A1 (en) * 2017-08-24 2019-02-28 The Regents Of The University Of Colorado, A Body Corporate SYSTEMS AND METHODS FOR RECORDING LINK
US10114624B1 (en) * 2017-10-12 2018-10-30 Devfactory Fz-Llc Blackbox matching engine
CN108491228A (zh) * 2018-03-28 2018-09-04 清华大学 一种二进制漏洞代码克隆检测方法及系统
CN109445844A (zh) * 2018-11-05 2019-03-08 浙江网新恒天软件有限公司 基于哈希值的代码克隆检测方法、电子设备、存储介质

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
ENSHENG SHI: ""语法树与抽象语法树(parse tree & abstract syntax tree)"", 《HTTPS://BLOG.CSDN.NET/QQ_36097393/ARTICLE/DETAILS/88866898》 *
STEIN FLETCHER: ""Code generation in Go using abstractsyntax trees (AST)"", 《HTTPS://BLOG.STEIN.WTF/POSTS/GO-ABSTRACT-SYNTAX-TREE-CODE-GENERATION》 *
周风顺 等: ""C/C++程序缺陷自动修复与确认方法"", 《软件学报》 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112306499A (zh) * 2020-11-24 2021-02-02 中国工商银行股份有限公司 程序要素提取方法及装置
CN112306499B (zh) * 2020-11-24 2023-10-13 中国工商银行股份有限公司 程序要素提取方法及装置

Also Published As

Publication number Publication date
CN110134435B (zh) 2023-01-10

Similar Documents

Publication Publication Date Title
CN110852065B (zh) 一种文档审核方法、装置、系统、设备及存储介质
CN109144695B (zh) 一种任务拓扑关系的处理方法、装置、设备和介质
US10248541B2 (en) Extraction of problem diagnostic knowledge from test cases
CN103678110B (zh) 提供修改相关信息的方法和装置
CN104182335A (zh) 软件测试方法和装置
CN109726136A (zh) 数据库的测试方法、装置、设备和存储介质
CN107992484B (zh) 一种评测ocr系统的性能的方法、设备及存储介质
CN106294222A (zh) 一种确定pcie设备与插槽对应关系的方法及装置
CN110188544A (zh) 漏洞检测方法及装置、设备及存储介质
JP5303795B2 (ja) アプリケーションの解析方法、解析システム及び解析プログラム
CN109815147A (zh) 测试案例生成方法、装置、服务器和介质
CN109144852A (zh) 静态代码的扫描方法、装置、计算机设备及存储介质
US8468512B2 (en) Abstracting benefit rules from computer code
CN109086186B (zh) 日志检测方法及装置
US20210326615A1 (en) System and method for automatically detecting and repairing biometric crosslinks
CN110134435A (zh) 一种代码修复案例获取方法、装置、设备及存储介质
CN116303042B (zh) 一种基于污点分析的软件配置故障检测方法
CN103761202B (zh) 一种数据存储节点硬盘盘位识别方法及系统
CN110175128B (zh) 一种相似代码案例获取方法、装置、设备和存储介质
CN110515758A (zh) 一种故障定位方法、装置、计算机设备及存储介质
CN113342632A (zh) 仿真数据自动化处理方法、装置、电子设备及存储介质
CN110083807B (zh) 合同的修改影响自动预测方法、装置、介质及电子设备
CN111338956A (zh) 一种自动化的压测方法、装置、设备和存储介质
CN104424060A (zh) 一种用于确定故障的方法和装置
JP2018116517A (ja) 開発支援装置、開発支援方法、およびプログラム

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