首页> 中国专利> 一种基于文本比较的多版本软件演化历史静态分析方法及系统

一种基于文本比较的多版本软件演化历史静态分析方法及系统

摘要

本发明公开了一种基于文本比较的多版本软件演化历史静态分析方法,该方法包括以下步骤:步骤1)将软件多个不同版本的文件以时间为序排列,步骤2)用计算程序文件内容余弦相似度的方法,步骤3)获知程序文件内容的差异,获知方法变更表;步骤4)获知文件变更表,步骤5)获取度量数据,获知演化历史分析报告。该方法通过静态分析程序数据流和控制流结构,并利用软件程序结构分层计算;支持不同层次的并发计算,过程简便,成本低廉。

著录项

  • 公开/公告号CN113110871A

    专利类型发明专利

  • 公开/公告日2021-07-13

    原文格式PDF

  • 申请/专利权人 东南大学;

    申请/专利号CN202110462336.X

  • 申请日2021-04-27

  • 分类号G06F8/71(20180101);

  • 代理机构32206 南京众联专利代理有限公司;

  • 代理人杜静静

  • 地址 210096 江苏省南京市玄武区四牌楼2号

  • 入库时间 2023-06-19 11:49:09

说明书

技术领域

本发明涉及一种基于文本比较的多版本软件自适应静态分析方法,属于软件维护和软件演化领域。

背景技术

程序分析指的是对计算机程序进行人工或自动化的分析,以确认或发现其特性,比如性能、正确性、安全性等是否符合预期,以分析过程“是否需要运行被测程序”为准,可将程序分析划分为两大类:静态分析和动态测试,一般来说,动态测试由于获取了具体的运行信息,因此报出的缺陷更为准确,但只能对有限的测试用例进行检查并且条件比较苛刻,而静态分析可以比较全面地考虑可能的执行路径,能够发现更多的缺陷,条件比较简单。陆申明等人在“静态程序分析并行化研究进展”一文中提出,除了缺陷检测,静态分析还可用于程序理解、修复以及测试用例生成等方面,是程序语言和软件工程领域的一个重要研究方向。

袁聚懋在“基于静态程序分析的注解传递技术研究”中指出,程序静态分析(Program Static Analysis)是指在不运行代码的方式下,通过对程序代码进行扫描,验证代码是否满足规范性、安全性等指标的一种代码分析技术,常用静态程序分析技术包括词法分析、语法分析、控制流分析、数据流分析和污点分析等。其中数据流分析是静态差异分析常用的分析模式之一,可以从程序中收集语义信息,并通过不断地迭代使得语义信息集合达到稳定来确定变量的定义和使用的情况。数据流问题就是对一组约束求解,约束分为两类,一类是基于语义的约束,另一类是基于控制流约束。

静态分析经过多年的发展,已经在多个方面取得了长足的进步,但仍面临不少的挑战。张欣在“基于动静态程序分析结合的移动众包测试引导技术”一文中提出,随着信息化时代的推进,软件已然成为现代社会的基础设施,随着软件功能以及应用范围的持续外延,通用功能软件的广泛复用,使得软件结构日趋复杂,软件规模不断增大,在精度、效率、可扩展性、通用性方面都提出了更高或更新的要求。

本文基于前人静态分析的结果,创新性的提出多版本历史演化的静态分析方法,通过静态分析某一个软件多个版本的文本,得到了不同版本之间的差异,诸如变量名的改动、空行的增加或删减等。

发明内容

本发明提供一种利用程序的源码结构分层特点自动计算软件演化历史,能够根据源码分析和定位软件演化过程,信息易于获取、运行效率高的基于文本比较的多版本软件演化历史静态分析方法。

为了实现上述目的,本发明的技术方案如下:本发明的基于文本比较的多版本软件演化历史静态分析方法,包括如下步骤:

步骤1)将软件多个不同版本的文件以时间为序排列,如A

步骤2)用计算程序文件内容余弦相似度的方法,匹配文件A和B中将要进行比较的程序文件,并将程序文件本地绝对路径分别存入两个集合FA和FB中。对于给定的整数集合下标i,FA

步骤3)对于集合FA、FB,遍历i(0

步骤4)对于集合UFA,遍历j(0

步骤5)将A

本发明方法的优选方案中,步骤2)中匹配待比较程序文件的具体流程为:

21)对于A,B中文件名相同的程序文件,认为是匹配的程序文件,将其本地绝对路径存入集合FA与FB相同脚标对应位置;

22)对于A,B中文件名不同的程序文件,记整数集合下标分别为m和n,根据本地绝对路径A

23)上述步骤21)和22)之后仍未匹配上的文件,认为是失配文件,分别组成集合UFA和UFB。集合UFA和UFB用于生成文件变更表,组成新增和删除的文件部分。

本发明方法中,步骤3)中用基于文本比较的方法,获知程序文件内容差异的具体流程为,

31)对于集合FA、FB,遍历y(0

32)针对CA

33)上述步骤31)和32)之后仍未匹配上的函数,认为是失配函数,分别组成集合UKA与UKB;

34)对于集合UKA,遍历q(0

本发明方法中,步骤5)中由文件变更表和方法变更表获取度量数据,获知演化历史分析报告的具体过程为,

51)可获知如下度量数据:

NI:软件迭代次数;

CN:文件变更次数;

CL:源代码实体中发生改动的代码行数;

TCL:源代码实体中发生改动的代码行总数。

各度量指标的计算方式如下:

(1)变更频率CF即为文件变更次数除以软件迭代总次数。

CF=CN/NI;

(2)变更权重CW反应软件迭代过程中文件变更占总变更的比例,可以用文件代码变更规模除以总变更规模得到。

CW=CL/TCL;

52)基于变更频率和变更权重排序进行频繁变更文件分析,生成演化历史分析报告。

本发明方法通过将路径下的源码文件预处理,再根据特征分类并按照类名和方法名输出区别,与现有技术相比,本发明具有以下优点:

(1)允许需要比较的源码文件存在冗余注释。经查找资料发现,基于覆盖的故障定位技术对源码文件要求较高,源码文件里不允许存在冗余注释,而本发明允许源码文件是存在注释的原生状态,通过对注释的冗余部分进行预处理,实现自动化删除注释,省去了手工删除注释效率低下问题。

(2)文件匹配方式创新。在判断两份文件是否是可匹配的相似文件时,本发明创新性地采用了余弦相似度的手段判断文件内容或函数内容的相似程度是否大于0.94,如果大于该值就认为这两份文件是可匹配的并进行进一步匹配。这种做法与传统方法比较增加了不同版本文件的容差程度,尽可能避免了因为小幅度删改文件造成不匹配的问题。

(3)实现了多版本软件演化历史分析,并且不依赖于其它技术如版本控制器,使得过程简便,成本低廉。本发明提出的演化历史分析报告以时间为序,明确指出软件不同版本的异同,以及改动频繁的程序文件及方法。便于开发人员追踪程序文件和方法的修改历史,减轻分析负担。

附图说明

图1是本发明方法的流程图。

图2是本发明的实施例图,表示实施例中相关内容。

具体实施方式

下面结合附图对发明的技术方案进行详细说明:

本发明通过静态分析程序数据流和控制流结构,并利用软件程序结构分层计算;支持不同层次的并发计算,过程简便,成本低廉。

实施例1:参见图1,一种基于文本比较的多版本软件演化历史静态分析方法设计体系结构,

一、体系结构

图1给出了基于文本比较的多版本软件演化历史静态分析方法设计体系结构。下面给出几个主要部分的具体说明。

1预处理组件

本组件的功能为:每次从文件队列中取出两相邻文件,通过本地绝对路径分别获得并扫描软件所有程序文件源码,删去源代码中的注释和空行,得到不含注释的文件通过删除文件中的注释。预处理主要目的是排除文件对比时的干扰,提高静态分析的正确性。

2文件匹配及比较组件

本组件的主要功能是对预处理后的文件进行匹配,获知匹配程序文件和失配程序文件,并由此生成文件变更表;匹配程序文件作为方法匹配及比较组件的输入,文件变更表作为度量指标获取和演化历史分析组件的输入。

3方法匹配及比较组件

本组件的主要功能是对于匹配的程序文件,对文件源代码中的方法进行匹配,以获知匹配方法和失配方法,以及匹配方法中精确到源代码行的变更,并由此生成方法变更表,作为度量指标获取前提和演化历史分析前提。

4度量指标获取组件

本组件的主要功能是使用文件变更表和方法变更表,自动化地统计度量数据:软件迭代次数、文件变更次数、源代码实体中发生改动的代码行数和源代码实体中发生改动的代码总行数,以计算度量指标:变更频率和变更权重,作为演化历史分析组件的输入。

5演化历史分析组件

本组件的主要功能是基于已获取的文件变更表、方法变更表和度量指标,自动分析出频繁变更文件;将分析重点集中于频繁变更文件,生成演化历史分析报告,为其他软件维护和软件演化技术提供帮助。

实施例2:一种基于文本比较的多版本软件演化历史静态分析方法,具体过程如下:

假设现在需要用本文的方法静态分析某个软件某两个版本之间的差异,我们将软件的两个版本各自的所有文件分别放在两个对应的文件夹中,然后执行下面的步骤进行分析得到结果:

步骤1)对两个文件夹中所有待比较文件进行预处理:以C++为例,C++中的注释分为两种:一行注释以//开始,以换行符结束;多行注释以/*开始,以*/结束。我们将两个文件夹里所有文件作为输入文件,在输入的过程中判断输入流中的字符是否连续出现了//,一旦出现了//那就忽略从//开始到换行符结束的字符串,也就是说不将它们添加到结果字符串中;同样,如果输入流中的字符连续出现了/*,就忽略/*开始到*/结束的字符串,也就是不将这其中的内容放入结果字符串中。处理完所有输入字符串后即可得到结果字符串,将结果字符串输出即可得到预处理后的文件。

步骤2)找到两个文件夹中的“对应文件”:软件前一个版本中某个文件进行了增加、删除或修改的操作后得到了下一个版本里的文件,我们规定这两个文件为彼此的“对应文件”。首先我们根据文件夹的绝对路径找到存放待匹配文件的两个文件夹,然后得到其中所有文件的文件名分别存于两个容器中,然后判断两个容器中哪些文件名相同,两个文件名相同的文件直接被认为是“对应文件”。如果文件名不同,分别计算前一个版本的某个文件的内容和后一个版本的所有文件的内容之间的余弦相似度,经过多次实验,当余弦相似度阈值为0.94时效果最好,也就是说当两个文件之间的余弦相似度超过0.94时我们认为这两个文件是“对应文件”。将每一对“对应文件”以及未对应上的文件记录在文件变更表里。

步骤3)比较每一组对应文件的不同之处。经过前述步骤,我们得到了两个版本的每一组“对应文件”。对于文件变更表里的一组对应文件,我们定位文件中的函数头,对于匹配的函数头,基于动态规划方法求解函数体中的最长公共子序列,以获知两个文件中对应匹配的单词,即两个版本中没有改动的单词。对于找不到配对对象的单词,我们认为这些单词被删除或新增了,记录这些单词的删除和新增信息,得到这两个对应文件的静态分析结果。得到所有组“对应文件”的静态分析结果后,将所有“对应文件”的删改信息记录在方法变更表里。

步骤4)根据步骤2和步骤3得到的文件变更表和方法变更表,自动化地统计度量数据:软件迭代次数、文件变更次数、源代码实体中发生改动的代码行数和源代码实体中发生改动的代码总行数,以计算度量指标:变更频率和变更权重。得到度量指标后,自动分析出频繁变更文件,并生成演化历史分析报告,为其他软件维护和软件演化技术提供帮助。

应用实施例:

为了方便描述,我们假定有如下简化的应用实例:目标文件夹结构如图2所示,待比较的两份文件目标程序源码如下表所示。假定路径D:\testfiles1和D:\testfiles2下分别存放两个版本的软件,把文件夹分别记为A,B,内容如下表所示。

根据我们前面提到的计算步骤,依次实施:

第一步,预处理组件通过本地路径获知文件夹A,B中所有文件,并删除文件中的注释。

第二步,匹配组件获取路径下的所有文件名和对应文件类型,将文件类型为c++源码类型的文件本地绝对路径存入集合A,B中。

集合A={“D:\testfiles1\test1.cpp”,“D:\testfiles1\taskone.cpp”},

集合B={“D:\testfiles2\test2.cpp”,“D:\testfiles2\other.cpp”}。

第三步,文件匹配组件比较集合A和B中存放的程序文件的文件名,计算集合A,B中存放程序文件内容的余弦相似度,将文件名相同或者文件内容余弦相似度>0.94的程序文件视作匹配并一一对应地存入集合FA和FB,未匹配文件分别存入集合UFA和UFB中。余弦相似度计算结果如下表所示。

获知每个集合内容如下:

FA={“D:\testfiles1\test1.cpp”}

FB={“D:\testfiles2\test2.cpp”}

UFA={“D:\testfiles1\taskone.cpp”}

UFB={“D:\testfiles2\test2.cpp”}

第四步,函数匹配组件取出FA和FB中的对应本地绝对路径,获得文件内容CA

获知每个集合内容如下:

KA={“void findmax()”} KB={“int findmax()”}

UKA={} UKB={}

第五步,函数比较组件获知集合KA和KB中函数头对应的函数,读入函数体逐行比较,将函数体内部增删改存入方法变更表中,如下所示。

上述实施例仅是本发明的优选实施方式,应当指出:对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和等同替换,这些对本发明权利要求进行改进和等同替换后的技术方案,均落入本发明的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号