首页 / 专利库 / 软件 / 控制流图 / 一种基于相似度分析的源代码版本演化注释复用方法

一种基于相似度分析的源代码版本演化注释复用方法

阅读:797发布:2020-05-08

专利汇可以提供一种基于相似度分析的源代码版本演化注释复用方法专利检索,专利查询,专利分析的服务。并且本 发明 公开了一种基于相似度分析的源代码版本演化注释复用方法。本方法为:1)查找目标源代码的新版本,生成该新版本的标识符信息并写入复用库;2)对该目标源代码与该新版本进行文本相似度分析,将该目标源代码中与该新版本相同的代码 片段 的标识符对应的注释写入复用库中对应注释字段,剩余代码片段的标识符写入一中间文件;3)根据该中间文件中每一标识符及其对应代码片段生成一功能相似度信息;4)对于该中间文件中的标识符,根据该目标源代码中该标识符对应的代码片段与该新版本该标识符对应的代码片段生成该标识符的克隆对;5)将功能相似度大于设定 阈值 的克隆对对应的标识符在该目标源代码中的注释写入该复用库中该标识符的注释字段。,下面是一种基于相似度分析的源代码版本演化注释复用方法专利的具体信息内容。

1.一种基于相似度分析的源代码版本演化注释复用方法,其步骤为:
1)查找目标源代码的新版本,对该新版本进行遍历,生成该新版本的标识符信息并写入复用库;
2)对该目标源代码与该新版本进行文本相似度分析,将该目标源代码中与该新版本相同的代码片段的标识符对应的注释写入复用库中对应标识符的注释字段;将该目标源代码中剩余的代码片段的标识符写入一文本相似度分析中间文件;
3)根据该文本相似度分析中间文件中记录的每一标识符及其对应代码片段生成一功能相似度信息;所述功能相似度信息为代码片段的语法树或控制流图
4)对于该文本相似度分析中间文件中的标识符,根据该目标源代码中该标识符对应的代码片段与该新版本该标识符对应的代码片段生成该标识符的克隆对;
5)利用代码克隆检测技术对每一克隆对的功能相似度进行分析,并将功能相似度大于设定阈值的克隆对对应的标识符在该目标源代码中的注释写入该复用库中该标识符的注释字段;
其中,检测所述克隆对的功能相似度的方法为:基于语法的检测技术生成该目标源代码中标识符对应的代码片段的抽象语法树以及该新版本该标识符对应的代码片段的抽象语法树;如果克隆对对应的两抽象语法树相似度大于设定阈值,则将该克隆对对应的标识符在该目标源代码中的注释写入该复用库中该标识符的注释字段;
或者,检测所述克隆对的功能相似度的方法为:基于语义的检测技术生成该目标源代码中标识符对应的代码片段的控制流图以及该新版本该标识符对应的代码片段的控制流图;如果克隆对对应的两控制流图相似度大于设定阈值,则将该克隆对对应的标识符在该目标源代码中的注释写入该复用库中该标识符的注释字段。
2.如权利要求1所述的方法,其特征在于,所述标识符信息包括函数、结构体、宏定义。
3.如权利要求1所述的方法,其特征在于,所述目标源代码的新版本为目标源代码的演化版本或升级版本。
4.如权利要求1或3所述的方法,其特征在于,所述复用库至少包含文件表和标识符表;
其中文件表包含文件名称、文件路径、文件类型、文件注释、对应版本,标识符表包含标识符名称、标识符类型、所属文件、标识符注释。
5.如权利要求1所述的方法,其特征在于,利用diff差异分析技术对该目标源代码与该新版本进行文本相似度分析。

说明书全文

一种基于相似度分析的源代码版本演化注释复用方法

技术领域

[0001] 本发明属于软件技术领域,涉及一种实用的基于相似度分析的源代码版本演化注释复用方法。

背景技术

[0002] 代码克隆检测技术是指在软件系统的源代码中找出具有高相似性的代码段,它是克隆研究领域的基础性工作,为后期更深入的探究提供基础数据。其中克隆代码是指程序员为了提高开发效率经常对软件系统的源代码进行拷贝粘贴及修改活动,这种重用机制通常会导致在源代码库中出现很多相同或相似的代码段。
[0003] 代码克隆检测包括四个级别:基于文本的检测,该方法是在软件系统的源代码上直接进行比较处理,属于纯文本比较技术。基于词法(token)的检测,首先使用词法分析工具将所有源代码的每一行转换成一个token序列,并将所有序列连接成一个token串;接着扫描这个token以查找相似的token子序列,然后报告这些相似子串所对应的源代码为克隆。基于语法的检测,根据相似的代码段应该也有相似的句法结构而设计的程序被解析成一棵语法树,其中相似的子树所对应的源代码段就是克隆代码。基于语义的检测,主要以PDG(ProcedureDependence Graph,程序依赖图)方法为代表,即给定一个程序,根据程序语句之间的数据流和控制依赖关系建立一个PDG的集合,在此集合中的同构子图所对应的代码段为克隆代码。基于文本的方法不需考虑程序句法的正确性,时空复杂度最低。基于词法(token)的方法拥有基于文本方法的优点,且独立于源代码,但误检率较高。基于语法的检测方法能有效地检测更多类型的克隆对,但由于需将源代码解析成AST(Abstract Syntax Tree,抽象语法树)后再查找相似子树,所以时空复杂度偏高。基于语义的检测技术从更高层面去分析获得程序的语义,该技术能检测到一些被打乱顺序但语义相同的代码段,但建立PDG和寻找同构子图代价高昂。
[0004] 源代码注释是为了提高源码可读性而进行的自然语言对应性文本描述,主要目的为了辅助程序员进行代码理解,提高软件系统的可维护性。源代码注释产生的途径多种多样,包括最基本的程序员手工编写、基于软件文档的工具自动生成、基于开放资源(如git log、开源社区和问答系统等)的自动提取和生成等,如果存在多个定制版本或演化版本,则注释可以来源于旧版本的复用数据。
[0005] 本发明涉及的代码克隆检测技术主要包括文本相似度和功能相似度两部分。基于文本相似度分析可以处理大部分可复用的注释数据,文本相似度分析无法处理的部分可选择性的交由功能相似度分析部分精细化处理,从而最大限度的复用原有注释数据。所述方法的文本相似度分析对应克隆检测技术中基于文本的检测方法,功能相似度分析可对应克隆检测技术中基于语法的检测方法或代价更高的基于语义的检测方法。

发明内容

[0006] 针对现有技术中存在的技术问题,本发明的目的在于提供一种基于相似度分析的源代码版本演化注释复用方法。通过所述方法可以高效的对开源软件的注释版本、定制版本等与主线版本分开的演化版本进行注释数据的复用,避免对全部代码进行手工注释工作,有效支撑其后续开发中对软件源代码的可维护性和可理解性。
[0007] 本发明的基于相似度分析的源代码版本演化注释复用方法,包括三部分,如图1所示,第一部分是复用版本初始化,第二部分是文本相似度分析,第三部分是功能相似度分析,具体描述如下:
[0008] 1)复用版本初始化:从软件仓库中检查是否存在目标源代码旧版本的演化版本或升级版本,通过ctags(Generate tag files for source code)对升级的新版本源代码进行遍历,生成相应新版本的标识符信息(标识符包括函数、结构体、宏定义等编程元素)并写入复用库;
[0009] 2)文本相似度分析:利用diff文本差异对比技术进行新旧版本文本相似度分析,从文本相同的代码片段中提取旧版本所包含的完整标识符并将这些标识符对应的旧版本注释写入复用库中新版本相应标识符的注释字段,从文本发生变化的代码片段中提取所包含的全部标识符并写入文本相似度分析中间文件;
[0010] 3)功能相似度分析:根据文本相似度分析中间文件记录的标识符及其对应的发生变化的代码片段逐条生成功能相似度信息(功能相似度信息可选对应代码片段的语法树或控制流图)。结合文本相似度分析中间文件遍历新旧版本,根据标识符所在的新旧版本文件路径信息是否相同标识对应的标识符形成克隆对(克隆对是指一对相似的代码段,所述方法的克隆对代码片段最小粒度为标识符,具体为目标源代码新旧版本对应的所属文件路径相同且包含的代码片段相似的标识符对为克隆对)。利用代码克隆检测技术逐对比较其功能相似度,并将可接受的功能近似克隆对(功能相似度大于设定的阈值即为可接受)标识符旧版本注释写入复用库中新版本标识符相应注释字段。
[0011] 下面对本发明方法进行具体说明。
[0012] 1)复用版本初始化
[0013] 判定是否存在目标源代码旧版本对应的新版本(即演化版本或升级版本),如果存在新版本,将其作为待注释版本加入注释复用系统。利用ctags遍历整个新版本的源代码,将其文件和对应标识符(例如函数、结构体、枚举类型、变量,宏定义等)信息提取并写入复用数据库,至少包含两张数据表。
[0014] a)文件表:包含文件名称、文件路径、文件类型、文件注释、对应版本等信息;
[0015] b)标识符表:包含标识符名称、标识符类型、所属文件、标识符注释等信息。
[0016] 2)文本相似度分析
[0017] 主要利用diff差异分析技术对比两个版本的文本差异,通过文本相似度可将比较代码进行如下分类。
[0018] a)完全未变化部分,新版本较旧版本完全未变的部分,该部分可以在新版本中直接复用。
[0019] b)变化部分,新版本较旧版本新增、改变或删除的标识符。其中新增标识符在旧版本中不存在相应注释数据,删除标识符在新版本中不存在对应源码,因此无需更多分析;改变的标识符作为后续功能相似度分析的对象需要进行重点的精细化分析。
[0020] c)不确定部分,非常见文件(如除了*.c、*.cpp、*.h之外的文件)中被判定为改变的标识符,或常见文件中被判定为改变的非常见标识符(如除了函数、结构体、宏定义、枚举类型、变量之外的标识符)。该部分亦作为后续功能相似度分析对象进行进一步分析。
[0021] 3)功能相似度分析
[0022] 针对标识符级别文本发生变化的部分,文本相似度分析技术无法进一步准确的处理。该部分在两个相邻版本升级的情况下相对于整个版本的代码体量而言,其变化体量较小。因此在准确度和性能开销两方面,该部分变化均比较适合使用开销更大的功能相似度分析技术进行精细化处理。所述方法可选的功能相似度分析技术包括两类,基于语法的检测和基于语义的检测,具体如下。
[0023] a)基于语法的检测,根据文本分析获得的变化部分代码片段所包含的标识符列表,逐个生成新旧版本代码片段对应的AST(抽象语法树)并进行减枝(AST基于整个文件及所属依赖关系生成,对待分析函数及其直接调用之外的节点进行减枝)。分析克隆对的抽象语法树相似子树,将相似子树占比在可接受范围内的对应标识符注释写入复用库。该方法对应的AST相对容易获取,分析代价可接受。
[0024] b)基于语义的检测,根据文本分析获得的变化部分代码片段所包含的标识符列表,逐个生成新旧版本代码片段对应的CFG(Control flow graph,控制流图)。分析克隆对的控制流图所包含的同构子图,将同构子图占比在可接受范围内的对应标识符注释写入复用库。该方法对应的CFG相对不易获取,分析同构子图代价高昂。
[0025] 具体的步骤如下:
[0026] 1)复用版本初始化,图2是复用版本初始化流程图,包括:
[0027] 1a)进入注释复用系统,检测是否存在源码演化升级版本。
[0028] 1b)如果不存在源码演化升级版本,进入1c),否则进入1f)。
[0029] 1c)人工加入目标源代码旧版本相应演化升级版本。
[0030] 1d)遍历1c)加入的演化升级版本,生成新版本标识符信息。
[0031] 1e)将1d)生成的信息写入复用数据库,进入1a)。
[0032] 1f)进行文本相似度分析。
[0033] 2)文本相似度分析,图3是文本相似度分析流程图,包括:
[0034] 2a)选择两个待比较版本,检测是否存在文本相似度比较数据。
[0035] 2b)如果不存在文本相似度比较数据,进入2c),否则进入2e)检测是否存在文本相似度分类数据。
[0036] 2c)进行文本相似度比较。可利用diff文本差异对比技术对待比较版本数据进行初步分析,识别出新版本较旧版本路径与文件内容完全未变化的文件及所包含的未变化的标识符列表,新版本较旧版本路径未变但文件内容有变化的文件及所包含的未变化的标识符列表,新版本较旧版本路径有所改变的文件。
[0037] 2d)将2c)中生成的路径和内容完全未变化的相同文本标识注释写入复用库,完成未变化部分代码的注释直接复用,进入2b)。
[0038] 2e)如果不存在文本相似度分类数据,进入2f),否则进入2h)。
[0039] 2f)进行文本相似度比较分类。将待比较版本中路径变化的文件和路径未变化但内容改变的文件数据进一步分析并分为3类:路径未变但内容有变化的常见标识符列表;新版本较旧版本路径有所改变的常见标识符列表;新版本较旧版本路径未变但文件内容有变化的非常见文件中的标识符及常见文件中的非常见标识符等不确定部分标识符列表。
[0040] 2g)根据2f)中的分析将分类结果写入文本相似度分析中间文件,进入2e)。
[0041] 2h)进行功能相似度分析。
[0042] 3)功能相似度分析,图4是功能相似度分析流程图,包括:
[0043] 3a)选择文本分析中间文件,检测文本分析中间文件中前两类数据的功能比对信息是否生成完毕。
[0044] 3b)如果控制流功能信息未生成完毕,进入3c),否则进入3e)检测功能信息比较是否完成。
[0045] 3c)对需要进行精细化分析的标识符逐条生成功能相似度信息,如语法分析所需的AST和语义分析所需的CFG信息。
[0046] 3d)将3c)生成的功能相似度信息写入功能相似度分析中间文件,进入3b)。
[0047] 3e)如果未完成功能信息比较,进入3f),否则进入3h)。
[0048] 3f)对需要精细化分析的克隆对逐个进行功能相似度对比。
[0049] 3g)将经过3f)对比后功能近似的标识符注释写入复用库,进入3e)。
[0050] 3h)结束相似度分析处理过程。
[0051] 与现有技术相比,本发明的积极效果为:
[0052] 本发明基于相似度分析技术,从源代码版本演化的度进行注释复用。特别涉及克隆检测技术中基于文本的检测、基于语法的检测和基于语义的检测技术,提出了一种实用的基于相似度分析的源代码版本演化注释复用方法。该方法首先初始化待复用的源码版本,生成该版本对应的文件和标识符等基本信息,然后利用基于文本的检测技术进行文本相似度分析,对相同的标识符进行注释复用。将变化的部分进行功能相似度分析,具体可根据实际情况选择基于语法的检测技术或基于语义的检测技术,从而最大化的进行注释复用。以往的源代码注释都来源于开发者或分析人员手工编写,该发明及所述方法提供了一种新的注释来源途径,解决了版本演化过程中对于定制版本进行快速代码理解的问题,有效支撑软件演化升级过程中代码的可理解性和可维护性。附图说明
[0053] 图1是基于相似度分析的源代码版本演化注释复用流程图。
[0054] 图2是复用版本初始化流程图。
[0055] 图3是文本相似度分析流程图。
[0056] 图4是功能相似度分析流程图。
[0057] 图5是实例“timeval_to_jiffies”在linux-3.5.4版本内核中对应源代码的PDG示意图。
[0058] 图6是实例“timeval_to_jiffies”在linux-3.19.8版本内核中对应源代码的PDG示意图。
[0059] 图7是图5、图6中重合部分的PDG示意图。

具体实施方式

[0060] 下面通过实施例对本发明作进一步的说明,但不以任何方式限制本发明的范围。
[0061] 本实施例设定如下使用场景:
[0062] 用户拥有linux-3.5.4版本内核部分注释,以及若干更高版本的内核源码(例如,linux-3.19.8)。由于内核在升级过程中存在大量未改变的函数或功能,用户需要使用本发明的方法将旧版本内核注释数据复用于新版本内核。
[0063] 1)在开始使用本发明提供的各项工具进行注释复用之前需保证数据库中已有关于linux-3.5.4版本内核的文件、标识符及注释等信息,如表1、表2所示。
[0064] 表1 linux-3.5.4版本内核文件表
[0065]
[0066] 表2 linux-3.5.4版本内核标识符表
[0067]
[0068]
[0069] 2)用户使用前文所述的复用版本初始化过程对新版本内核(例如,linux-3.19.8)源码进行处理。将新版本内核源码中的标识符信息存入数据库,如表3、表4所示。
[0070] 表3 linux-3.19.8版本内核文件表
[0071] fileid fileinfo version comment68400 /init/main.c linux-3.19.8  
64479 /fs/exec.c linux-3.19.8  
68575 /kernel/time/time.c linux-3.19.8  
[0072] 表4 linux-3.19.8版本内核标识符表
[0073] fileid symid symname line symtype comment68575 1190684 timeval_to_jiffies 626 23  
68575 1801236 __timespec_to_jiffies 573 23  
68575 227907 jiffies_to_timeval 633 23  
[0074] 3)采用本发明提供的文本相似度分析方法,将新版本内核的标识符分为未改变标识符、变化标识符、不确定标识符3类。将未改变标识符的注释写入复用库的相应注释字段,将变化标识符及不确定标识符写入文本相似度分析中间文件。至此文本相似度处理过程结束。表5给出了文本相似度分析中间文件中部分数据实例:
[0075] 表5经文本相似度分析后变化标识符示意表
[0076]
[0077] 4)采用本发明提供的功能相似度分析方法,对文本相似度分析过程中产生的变化标识符和不确定标识符进行语法或语义分析,通过对比新旧版本内核源码克隆对的AST或CFG,将功能相似的标识符写入复用库的相应注释字段,将其他标识符写入功能相似度分析中间文件。至此功能相似度处理过程及整体基于相似度分析的源代码版本演化注释复用过程结束。
[0078] 表5中实例“timeval_to_jiffies”分别在linux-3.5.4与linux-3.19.8版本内核中对应的源代码为:
[0079]
[0080] 由源码可知,timeval_to_jiffies在两版本内核中改变了路径及实现方式,且直接文本相似度不高。
[0081] 通过进一步分析源码可发现,在linux-3.19.8内核版本中的timeval_to_jiffies函数调用了__timespec_to_jiffies函数,/kernel/time/time.c/__timeval_to_jiffies(0573)(linux-3.19.8)源码为:
[0082]
[0083] 而该函数的实现与linux-3.5.4内核版本中的timeval_to_jiffies函数功能相同。即timeval_to_jiffies在两版本内核中功能相同。
[0084] 图5、图6给出了表5中实例“timeval_to_jiffies”分别在linux-3.5.4与linux-3.19.8版本内核中对应源代码的PDG示意图。图7给出了图5、图6中重合部分的PDG示意图,其中重合节点17个,与linux-3.5.4版本内核中实例“timeval_to_jiffies”PDG示意图的相似度约为85%,由此判断,虽然timeval_to_jiffies在两版本内核中改变了路径及实现方式,但其功能未变,可对注释进行复用。
[0085] 5)通过以上步骤的分析处理获得了大量可复用的标识符及其注释信息。将这些信息进行复用可得到关于新版本的标识符注释。内核开发人员可利用这些注释辅助理解源码或在这些注释的基础上编辑、新增注释。
[0086] 以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求所述为准。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈