一种基于边不稳定性的软件函数变更预测系统及方法与流程

文档序号:12463058阅读:317来源:国知局
一种基于边不稳定性的软件函数变更预测系统及方法与流程

本发明属于软件工程领域,特别涉及一种面向复杂网络基于边不稳定性的软件函数变更预测系统及方法,通过相邻版本变更函数的不稳定度进而预测下一个版本函数的变更情况。



背景技术:

近年来,复杂网络的研究取得了巨大的进步,提出了许多方法和理论。这些理论和研究被用于生物学、物理学等学科,目前在计算机科学领域的应用也越来越广。现代的软件系统无论是从规模还是从结构设计上都发生了巨大的改变,传统的软件工程方法面临着很大挑战。因此,复杂网络的研究方法被引入到软件设计的过程中。由于现代软件函数的变更越来越频繁,软件升级在软件的整个生命周期中不可避免,因此,研究函数的变更传播有其重要的现实意义。除此之外,研究的另一目标是影响软件鲁棒性的相关因素。

复杂网络经常伴随着信息、病毒、疾病等的传播,而一个网络的拓扑结构对于变更传播的程度有着显著的影响。在计算机科学领域,大型软件系统中的类图、依赖图、关系图、软件组件图、函数调用图都属于复杂网络。

当开发者为了加入一个新功能或者修复一个BUG的时,对软件系统一个部分作出修改后,其他的部分为了适应修改,常常也需要进行更新。量化一个软件网络的传播性有助于节省软件维护产生的开销。

在函数调用关系图中,变更传播通常都是单方向的,函数A调用函数B,当B发生修改时,A因为接口需要作出调整因此很可能需要相应作出修改,这叫B传播到A,但当A发生修改时,B一般就不需要作出修改了。

关于影响边的变更传播的参数,首先有节点的稳定度,节点的稳定度定义如下:

在定义中,和分别代表节点ni的出度和入度。如果Si的值相对较大,那么说明节点的出度相对于入度较小,因此其他节点的改变较难传播到该节点。也就是说该节点较为稳定。从定义可以看出,Si的取值范围是[0,1]。

边的不稳定度基于节点的稳定度定义。其具体定义如下所示:

Iij=Si-Sj

在上面的定义中,Si和Sj分别代表节点i和节点j的节点稳定度。从定义中可以看出,当Iij>0时,节点i的稳定度大于节点j的稳定度,也就是说稳定度大的边调用稳定度小的边。Iij<0时则相反。边的不稳定度的取值范围为[-1,1]。

罗伯特·马丁在其论文中提出了稳定性依赖原则(SDP)。论文中指出在软件的设计过程中,一个包应该依赖于比其自身更加稳定的包。节点的稳定度和边的不稳定度可以作为一种衡量节点及边的稳定度的一种度量,通过分析一个节点的稳定度或者边的不稳定度就可以清晰地分析出一个软件在某个区域的设计成功与否。关于变更传播,一条边的边的不稳定度越高,则这条边越不稳定,越可能发生修改,同时,在发生修改的时候,越容易传播到更多的函数。

现有的关于函数变更的研究大致基于软件仓库,并没有考虑变更函数的顺序。由于软件仓库的特点,大部分的基于历史数据库的研究都停留在物理层面(系统,目录,文件,行),忽视了本身变更实体(函数、变量)的本身意义。现有的软件仓库分门提供的数据元有差异,不同的研究方法利用不同软件仓库,没有统一的适用标准。



技术实现要素:

本发明的技术解决问题:利用源代码作为数据源进行研究,避免了不同的数据仓库所引起的问题,具有通用性的特点,且预测结果准确率高于百分之五十。

本发明技术解决方案:

经过大量实验对比发现,边的EI越大,这条边越不稳定,发生修改的可能性更高,修改影响到的函数范围也越大。因此,本发明基于边的不稳定度,基于Linux内核源码,设定最小支持度,得到相邻的变更函数,并将子图的边按照边的不稳定度排序,取边的不稳定度大于一定值的边连接的函数节点作为结果输出,即预测的下个版本也会发生修改的函数。

本发明一种基于边不稳定度的软件函数变更预测系统,包括:函数调用关系图生成模块、变更函数调用关系图获取模块和边的不稳定度生成及函数变更预测模块,其中:

函数调用关系图生成模块:根据需要处理相应的软件网络,生成相应软件网络的函数调用关系图;

变更函数调用关系图获取模块:对相邻版本的函数源码比较,得到变更函数,在已生成的函数调用关系图中,去掉没有变更的函数,得到每个相邻版本源代码的变更函数调用关系图;

边的不稳定度生成及函数变更预测模块:根据已生成的变更函数调用关系图,得到每条边的边的不稳定度,对所有边按照边的不稳定度进行排序,根据输入的阈值,去掉不稳定度低于阈值的边,剩下的边所连接的函数节点作为预测结果进行输出。

所述函数调用关系图生成模块实现过程如下:

(1)选择需要处理相应的软件网络,包括操作系统软件源代码,然后调用外部工具cdepn,对于所有.c文件,生成相应的cdepn文件;

(2)对于生成的.cdepn文件,逐行读取文件,当每一行第一个字符为F时,表示该行函数为call函数,之后的所有开头第一个字符为C的行的直到文件尾或者下一个开头第一个字符为F的行为止,包含在里面的函数都被该函数调用,按照此方法则生成相应整个软件网络的函数调用关系图。

所述变更函数调用关系图获取模块实现过程如下:

(1)利用ctags获取每个函数在相邻版本中的被定义位置,函数定义总是以‘{’开始,最终以‘}’结束,利用此原理,从函数开始行开始,利用栈的数据结构,去掉注释语句,每读到‘{’入栈,读到‘}’出栈,直到栈为空,这时候的行数为该函数的结束行,按照此方法得到函数被定义的结束行,然后提取各函数在相邻版本的源代码,利用diff命令,比较代码是否发生改变,如果是则是变更函数;

(2)得到变更函数后,利用变更函数,对源代码的函数调用关系图进行筛选,去掉没有变更过的函数,剩下的就是变更函数调用关系图。

所述边的不稳定度生成及函数变更预测模块实现过程如下:

(1)逐行录入变更函数调用关系图,每行分为调用函数(call function)和被调用函数(called function),每行录入的时候,调用函数的出度加1,被调用函数入度加1;

(2)变更函数调用关系图录入完毕之后,根据公式:

计算出函数节点的不稳定度Si,是该节点的入度,是该节点的出度;

然后,根据公式Iij=Si-Sj计算出各条边的不稳定度;Iij是节点的不稳定度,Si是调用函数节点的稳定度,Sj是被调用函数节点的稳定度;

(3)采用的是快速排序算法,对所有边按照边的不稳定度由高到低排序;

(4)输入阈值,所述阈值在(-1,1)之间,去掉边的不稳定度低于所述阈值的边,剩下的边所连接的函数节点作为预测结果进行输出。

一种基于边不稳定性的软件函数变更预测方法,实现步骤如下:

第一步,生成函数调用关系图,根据需要处理相应的软件网络,生成相应软件网络的函数调用关系图;

第二步,获取变更函数,根据已生成的函数调用关系图,去掉图中所有没有发生变更的函数,得到每个相邻版本源代码的变更函数调用关系图;

第三步,边的不稳定度生成及函数变更预测:根据已生成的变更函数调用关系图,得到每条边的边的不稳定度,对所有边按照边的不稳定度进行排序,根据输入的阈值,去掉不稳定度低于阈值的边,剩下的边所连接的函数节点作为预测结果进行输出。

所述第一步具体如下:

在Linux下配置工具生成cdepn图,并通过脚本处理进而生成callpah,具体如下:(1)配置Codeviz工具;(2)编写脚本遍历目录为所有.c文件生成cdepn文件;(3)编写代码,利用cdepn文件生成该网络的函数调用关系图。

第二步具体实现如下:

步骤2.1、利用ctags可以对某个.c文件下所有的函数进行检索,并输出函数的起始行,编写脚本,递归遍历Linux内核代码下所有.c文件生成相应的.c文件;

步骤2.2、函数定义总是以‘{’开始,最终以‘}’结束,利用此原理,从函数开始行开始,利用栈的数据结构,去掉注释语句,每读到‘{’入栈,读到‘}’出栈,直到栈为空,这时候的行数为该函数的结束行;

步骤2.3、得到起始行后,利用shell命令,sed可以读取指定行之间的内容,通过diff命令,比较相邻版本间同名函数,可以知道该函数是被修改、被增加或者被删除;

步骤2.4、在得到相邻版本间的变更函数后,在之前生成的函数调用关系图中,去掉没有发生变更的函数,得到相邻版本变更函数调用关系图。

所述第三步具体实现如下:

步骤3.1、计算变更函数子图所有边的不稳定度,首先得到所有节点的出入度,根据公式得到各个节点的稳定度,再通过公式得到每条边的不稳定度;

步骤3.2、对EI按照不稳定度从大到小排序,排序方法用的是快速排序;

步骤3.3、将小于不稳定度a的边去掉,将剩下的边连接的函数输出,作为预测结果。

本发明与现有技术相比的优点在于:

(1)利用软件的源代码作为数据源进行研究,避免了不同的数据仓库所引起的问题,使得本发明更具有通用性。

(2)从复杂网络以及边的不稳定度入手,边的不稳定度与函数变更概率有正相关关系,预测结果准确率高于百分之五十。

附图说明

图1为本发明系统的结构框图;

图2为图1中函数调用关系图生成模块的实现流程图;

图3为图1中变更函数调用关系图获取模块的实现流程图;

图4为图1中边的不稳定度获取及变更函数预测模块的实现流程图;

图5为cdepn文件格式。

具体实施方式

下面将结合附图和实施例对本发明作进一步的详细说明。

在叙述之前,要对本发明涉及的技术和术语进行一下说明。

Codeviz,graphviz,ctags,sed是Linux下的第三方工具,在命令行输入sudo apt-get install工具名命令可以直接安装。

cdepn文件是利用安装好的codeviz和graphviz后,针对待处理源代码文件下的.c文件生成的相应的名字为*.cdepn文件,文件格式如图5所示。

Shell命令是Linux自带的命令行编辑器,用于处理各种常用操作。

如图1所示,本发明包括函数调用关系图生成模块、变更函数调用关系图获取模块和边的不稳定度获取及变更函数预测模块。

如图2所示,本发明中函数调用关系图生成模块具体实现如下:

(1)扫描源代码下未处理过的源代码文件,生成对应的cdepn文件;

(2)所有源代码处理完毕后,逐行读取所有cdepn文件,逐行读取文件,当读到开头为F时,表示该行函数为call函数,之后的所有开头为C的行的直到文件尾或者下一个F开头行为止,包含在里面的函数都被该函数调用,按照此方法生成整个软件网络的调用关系图。

如图3所示,本发明中变更函数调用关系图获取模块具体实现如下:

(1)利用Linux工具ctags,输入源代码下的源文件,得到该文件下所有函数被定义的起始行以及所在文件路径。

(2)函数定义总是以‘{’开始,最终以‘}’结束,利用此原理,从函数开始行开始,利用栈的数据结构,去掉注释语句,每读到‘{’入栈,读到‘}’出栈,直到栈为空,这时候的行数为该函数的结束行。

(3)使用Linux的diff命令,比较相邻版本函数源代码是否发生变更。

(4)去掉函数调用关系图中没有发生变更的函数,剩下的图就是变更函数调用关系图。并作为结果输出。

如图4所示,本发明中边的不稳定度获取及变更函数预测模块具体实现如下:

(1)逐行输入变更函数调用关系图,每行分为调用函数(call function)和被调用函数(called function),每行录入的时候,调用函数的出度加1,被调用函数入度加1。

(2)函数调用关系图录入完毕之后,根据公式:

计算出函数节点的不稳定度,K为节点的出度或者入度。

然后,根据公式Iij=Si–Sj

计算出各条边的不稳定度。

(3)对所有边按照边的不稳定度由高到低排序,这里采用的是快速排序算法。

(4)输入参数,这个参数在(-1,1)之间,去掉边的不稳定度低于这个参数的边,剩下的边连接的节点作为结果输出。

本发明,具体为如下步骤。

第一步、获得函数调用图:

在Linux下配置工具生成cdepn图,并通过脚本处理进而生成callpah。基本的思路如下:(1)配置Codeviz等工具;(2)编写脚本遍历目录为所有.c文件生成cdepn文件;(3)编写代码,利用cdepn文件生成该网络的函数调用关系图。

步骤1.1、配置工具。

首先安装graphviz和CodeViz

使用配置好的工具递归编译待处理源代码下所有*.c文件,会相应地生成一个*.c.cdepn文件。

步骤1.2、执行脚本生成函数调用关系图。

利用编写的代码生成函数调用关系图,对于生成的.cdepn文件,逐行读取文件,当读到开头为F时,表示该行函数为call函数,之后的所有开头为C的行的直到文件尾或者下一个F开头行为止,包含在里面的函数都被该函数调用,按照此方法生成整个软件网络的调用关系图。

第二步、利用call graph计算各条边的EI

步骤2.1、脚本编写

编写脚本,通过call graph生成相应网络各条边的EI。脚本由以下文件组成:

AutoRun.sh:执行./AutoRun.sh命令,程序将自动执行。

需要设置PATH2参数,为call graph所在路径。

AutoCount.sh:该脚本核心代码是arcunstabcount部分,该部分真正计算了EI,首先得到所有节点的出入度,根据公式得到各个节点的边的不稳定度,再通过公式求得该网络的所有边的不稳定度。

第三步、通过相邻版本函数调用图获得变更函数,包括:

步骤3.1、部署ctags,利用ctags得到每个函数在源代码中定义的起始行利用ctags,对某个.c文件下所有的函数进行检索,并输出该函数的起始行。编写脚本,递归遍历Linux内核代码下所有.c文件生成相应的.c文件。

步骤3.2、利用模式匹配,得到每个函数的结束行。

函数定义总是以‘{’开始,最终以‘}’结束,利用此原理,从函数开始行开始,利用栈的数据结构,去掉注释语句,每读到‘{’入栈,读到‘}’出栈,知道栈为空,这时候的行数为该函数的结束行。

步骤3.3、利用相邻版本函数的起始行,结束行,提取出源代码,进行比较,得到修改、增加、删除的函数。

得到起始行后,利用shell命令,sed可以读取指定行之间的内容,通过diff命令,比较相邻版本间同名函数,可以知道该函数是被修改、被增加或者被删除。

步骤3.4、得到发生修改函数的子图,及变更函数子图。

通过变更函数集合,在原内核生成的call graph上进行筛选,得到的子图即为变更函数的子图。

第四步、输出预测结果

步骤4.1、对变更函数子图的边按照边的不稳定度排序。

编写脚本,对EI按照不稳定度从大到小排序,排序方法用的是快速排序。

步骤4.2、设定最小边的不稳定度a,将所有大于a的边连接的函数节点作为结果输出。

编写脚本,将小于不稳定度a的边去掉,将剩下的边连接的函数输出,作为预测结果。

提供以上实施例仅仅是为了描述本发明的目的,而并非要限制本发明的范围。本发明的范围由所附权利要求限定。不脱离本发明的精神和原理而做出的各种等同替换和修改,均应涵盖在本发明的范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1