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

技术编号:15638778 阅读:51 留言:0更新日期:2017-06-15 19:22
本发明专利技术公开了一种基于相似度分析的源代码版本演化注释复用方法。本方法为:1)查找目标源代码的新版本,生成该新版本的标识符信息并写入复用库;2)对该目标源代码与该新版本进行文本相似度分析,将该目标源代码中与该新版本相同的代码片段的标识符对应的注释写入复用库中对应注释字段,剩余代码片段的标识符写入一中间文件;3)根据该中间文件中每一标识符及其对应代码片段生成一功能相似度信息;4)对于该中间文件中的标识符,根据该目标源代码中该标识符对应的代码片段与该新版本该标识符对应的代码片段生成该标识符的克隆对;5)将功能相似度大于设定阈值的克隆对对应的标识符在该目标源代码中的注释写入该复用库中该标识符的注释字段。

【技术实现步骤摘要】
一种基于相似度分析的源代码版本演化注释复用方法
本专利技术属于软件
,涉及一种实用的基于相似度分析的源代码版本演化注释复用方法。
技术介绍
代码克隆检测技术是指在软件系统的源代码中找出具有高相似性的代码段,它是克隆研究领域的基础性工作,为后期更深入的探究提供基础数据。其中克隆代码是指程序员为了提高开发效率经常对软件系统的源代码进行拷贝粘贴及修改活动,这种重用机制通常会导致在源代码库中出现很多相同或相似的代码段。代码克隆检测包括四个级别:基于文本的检测,该方法是在软件系统的源代码上直接进行比较处理,属于纯文本比较技术。基于词法(token)的检测,首先使用词法分析工具将所有源代码的每一行转换成一个token序列,并将所有序列连接成一个token串;接着扫描这个token以查找相似的token子序列,然后报告这些相似子串所对应的源代码为克隆。基于语法的检测,根据相似的代码段应该也有相似的句法结构而设计的程序被解析成一棵语法树,其中相似的子树所对应的源代码段就是克隆代码。基于语义的检测,主要以PDG(ProcedureDependenceGraph,程序依赖图)方法为代表,即给定一个程序,根据程序语句之间的数据流和控制依赖关系建立一个PDG的集合,在此集合中的同构子图所对应的代码段为克隆代码。基于文本的方法不需考虑程序句法的正确性,时空复杂度最低。基于词法(token)的方法拥有基于文本方法的优点,且独立于源代码,但误检率较高。基于语法的检测方法能有效地检测更多类型的克隆对,但由于需将源代码解析成AST(AbstractSyntaxTree,抽象语法树)后再查找相似子树,所以时空复杂度偏高。基于语义的检测技术从更高层面去分析获得程序的语义,该技术能检测到一些被打乱顺序但语义相同的代码段,但建立PDG和寻找同构子图代价高昂。源代码注释是为了提高源码可读性而进行的自然语言对应性文本描述,主要目的为了辅助程序员进行代码理解,提高软件系统的可维护性。源代码注释产生的途径多种多样,包括最基本的程序员手工编写、基于软件文档的工具自动生成、基于开放资源(如gitlog、开源社区和问答系统等)的自动提取和生成等,如果存在多个定制版本或演化版本,则注释可以来源于旧版本的复用数据。本专利技术涉及的代码克隆检测技术主要包括文本相似度和功能相似度两部分。基于文本相似度分析可以处理大部分可复用的注释数据,文本相似度分析无法处理的部分可选择性的交由功能相似度分析部分精细化处理,从而最大限度的复用原有注释数据。所述方法的文本相似度分析对应克隆检测技术中基于文本的检测方法,功能相似度分析可对应克隆检测技术中基于语法的检测方法或代价更高的基于语义的检测方法。
技术实现思路
针对现有技术中存在的技术问题,本专利技术的目的在于提供一种基于相似度分析的源代码版本演化注释复用方法。通过所述方法可以高效的对开源软件的注释版本、定制版本等与主线版本分开的演化版本进行注释数据的复用,避免对全部代码进行手工注释工作,有效支撑其后续开发中对软件源代码的可维护性和可理解性。本专利技术的基于相似度分析的源代码版本演化注释复用方法,包括三部分,如图1所示,第一部分是复用版本初始化,第二部分是文本相似度分析,第三部分是功能相似度分析,具体描述如下:1)复用版本初始化:从软件仓库中检查是否存在目标源代码旧版本的演化版本或升级版本,通过ctags(Generatetagfilesforsourcecode)对升级的新版本源代码进行遍历,生成相应新版本的标识符信息(标识符包括函数、结构体、宏定义等编程元素)并写入复用库;2)文本相似度分析:利用diff文本差异对比技术进行新旧版本文本相似度分析,从文本相同的代码片段中提取旧版本所包含的完整标识符并将这些标识符对应的旧版本注释写入复用库中新版本相应标识符的注释字段,从文本发生变化的代码片段中提取所包含的全部标识符并写入文本相似度分析中间文件;3)功能相似度分析:根据文本相似度分析中间文件记录的标识符及其对应的发生变化的代码片段逐条生成功能相似度信息(功能相似度信息可选对应代码片段的语法树或控制流图)。结合文本相似度分析中间文件遍历新旧版本,根据标识符所在的新旧版本文件路径信息是否相同标识对应的标识符形成克隆对(克隆对是指一对相似的代码段,所述方法的克隆对代码片段最小粒度为标识符,具体为目标源代码新旧版本对应的所属文件路径相同且包含的代码片段相似的标识符对为克隆对)。利用代码克隆检测技术逐对比较其功能相似度,并将可接受的功能近似克隆对(功能相似度大于设定的阈值即为可接受)标识符旧版本注释写入复用库中新版本标识符相应注释字段。下面对本专利技术方法进行具体说明。1)复用版本初始化判定是否存在目标源代码旧版本对应的新版本(即演化版本或升级版本),如果存在新版本,将其作为待注释版本加入注释复用系统。利用ctags遍历整个新版本的源代码,将其文件和对应标识符(例如函数、结构体、枚举类型、变量,宏定义等)信息提取并写入复用数据库,至少包含两张数据表。a)文件表:包含文件名称、文件路径、文件类型、文件注释、对应版本等信息;b)标识符表:包含标识符名称、标识符类型、所属文件、标识符注释等信息。2)文本相似度分析主要利用diff差异分析技术对比两个版本的文本差异,通过文本相似度可将比较代码进行如下分类。a)完全未变化部分,新版本较旧版本完全未变的部分,该部分可以在新版本中直接复用。b)变化部分,新版本较旧版本新增、改变或删除的标识符。其中新增标识符在旧版本中不存在相应注释数据,删除标识符在新版本中不存在对应源码,因此无需更多分析;改变的标识符作为后续功能相似度分析的对象需要进行重点的精细化分析。c)不确定部分,非常见文件(如除了*.c、*.cpp、*.h之外的文件)中被判定为改变的标识符,或常见文件中被判定为改变的非常见标识符(如除了函数、结构体、宏定义、枚举类型、变量之外的标识符)。该部分亦作为后续功能相似度分析对象进行进一步分析。3)功能相似度分析针对标识符级别文本发生变化的部分,文本相似度分析技术无法进一步准确的处理。该部分在两个相邻版本升级的情况下相对于整个版本的代码体量而言,其变化体量较小。因此在准确度和性能开销两方面,该部分变化均比较适合使用开销更大的功能相似度分析技术进行精细化处理。所述方法可选的功能相似度分析技术包括两类,基于语法的检测和基于语义的检测,具体如下。a)基于语法的检测,根据文本分析获得的变化部分代码片段所包含的标识符列表,逐个生成新旧版本代码片段对应的AST(抽象语法树)并进行减枝(AST基于整个文件及所属依赖关系生成,对待分析函数及其直接调用之外的节点进行减枝)。分析克隆对的抽象语法树相似子树,将相似子树占比在可接受范围内的对应标识符注释写入复用库。该方法对应的AST相对容易获取,分析代价可接受。b)基于语义的检测,根据文本分析获得的变化部分代码片段所包含的标识符列表,逐个生成新旧版本代码片段对应的CFG(Controlflowgraph,控制流图)。分析克隆对的控制流图所包含的同构子图,将同构子图占比在可接受范围内的对应标识符注释写入复用库。该方法对应的CFG相对不易获取,分析同构子图代价高昂。具体的步骤如下:1)本文档来自技高网
...
一种基于相似度分析的源代码版本演化注释复用方法

【技术保护点】
一种基于相似度分析的源代码版本演化注释复用方法,其步骤为:1)查找目标源代码的新版本,对该新版本进行遍历,生成该新版本的标识符信息并写入复用库;2)对该目标源代码与该新版本进行文本相似度分析,将该目标源代码中与该新版本相同的代码片段的标识符对应的注释写入复用库中对应标识符的注释字段;将该目标源代码中剩余的代码片段的标识符写入一文本相似度分析中间文件;3)根据该文本相似度分析中间文件中记录的每一标识符及其对应代码片段生成一功能相似度信息;4)对于该文本相似度分析中间文件中的标识符,根据该目标源代码中该标识符对应的代码片段与该新版本该标识符对应的代码片段生成该标识符的克隆对;5)利用代码克隆检测技术对每一克隆对的功能相似度进行分析,并将功能相似度大于设定阈值的克隆对对应的标识符在该目标源代码中的注释写入该复用库中该标识符的注释字段。

【技术特征摘要】
1.一种基于相似度分析的源代码版本演化注释复用方法,其步骤为:1)查找目标源代码的新版本,对该新版本进行遍历,生成该新版本的标识符信息并写入复用库;2)对该目标源代码与该新版本进行文本相似度分析,将该目标源代码中与该新版本相同的代码片段的标识符对应的注释写入复用库中对应标识符的注释字段;将该目标源代码中剩余的代码片段的标识符写入一文本相似度分析中间文件;3)根据该文本相似度分析中间文件中记录的每一标识符及其对应代码片段生成一功能相似度信息;4)对于该文本相似度分析中间文件中的标识符,根据该目标源代码中该标识符对应的代码片段与该新版本该标识符对应的代码片段生成该标识符的克隆对;5)利用代码克隆检测技术对每一克隆对的功能相似度进行分析,并将功能相似度大于设定阈值的克隆对对应的标识符在该目标源代码中的注释写入该复用库中该标识符的注释字段。2.如权利要求1所述的方法,其特征在于,所述标识符信息包括函数、结构体、宏定义。3.如权利要求1所述的方法,其特征在于,所述目标源代码的新版本为目标源代码的演化版本或升级版本。4.如权利要求1或3所述的方法,其特征在于,所述复用库至...

【专利技术属性】
技术研发人员:李斌贾荻陈晨余海贺也平
申请(专利权)人:中国科学院软件研究所
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1