CN107203468A - 一种基于ast的软件版本演化对比分析方法 - Google Patents
一种基于ast的软件版本演化对比分析方法 Download PDFInfo
- Publication number
- CN107203468A CN107203468A CN201710258269.3A CN201710258269A CN107203468A CN 107203468 A CN107203468 A CN 107203468A CN 201710258269 A CN201710258269 A CN 201710258269A CN 107203468 A CN107203468 A CN 107203468A
- Authority
- CN
- China
- Prior art keywords
- module
- information
- evolution
- ast
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- 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/3604—Software analysis for verifying properties of programs
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供的是一种基于AST的软件版本演化对比分析方法。通过Unix的Diff命令对两个软件版本源码进行比对分析,将变化的源码分为三种源码块;通过语法分析器获取两个软件版本源码的AST信息,分析获取每一种源码块的每一行代码对应的AST信息;通过将获取的语法结点信息组合成一个组合信息,将标识一样的相邻代码行组合成模块;通过以模块为单位对比分析两个源码块的标识信息,根据模块演化情况进行分类分析,使用预处理、二次处理方法处理各种演化情况,并将演化信息存入数据库中,并转换成HTML代码。本发明和其他软件版本演化对比分析方法相比,能提高获取演化信息的准确率,并能提高软件版本演化分析的效率。
Description
技术领域
本发明涉及的是一种软件版本演化对比分析方法,具体地说是一种以Diff为基础的AST 软件版本演化对比分析方法。
背景技术
软件版本演化分析,其本质都是针对软件源码进行差异分析,针对软件演化分析的方法和源码差异分析方法,介绍本发明的技术背景。
软件演化分为动态演化和静态演化,动态演化也称在线演化,是指在软件执行期间演化,静态演化更多的是对软件版本源码差异内容的一个理解和展示,接下来阐述的软件版本演化只是针对静态演化。主要是介绍的是与源码差异分析方法相关的,静态演化相关的软件版本演化分析方法。
目前,在软件版本演化分析方面,根据其分析的粒度主要分为四个分类进行研究,第一个分类是针对源码的增加、删除、修改和未改的代码行数进行进一步研究。第二个分类是针对增加、删除、修改和未改的类函数等语法结构进一步研究,通过将软件版本的变化分为47 种来理解软件演化的过程,到底是什么决定了软件演化的走向,其种类划分的依据是类函数等语法结构的属性参数和语句的种类,如函数的参数改变了是一种变化的种类,语句则有条件、循环和else语句等。其中比较有代表性的是一种改进的基于AST的软件演化分析方法,该方法是基于AST编辑距离(Levenshtein Distance,LD)的方法的改进,基于AST编辑距离 (Levenshtein Distance,LD)方法通常被用于输入字符串的快速模糊匹配、英文辅助,写作等领域,是一种经典而广为使用的方法。早在1996年的时候有人将LD算法的思想迁移到源码的对比,Chawathe提出了基于AST的最短编辑距离算法分析分层结构化代码,假设分层结构化代码都是对称的,类函数等模块的语法结点都是一样的,只是具体属性有所变化。基于此方法思想,提出了一种改进的基于AST的软件演化分析方法,提高了算法的效率和准确性,将算法的适用范围拓宽了,不只限于分层结构化代码。
第三个分类是针对改变和未变的代码进行视图显示,然后进行进一步研究,从文本和软件工程两个角度分析,通过完善diff的工作,构造了一个VCN(Visual CodeNavigator),通过视图显示演化信息,可视化的理解版本演化规律,但是VCN只支持C/C++。第四个分类是针对软件源码的模型进行研究,模型映射与比较可以用于软件复用和软件版本演化分析研究虽然能很好的满足软件开发者的需求,但是需要对软件版本的模型进行获取分析,有的软件版本无法获取模型,总的来说这个方法操作难度较大。针对每一个方向都有各种实现方式,每一种方式也有各自的优缺点。
从这些研究者的研究内容看出,虽然软件版本演化分析算法和源码的差异分析算法种类繁多,但是大多是从语义的角度切入,基于AST的版本演化对比分析已经成为了源码分析的热点。相对于原有的静态源码分析,针对整个的源码版本的整体架构的分析算法,演化分析的准确性和效率都不高。
发明内容
本发明的目的在于提供一种能提高获取演化信息的准确率,并能提高软件版本演化分析效率的基于AST的软件版本演化对比分析方法。
本发明的目的是这样实现的:
步骤一:通过Unix的Diff命令对两个软件版本源码进行比对分析,根据分析结果文件 Patch获取代码行的增加、删除、改变的情况,将变化的源码分为三种源码块;
步骤二:通过语法分析器获取两个软件版本源码的AST信息,针对第一步分析出的三种源码块,分析获取每一种源码块的每一行代码对应的AST信息;
步骤三:通过将获取的语法结点信息组合成一个组合信息,使用该组合信息标识对应行,将标识一样的相邻代码行组合成模块;
步骤四:通过以模块为单位对比分析两个源码块的标识信息,根据模块演化情况进行分类分析,使用预处理、二次处理方法处理各种演化情况,并将演化信息存入数据库中,并转换成HTML代码。
本发明还可以包括:
1、步骤一中所述的将变化的源码分为三种源码块具体包括:增加、删除、改变,将变化的源码分类成增加的源码块、删除的源码块和改变的源码块存储,以此为基础进行进一步的分析处理。
2、步骤二中所述的分析获取每一种源码块的每一行代码对应的AST信息具体包括:
1)使用广度优先的搜索算法,根据行号逐个匹配ANTLR生成的抽象语法树结点;
2)如果行号在结点的所属的范围内,逐个匹配此结点的子结点,直到找到完全匹配的行号结点;
3)使用语法分析器获取当前行的语法元素以及上层语法元素,直到该源码文件的顶层类或者函数、结构体、枚举类和共用体。
3、步骤三所述的组合信息的获取,是使用标签***标识,它是类、函数、结构体、枚举类和共用体模块的一个唯一标识,使用多个标识组合成一个标识代码行的组合信息,标签***设计的方法是:
a)模块的关键字是模块的名字加上相应的属性信息字符;
b)模块的标识是使用多个字值对组合而成的,每两个字值对之间都使用一个“@”字符来分隔;
c)模块的层级标识之间使用“#”来分隔;
d)全局变量,预编译处理和普通代码行的关键字为stmSource,值为tempty。
4、步骤三中所述的组合成模块,是根据标签***对Diff划分的源码块,进一步细分模块,具体划分模块的步骤如下:
1)针对Diff分析出的变化的源码块,根据行号获取每一行代码的标签信息;
2)比对相邻行代码的标签信息,根据比对情况分为两种情况,一种是完整模块,此模块的开始行必须和它之前一行的标签不一样,并且模块中间的每一行代码的标签是一样的,另外此模块的结束行必须和它之后的一行的标签也不一样,否则就不是一个完整模块;
3)根据分析出的两种情况,填充模块信息数据结构,所述信息数据结构包括模块的开始行、结束行、模块的类型、模块的标签信息。
5、步骤四中所述的根据模块演化情况进行分类分析具体包括:进行类、函数信息的深入匹配分析,将两个不同版本的对应信息和信息的固定格式进行对比,如果两者都存在,而且有所改变,就是改变演化,如果旧版本没有,存在增加演化,如果新版本没有,存在删除演化,如函数模块的函数参数演化,函数模块的返回值演化。
6、步骤四中所述的使用预处理、二次处理方法处理各种演化情况是一个递归过程,即每一次处理都需要预处理,所述预处理是一次正常对不同版本的同名源码文件所有变化进行分析并将分析的结果进行存储,如果分析到diff分析有误,就进入二次处理,如果二次处理也再遇到diff分析错误,然后再进行预处理、二次处理,直到分析正确。
随着软件行业的蓬勃发展,软件越来越复杂,软件版本迭代次数越来越多,开发者接触到的源代码越来越多,同时这些软件架构也越来越复杂,软件演化的规律也就愈加模糊,这就增加了开发者理解和维护软件的难度。本发明提出了一种以Diff为基础的AST软件版本演化对比分析方法,获取类函数等模块的演化信息,为软件版本演化的理解提供依据,并提高了软件版本演化分析的准确率和效率。本发明的核心是面向软件版本变化处的源码,将变化处源码的层次和关系更加精确、高效的体现出来,并迁移到软件版本演化,致力于给用户提供一个指导,减少软件版本理解和维护的难度。
本发明的效果主要体现在:
现有的主流的软件版本演化对比分析方法都是基于AST的,传统的软件演化分析大都是基于抽象语法树的相似度匹配,并以此为基础进行语法和语义信息的分析。但是相似就存在误差,而且相似度的匹配需要与所有相似的对象匹配,效率不高。
现有的比较高效的软件版本演化分析方法是,基于编辑距离(LevenshteinDistance,LD) 算法的一种改进的基于AST的软件演化分析方法。LD通常被用于输入字符串的快速模糊匹配、英文辅助,写作等领域,是一种经典而广为使用的方法。将LD算法的思想迁移到源码的对比,基于AST的最短编辑距离算法分析分层结构化代码,假设分层结构化代码都是对称的,类函数等模块的语法结点都是一样的,只是具体属性有所变化。基于此方法思想,提出了一种改进的基于AST的软件演化分析方法,提高了算法的效率和准确性,将算法的适用范围拓宽了,不只限于分层结构化代码。
将LD算法从字符串的匹配应用到AST,其基本思想是一样的。基于AST的最短编辑距离算法将问题分为三个步骤:
1)根据自定义规则,将AST转换成需要的树。
2)找到树T1和T2的结点间的合适匹配集合。
3)根据匹配集合,找到最小将树T1转化为T2的编辑距离。
第一步需要将AST转换成自己分析时所需的树,那么源码中所有的模块信息都要根据树的信息对应存储,每一个结点的匹配都需要遍历对应的存储信息,工作量很大,在大规模软件版本的演化分析中代价很高。也有的研究者将每一个结点映射成一个Hash值,然后再进行匹配,虽然每一个结点的匹配过程会有一定的优化,但是基于AST的最短编辑举例算法还是必须将每一个结点映射存储,分析时根据树的编辑距离对每一个结点确定演化情况。自然存储的信息越多,遍历AST时对比分析的效率就越低。而本发明是根据变化的代码行定位获取 AST信息,无需遍历整个AST树。
第二步是根据结点间的距离来匹配两个结点,结点间的距离是通过结点的结构和结点的类型分析,以及结合结点间的距离公式计算结点间的距离值,最后根据阈值确定结点是否匹配,其中距离公式和阈值是一个不稳定因素,很有可能导致误匹配和遗漏匹配的情况。
本发明是根据Diff分析源码的变化,使用语法分析器获取的源码AST信息修正Diff分析的结果,从语义上分析和修正Diff的错误分析,如将一个改变的代码情况分析成增加和删除。使用Diff分析能准确分析出文本上的变化,使接下来的分析基础非常高效准确。结合 AST分析,设计并使用了标签***,能高效的标识类函数等模块信息,可以根据本发明使用的方法能高效的分析出类、函数、结构体、共用体等模块结构的演化信息。
根据上述分析以及实验表明,本发明和其他软件版本演化对比分析方法相比,能提高获取演化信息的准确率,并能提高软件版本演化分析的效率。能有效分析出类函数等模块结构的演化信息,弥补了Diff分析的不足,对git,cvs等源码版本管理工具有更详细的指导作用,对阅读源码、维护***方面都有很好的指导作用。开发者可以借此方法来指导先期探索,加快理解工程,提升开发效率。进一步的发展,可以借此方法完成功能模块的复用。
附图说明
图1为***架构图Diff源码版本对比例子图;
图2为源码版本V1和V2的Diff分析正常格式结果图;
图3为add函数源码图;
图4为源码对应的AST图;
图5为语法树节点对应的行号图;
图6为类函数等模块标签信息的获取流程图;
图7为模块信息表图;
图8为软件版本演化差异分析流程图;
图9为配置文件configure.txt内容图;
图10为测试环境结构图。
具体实施方式
下面举例对本发明做更详细的描述。
本发明的基于AST的软件版本演化对比分析方法,主要包括如下几个步骤:
步骤一:通过Unix的Diff命令对两个软件版本源码进行比对分析,根据分析结果文件 Patch获取代码行的增加、删除、改变的情况,将变化的源码分为三种源码块。
步骤二:通过语法分析器获取两个软件版本源码的AST信息,针对第一步分析出的三种源码块,分析获取每一种源码块的每一行代码对应的AST信息。
步骤三:通过将获取的语法结点信息组合成一个信息,使用该组合信息标识对应行,将标识一样的相邻代码行组合成模块。
步骤四:通过以模块为单位对比分析两个源码块的标识信息,根据模块演化情况进行分类分析,使用预处理、二次处理等方法灵活处理各种演化情况,并将演化信息存入数据库中,并转换成HTML代码;
步骤一将变化的源码分为三种源码块,增加、删除、改变,将变化的源码分类成增加的源码块,删除的源码块和改变的源码块存储,以此为基础进行进一步的分析处理,使处理流程更加合理、清晰。
步骤二获取的每一行代码对应的AST信息,本发明的获取的代码行对应的AST信息的方法,会将使用语法分析器获取的源码的AST的冗余信息去除,并无需遍历整个抽象语法树。具体的获取步骤如下:
1)使用广度优先的搜索算法,根据行号逐个匹配ANTLR生成的抽象语法树结点;
2)如果行号在结点的所属的范围内,会逐个匹配此结点的子结点,直到找到完全匹配的行号结点;
3)使用语法分析器获取当前行的语法元素以及上层语法元素,直到该源码文件的顶层类或者函数的类、函数、结构体、枚举类和共用体。
步骤三获取标识代码行的组合信息,是使用本发明设计的标签***标识,它是类、函数、结构体、枚举类和共用体模块的一个唯一标识。使用多个标识组合成一个标识代码行的组合信息,标签***是进一步细分模块的标准,设计的原则是:
1)模块的关键字是模块的名字加上相应的属性信息字符,如类的名字,使用“className”关键字。
2)模块的标识是使用多个字值对(关键字+“@”+值)组合而成的,每两个字值对之间都使用一个“@”字符来分隔。
3)模块的层级标识之间使用“#”来分隔,如类中的函数,className@math#function Name@add。
4)全局变量,预编译处理和普通代码行的关键字为stmSource,值为tempty
步骤三组合成的模块,是根据标签***对Diff划分的源码块,进一步细分模块,如类模块,函数模块。具体划分模块的步骤如下:
1)针对Diff分析出的变化的源码块,根据行号获取每一行代码的标签信息。
2)比对相邻行代码的标签信息,根据比对情况分为两种情况,一种是完整模块,此模块的开始行必须和它之前一行的标签不一样,并且模块中间的每一行代码的标签是一样的,另外此模块的结束行必须和它之后的一行的标签也不一样,否则就不是一个完整模块。
3)根据第二步分析出的两种情况,填充模块信息数据结构,如模块的开始行,结束行,模块的类型,模块的标签信息。
步骤四进行类、函数等信息的深入匹配分析,将两个不同版本的对应的信息和信息的固定格式进行对比,如果两者都存在,而且有所改变,就是改变演化,如果旧版本没有,存在增加演化,如果新版本没有,存在删除演化,如函数模块的函数参数演化,函数模块的返回值演化。
步骤四所描述的预处理和二次处理是一个递归过程,就是每一次处理都需要预处理,预处理是一次正常对不同版本的同名源码文件所有变化进行分析并将分析的结果进行存储。如果分析到diff分析有误,就会进入二次处理,二次处理也可能遇到diff分析错误,然后再进行预处理、二次处理,直到分析正确,预处理需要将分析到的数据分别存储。
由于对许多文件对比软件只能区分文件夹和文件变化的粗粒度信息,显示哪几行有增删改,因此鉴于此种情况,本发明着眼于基于AST的软件版本演化分析算法研究,主要研究的内容是准确定位存在演化信息的AST结点,分析获取类函数等模块的属性信息,并对演化情况进行分类,分析各种演化情况,提高演化分析的准确率和效率。本发明的研究由以下几部分内容组成:
1)如何准确定位存在演化信息的AST结点,本发明通过Diff能准确定位变化的行号,根据行号能准确定位源码AST存在演化的结点,但是Diff分析出的结果存在错误,需要修正,如将一个改变的代码情况分析成增加和删除。
2)如何分析获取类函数等模块的属性信息,本发明根据源码的AST结点信息,分析每一类模块的结点特点,并获取属性信息。
3)演化情况的分类及分析,本发明根据模块的属性信息,对演化情况分类,然后根据其特点设计相应的方法。
由于演化情况的多种多样,具体的方法是由解决多个具体问题的具体方法组合实现的。整个方法流程主要涉及以下几个部分:
1)Diff分析结果划分
Diff是基于LCS算法实现的,用来对比分析新旧两个版本文件的异同。操作方法是在***终端界面中,输入:$diff<旧版本文件><新版本文件>。Diff的文本显示不太友好,为了便于说明,举例C++文件如附图1所示。
Diff有三种显示格式:正常格式,上下文格式和合并格式,下面会介绍本发明使用的正常格式。
现在对V1和V2进行比较:$diff V1V2,此时,Diff就会显示正常格式的结果如附图2 所示。
每一个显示部分都分为三部分:第一行是一个提示,用来说明变动位置,第一个"3",表示V1的第3行有变化;"c"(change)是一种改变模式的缩写,另外还有两个模式,分别为 "a"(addition)代表增加和"d"(deletion)代表删除;第二个"3",表示前面显示的V1的第3行变成V2的第3行。第二行分成两个部分,开头的小于号,表示要从V1当中删除第4 行,"return 0;"表示该行的内容。第三行用来分割V1和V2,第四行,类似于第二行,前面的大于号表示V2增加了该行,后面的"return 1;"表示该行的内容。
对两个源码版本进行一次Diff会生成一个Patch文件,该Patch文件包含了新旧源码变化的对应的行号,而此处的行号,本发明会将其对应成一个源码块。根据Diff分析的行号对应的增加、删除、改变变化,总共有三种源码块,第一种是删除的源码块,第二种是增加的源码块,第三种是改变的源码块。由于Diff是针对文本行进行的LCS的处理,因此没有语义信息,而且这种模块的划分,不会包含任何语义信息。另外对于一个模块的位置变化,大多会分析成增加和删除的改变。因此需要提出一种新的模块划分方法,这种方法需要体现语义信息,而且能进行更加高层次的演化分析,例如函数的参数变了,类的继承关系变了。
2)标签***设计
标签***是类、函数、结构体、枚举类和共用体模块的一个唯一标识,根据标签***针对Diff划分的源码块,进一步细分模块,如类模块,函数模块。因此标签***是进一步细分模块的标准,这个标签***设计的原则是:
(1)模块的关键字是模块的名字加上相应的属性信息字符,如类的名字,使用“className”关键字。
(2)模块的标识是使用多个字值对(关键字+“@”+值)组合而成的,每两个字值对之间都使用一个“@”字符来分隔。
(3)模块的层级标识之间使用“#”来分隔,如类中的函数,className@math#function Name@add。
全局变量,预编译处理和普通代码行的关键字为stmSource,值为tempty
接下来就是关于各个模块的各个关键字的介绍,具体如下:
(1)类的关键字
类模板:classTemplate@template,这里的template是为了凑字值对,没有实际值。
类模板参数:classTemplateParameter@(typenameT),模板参数是T。
类名:className@Math,一个名为Math的类。
类继承:classRelation@public Circle,本类继承自Circle类。
(2)函数的关键字
函数模板:functionTemplate@template,这里的template是为了凑字值对,没有实际值。
函数模板参数:functionTemplateParameter@(typenameT),模板参数是T。
内联函数:inlineFunction@inline,这里的inline是为了凑字值对,没有实际值。
函数的返回值:functionReturn@int,这个函数的返回值是int。
函数名:functionName@Add,一个名为Add的函数。
函数参数:functionParameters@(inta),此函数的参数是一个名为a的int类型。
其它的模块,如结构体、枚举类和共用体的标识都比较简单,这里就不一一赘述了。
3)基于AST的标签***信息的获取
本发明是以Diff分析为基础的,Diff分析出的变化是针对源码的具体行的,而本发明是对每一行代码进行类函数等模块的标签标识的,其关键字信息值的获取是关键。本发明有别于其它的基于AST的演化分析是由于本发明是根据行号定位AST的关键字信息,无需遍历整个抽象语法树,这种方式增加了大型版本的软件版本演化分析的能力,提高了效率和准确率。ANTLR分析出的抽象语法树的每一个节点是有对应的行号信息的,如附图3中源代码对应的ANTLR生成的AST如附图4所示,该图中存在很多冗余信息,尤其是具体的变量和语句。将AST的冗余信息去除,处理过的语法树的行号信息如附图5所示。
本发明使用广度优先的搜索算法,根据行号逐个匹配ANTLR生成的抽象语法树结点,如果行号在结点的所属的范围内,会逐个匹配此结点的子结点,直到找到完全匹配的行号结点。如本例中,如果要找行号2所对应的标签信息,从根结点开始匹配,行号2的结点在根结点所属范围1~3之间,会继续搜索根结点的子结点,从左边第一个子结点开始,直到搜索到函数体的结点完全匹配。然后获取函数体结点的父结点的第一个子结点信息,如函数名字,函数返回值类型,函数参数。最终将获取的信息加上预先定义关键字的标签信息,整个完整信息如下:
functionReturn@int@functionName@add@functionParameters@(inta,intb)
上述例子的语法树结点信息是经过处理的,实际的结点信息比较复杂,获取AST信息的关键结点信息的具体流程如附图6所示。
其中的结点名都是AST中的表达,它和实际模块结点信息一一对应,本发明需要获取类、函数、结构体、枚举类和共用体模块的AST信息,然后才能使用标签***。本发明只举例介绍类函数的详细标签信息获取,其它模块的标签信息获取,与此类似。附图6中的流程图首先会根据上述定位代码行结点信息的方法获取代码行的结点信息,然后根据结点的名字信息和子结点信息的内容获取类函数模块的具体信息,最后循着AST树的父结点一直遍历到根节点,将遍历到的模块信息组合成标签信息。
4)基于标签***的分模块处理
当能获取每一行代码的标签之后,本发明就能将每一行代码按标签进行分类,分模块。为此本发明设计了一个数据结构来存储模块信息,具体模块信息如附图7所示,其中的名字标签,就是语法标签去掉了一些语法信息的结果,只有由每一个模块的名字标签组合在一起的字符串。其中Type信息表示的是整个完整模块的类型,如一个完整的函数,而标号7则表示这块的代码只有模块的一部分,例如只是函数其中的某一块有演化,有可能是函数中增加了一行代码。有了模块信息之后就能分模块处理,具体的步骤如下:
第一步,针对Diff分析出的变化的源码块,根据行号获取每一行代码的标签信息,这里有两种标签,一种是名字标签,一种是语法标签。
第二步,比对相邻行代码的两种标签信息,根据比对情况分为两种情况,一种是完整模块,就是附图7中Type为1-5的整个模块的信息,此模块的开始行必须和它之前一行的标签不一样,并且模块中间的每一行代码的标签是一样的,另外此模块的结束行必须和它之后的一行的标签也不一样,否则就不是一个完整模块,就是Type为7的类型。
第三步,根据第二步分析出的两种情况,填充模块信息数据结构,如模块的开始行,结束行,模块的类型,模块的名字标签和语法标签。
5)演化分类步骤
从类演化的数据结构信息可以看出,模块的演化分类是以类和函数等模块的语法信息进行分类的,如类的修饰符演化,类的继承关系演化,类的内部一些模块和非模块演化次数的一些统计。根据Diff分析的增加、删除和改变,这里的增加、删除和改变不是最终的,需要经过分模块化处理修正之后进一步分析,分模块后的分类处理过程如下:
第一步,如果是一个模块增加,则获取软件新版本关于此模块的标签的最底层的标签,如className@class Sphere#functionName@add,这里最底层的标签是函数add,只需获取 functionName的值,就说明存在一个函数增加的演化信息,并且说明类Sphere中存在一个函数增加的演化信息,这两个演化的统计方式是不一样的。一个是实际演化的模块统计演化关系,一个从层次归属体现演化关系。
第二步,如果是一个模块删除,同上,只不过是获取软件旧版本的信息,增加改成删除。
第三步,如果是一个模块的模块体改变了,这里不论是增加,删除,还是改变,都记录成最底层模块的一个内容改变。如函数体中增加了一行,记录此函数多了一次内容改变。
第四步,如果是一个模块属性改变,这里的属性指的是除了标识***中的名字之外其它关于模块的描述,如函数的返回值,参数,是否内联都是此函数模块的属性。此处需要对比软件新旧版本关于此模块的最底层标签,方法是使用一个关于底层模块所有信息的完整关键字组成的标签,如函数的如下: functionTemplate@functionParameter@inlineF-unction@functionReturn@functionName@f unctionParameters,假设从第一个标签关键字functionTemplate开始,如果新旧软件版本的标签都有此关键字,就对比此关键字的值,如果是一样的,说明此属性是一样的,如果不一样,就记录此属性的改变信息,如果新旧标签有一个没有此关键字,就记录一次属性增加或删除。
在软件版本的演化过程中会分析两个不同的软件版本源码,本发明将待分析的两个软件版本源码分别标记为VI和V2,附图8描述了软件版本演化分析的整个过程。其中第一块是针对同名同路径的源码文件进行Diff分析,获取Patch文件,逐行处理Patch文件,对每一种Diff变化,进行分类处理,并分模块处理类函数等模块的相关演化,最终通过Diff-AST算法的处理将分析的结果存储到数据库并转换存储成HTML页面,既可以通过数据库查看演化信息,也可以通过浏览器查看。第二块是针对文件和文件夹的移动操作,使用MD5的加密标签处理,然后将移动的文件和文件夹的名字和路径转换成一张HTML的表,并将数据存入数据库。
Diff分析的结果显示有三种方式,本发明使用正常格式的Diff,会将分析的结果存储到一个patch文件中。Diff-AST算法会逐行分析patch文件,使用正在表达式“[0-9]+(,[0-9]+)?a[0-9]+(,[0-9]+)?.*”匹配增加变化,删除变化和改变变化是相似的。接下来需要根据分析到的V1,V2变化的行号,通过开源语法分析器ANTLR获取V1和V2的 AST,基于AST去分析类函数等模块的语法语义信息,构建模块的标签信息,然后根据标签进行分模块处理,最终针对各种演化类型特点进行相应的算法设计和实现,并将数据通过 Hibernate持久化技术存储到MySQL数据库中,为了直观的对软件版本演化信息进行查看,也会将分析到的演化信息转换成JSON格式的信息存储到HTML页面信息。
本实施既可以在Eclipse软件中进行,也可以在Linux的终端环境中进行。在Eclipse 软件中进行是使用工程的源码进行分析,在Linux的终端环境中进行是使用Eclispe将工程源码生成的Diff-AST.jar包文件进行分析。这里只介绍Linux的终端环境中进行的情况,在 Linux的终端环境中的当前目录下需要一个配置文件configure.txt和软件版本演化分析工具Diff-AST.jar,配置文件configure.txt中的内容如附图9所示。
configure.txt中的第1到4行显示软件版本演化分析的新旧版本源码的目录和输出文件patch和HTML的目录,第5到8行显示的数据库连接的信息,本实施使用的是MySQL数据库,其中的信息包括数据库的名字,数据库的驱动,数据库的用户名和密码,设计使用配置文件configure.txt提高了软件版本演化分析工具的使用的灵活性。
在终端中运行命令$java-jar Diff-AST.jar configure.txt会在相应的reportPath目录下生成HTML文件,在HTML文件的根目录下有一个index.html,可以使用浏览器打开,查看软件版本演化的详细信息,如增删改的文件的数量以及源码详细的演化信息,具体的实施环境结构如附图10所示。
Claims (7)
1.一种基于AST的软件版本演化对比分析方法,其特征是:
步骤一:通过Unix的Diff命令对两个软件版本源码进行比对分析,根据分析结果文件Patch获取代码行的增加、删除、改变的情况,将变化的源码分为三种源码块;
步骤二:通过语法分析器获取两个软件版本源码的AST信息,针对第一步分析出的三种源码块,分析获取每一种源码块的每一行代码对应的AST信息;
步骤三:通过将获取的语法结点信息组合成一个组合信息,使用该组合信息标识对应行,将标识一样的相邻代码行组合成模块;
步骤四:通过以模块为单位对比分析两个源码块的标识信息,根据模块演化情况进行分类分析,使用预处理、二次处理方法处理各种演化情况,并将演化信息存入数据库中,并转换成HTML代码。
2.根据权利要求1所述的基于AST的软件版本演化对比分析方法,其特征是步骤一中所述的将变化的源码分为三种源码块具体包括:增加、删除、改变,将变化的源码分类成增加的源码块、删除的源码块和改变的源码块存储,以此为基础进行进一步的分析处理。
3.根据权利要求1所述的基于AST的软件版本演化对比分析方法,其特征是步骤二中所述的分析获取每一种源码块的每一行代码对应的AST信息具体包括:
1)使用广度优先的搜索算法,根据行号逐个匹配ANTLR生成的抽象语法树结点;
2)如果行号在结点的所属的范围内,逐个匹配此结点的子结点,直到找到完全匹配的行号结点;
3)使用语法分析器获取当前行的语法元素以及上层语法元素,直到该源码文件的顶层类或者函数、结构体、枚举类和共用体。
4.根据权利要求1所述的基于AST的软件版本演化对比分析方法,其特征是步骤三所述的组合信息的获取,是使用标签***标识,它是类、函数、结构体、枚举类和共用体模块的一个唯一标识,使用多个标识组合成一个标识代码行的组合信息,标签***设计的方法是:
a)模块的关键字是模块的名字加上相应的属性信息字符;
b)模块的标识是使用多个字值对组合而成的,每两个字值对之间都使用一个“@”字符来分隔;
c)模块的层级标识之间使用“#”来分隔;
d)全局变量,预编译处理和普通代码行的关键字为stmSource,值为tempty。
5.根据权利要求4所述的基于AST的软件版本演化对比分析方法,其特征是步骤三中所述的组合成模块,是根据标签***对Diff划分的源码块,进一步细分模块,具体划分模块的步骤如下:
1)针对Diff分析出的变化的源码块,根据行号获取每一行代码的标签信息;
2)比对相邻行代码的标签信息,根据比对情况分为两种情况,一种是完整模块,此模块的开始行必须和它之前一行的标签不一样,并且模块中间的每一行代码的标签是一样的,另外此模块的结束行必须和它之后的一行的标签也不一样,否则就不是一个完整模块;
3)根据分析出的两种情况,填充模块信息数据结构,所述信息数据结构包括模块的开始行、结束行、模块的类型、模块的标签信息。
6.根据权利要求1所述的基于AST的软件版本演化对比分析方法,其特征是步骤四中所述的根据模块演化情况进行分类分析具体包括:进行类、函数信息的深入匹配分析,将两个不同版本的对应信息和信息的固定格式进行对比,如果两者都存在,而且有所改变,就是改变演化,如果旧版本没有,存在增加演化,如果新版本没有,存在删除演化,如函数模块的函数参数演化,函数模块的返回值演化。
7.根据权利要求6所述的基于AST的软件版本演化对比分析方法,其特征是:步骤四中所述的使用预处理、二次处理方法处理各种演化情况是一个递归过程,即每一次处理都需要预处理,所述预处理是一次正常对不同版本的同名源码文件所有变化进行分析并将分析的结果进行存储,如果分析到diff分析有误,就进入二次处理,如果二次处理也再遇到diff分析错误,然后再进行预处理、二次处理,直到分析正确。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710258269.3A CN107203468B (zh) | 2017-04-19 | 2017-04-19 | 一种基于ast的软件版本演化对比分析方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710258269.3A CN107203468B (zh) | 2017-04-19 | 2017-04-19 | 一种基于ast的软件版本演化对比分析方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107203468A true CN107203468A (zh) | 2017-09-26 |
CN107203468B CN107203468B (zh) | 2020-09-25 |
Family
ID=59904919
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710258269.3A Active CN107203468B (zh) | 2017-04-19 | 2017-04-19 | 一种基于ast的软件版本演化对比分析方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107203468B (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107967216A (zh) * | 2017-12-18 | 2018-04-27 | 网易(杭州)网络有限公司 | 代码检测方法和装置、设备、计算机可读存储介质 |
CN108845843A (zh) * | 2018-05-25 | 2018-11-20 | 腾讯科技(深圳)有限公司 | 一种函数处理方法、装置以及相关设备 |
CN109446372A (zh) * | 2018-11-16 | 2019-03-08 | 中铁投资集团有限公司 | 基于bim模型在协同设计过程中方案差异对比方法 |
CN110532019A (zh) * | 2019-06-27 | 2019-12-03 | 北京大学 | 一种软件代码片段历史追溯的方法 |
US10613969B2 (en) | 2018-05-17 | 2020-04-07 | Red Hat Israel, Ltd. | Code coverage module with testing function identifier |
CN111767075A (zh) * | 2020-06-23 | 2020-10-13 | 北京思特奇信息技术股份有限公司 | 一种应用程序版本同步的方法和装置 |
CN112463629A (zh) * | 2020-12-11 | 2021-03-09 | 北京航空航天大学 | 一种基于遗传进化的自主无人***软件配置项调整方法 |
CN112860362A (zh) * | 2021-02-05 | 2021-05-28 | 达而观数据(成都)有限公司 | 一种机器人自动化流程的可视化调试方法及调试*** |
US11379221B2 (en) | 2020-02-14 | 2022-07-05 | International Business Machines Corporation | Version control mechanisms augmented with semantic analysis for determining cause of software defects |
CN115357286A (zh) * | 2022-08-03 | 2022-11-18 | 中信建投证券股份有限公司 | 一种程序文件对比方法、装置、电子设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101286119A (zh) * | 2008-05-27 | 2008-10-15 | 华耀环宇科技(北京)有限公司 | 一种通过分析代码变化确定功能点变化的方法 |
WO2012129438A2 (en) * | 2011-03-23 | 2012-09-27 | Audible, Inc. | Synchronizing digital content |
CN103699488A (zh) * | 2013-12-30 | 2014-04-02 | 优视科技有限公司 | 基于调用关系依赖图的回归测试方法及*** |
DE102014212437A1 (de) * | 2014-06-27 | 2016-01-14 | Siemens Aktiengesellschaft | System zur verbesserten Parallelisierung eines Programmcodes |
-
2017
- 2017-04-19 CN CN201710258269.3A patent/CN107203468B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101286119A (zh) * | 2008-05-27 | 2008-10-15 | 华耀环宇科技(北京)有限公司 | 一种通过分析代码变化确定功能点变化的方法 |
WO2012129438A2 (en) * | 2011-03-23 | 2012-09-27 | Audible, Inc. | Synchronizing digital content |
CN103699488A (zh) * | 2013-12-30 | 2014-04-02 | 优视科技有限公司 | 基于调用关系依赖图的回归测试方法及*** |
DE102014212437A1 (de) * | 2014-06-27 | 2016-01-14 | Siemens Aktiengesellschaft | System zur verbesserten Parallelisierung eines Programmcodes |
Non-Patent Citations (1)
Title |
---|
周逸勋等: "使用抽象语法树匹配分析Java程序演化", 《计算机应用与软件》 * |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107967216B (zh) * | 2017-12-18 | 2020-07-10 | 网易(杭州)网络有限公司 | 代码检测方法和装置、设备、计算机可读存储介质 |
CN107967216A (zh) * | 2017-12-18 | 2018-04-27 | 网易(杭州)网络有限公司 | 代码检测方法和装置、设备、计算机可读存储介质 |
US10613969B2 (en) | 2018-05-17 | 2020-04-07 | Red Hat Israel, Ltd. | Code coverage module with testing function identifier |
CN108845843B (zh) * | 2018-05-25 | 2022-04-29 | 腾讯科技(深圳)有限公司 | 一种函数处理方法、装置以及相关设备 |
CN108845843A (zh) * | 2018-05-25 | 2018-11-20 | 腾讯科技(深圳)有限公司 | 一种函数处理方法、装置以及相关设备 |
CN109446372A (zh) * | 2018-11-16 | 2019-03-08 | 中铁投资集团有限公司 | 基于bim模型在协同设计过程中方案差异对比方法 |
CN110532019A (zh) * | 2019-06-27 | 2019-12-03 | 北京大学 | 一种软件代码片段历史追溯的方法 |
US11379221B2 (en) | 2020-02-14 | 2022-07-05 | International Business Machines Corporation | Version control mechanisms augmented with semantic analysis for determining cause of software defects |
CN111767075A (zh) * | 2020-06-23 | 2020-10-13 | 北京思特奇信息技术股份有限公司 | 一种应用程序版本同步的方法和装置 |
CN112463629B (zh) * | 2020-12-11 | 2022-03-29 | 北京航空航天大学 | 一种基于遗传进化的自主无人***软件配置项调整方法 |
CN112463629A (zh) * | 2020-12-11 | 2021-03-09 | 北京航空航天大学 | 一种基于遗传进化的自主无人***软件配置项调整方法 |
CN112860362A (zh) * | 2021-02-05 | 2021-05-28 | 达而观数据(成都)有限公司 | 一种机器人自动化流程的可视化调试方法及调试*** |
CN112860362B (zh) * | 2021-02-05 | 2022-10-04 | 达而观数据(成都)有限公司 | 一种机器人自动化流程的可视化调试方法及调试*** |
CN115357286A (zh) * | 2022-08-03 | 2022-11-18 | 中信建投证券股份有限公司 | 一种程序文件对比方法、装置、电子设备及存储介质 |
CN115357286B (zh) * | 2022-08-03 | 2023-11-10 | 中信建投证券股份有限公司 | 一种程序文件对比方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN107203468B (zh) | 2020-09-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107203468A (zh) | 一种基于ast的软件版本演化对比分析方法 | |
RU2605077C2 (ru) | Способ и система для хранения и поиска информации, извлекаемой из текстовых документов | |
US7165216B2 (en) | Systems and methods for converting legacy and proprietary documents into extended mark-up language format | |
CN102831121A (zh) | 一种网页信息抽取的方法和*** | |
EP3117342A1 (en) | Framework for data extraction by examples | |
CN110502227A (zh) | 代码补全的方法及装置、存储介质、电子设备 | |
Furche et al. | The ontological key: automatically understanding and integrating forms to access the deep Web | |
CN101377806A (zh) | 一种基于***源代码搜索隐通道的信息流分析方法 | |
Verbitskaia et al. | Relaxed parsing of regular approximations of string-embedded languages | |
Rönnau et al. | XCC: change control of XML documents: An Efficient and Reliable Framework for XML Diff, Patch, and Merge | |
Kastens et al. | Generating Software from Specifications | |
Matheja et al. | Tree-like grammars and separation logic | |
CN102043925A (zh) | 一种新型分析信息流的方法 | |
Nonnen et al. | Locating the Meaning of Terms in Source Code Research on" Term Introduction" | |
Rajbhoj et al. | DocToModel: automated authoring of models from diverse requirements specification documents | |
Fraternali et al. | Almost rerere: An approach for automating conflict resolution from similar resolved conflicts | |
Varanka et al. | Topographic mapping data semantics through data conversion and enhancement | |
Nguyen | Statistical Models and Machine Learning to Advance Code Completion: Are We There Yet? | |
Jungermann | Documentation of the Information Extraction Plugin for RapidMiner | |
Nargesian | Relational Data Enrichment by Discovery and Transformation | |
van der Spek | The overture project: Designing an open source tool set | |
Liu et al. | Contiguous Sequence Mining Approach for Program Procedure Pattern | |
Zou et al. | Extracting business execution processes of api services for mashup creation | |
Das | Solving Text-to-SQL Task Through Machine Translation | |
CN117077772A (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 |