一种基于g核分解的软件关键函数识别方法与流程

文档序号:17988348发布日期:2019-06-22 00:35阅读:372来源:国知局
一种基于g核分解的软件关键函数识别方法与流程

本发明涉及一种软件关键函数识别方法,尤其涉及一种基于g核分解的软件关键函数识别方法。



背景技术:

计算机软件已经深入我们生活的方方面面,成为我们生活不可或缺的一部分。软件正在改变,并将持续改变我们的生活。人们对软件的功能和性能需求越来越高,导致软件的规模日益复杂,质量难以保证。当新的需求出现时,旧的软件往往需要通过一定的维护工作,才能适应新的需求。然而,软件的复杂性使得软件的维护工作日益复杂,维护代价一直居高不下,占了软件总费用的60%以上。要对旧的软件进行维护,首要的问题是理解待维护的软件。然而软件的复杂性使得软件的理解比较困难。因此,提供一种有效的技术来辅助维护人员对软件的理解,进而简化软件的维护工作,降低维护费用是一项技术难题。

从软件的关键元素(包、类、函数、属性等)开始理解软件是一种可行的方法。首先理解关键的元素,然后在理解与关键元素相关的元素,从而逐步理解整个软件。为了识别软件中的关键元素,人们提出了不同的方法:zaidman等人构建了静态类依赖图,并使用hits算法识别关键类。周毓明等人用类依赖图抽象类粒度的软件系统,并使用pagerank算法、hits和介数中心性等方法识别关键类。姜淑娟等人构建了软件的状态转换模型,进而通过计算状态转换树节点的复杂度来识别关键类。潘伟丰等人构建了类粒度、包粒度的软件结构图,进而通过使用pagerank算法识别软件中的关键类和关键包。尽管目前已经有一些软件关键元素识别方面的工作,但是仍有如下不足:

(1)现有的工作主要集中于软件代码的静态分析,缺少对软件实际运行时的动态分析。静态分析不需要运行软件,仅仅依靠软件源代码,提取的元素间的关系实际上是一种“最坏”情况下的关系,可能包含多余的关系;动态分析需要运行软件,收集软件运行过程中的元素及元素间的关系,代表的是元素间的真实交互。动态分析比静态分析更准确。

(2)现有工作主要是针对关键包、关键类的识别,缺少对关键函数的识别。

包和类是粒度比较大的软件元素,而函数是相对细粒度的软件元素。提出识别关键函数的技术可以弥补现有工作的不足,从而从粗粒度到细粒度,全方位的识别软件关键元素,为软件理解、软件测试及软件维护工作提供技术支持。



技术实现要素:

本发明的目的在于针对现有技术的不足,提供了一种基于g核分解的软件关键函数识别方法。

本发明的上述技术问题主要是通过下述技术方案得以解决的:一种基于g核分解的软件关键函数识别方法,该方法包括以下步骤:

(1)将java语言编写的软件在函数粒度抽象为函数依赖图fg=(n,d),其中,n为软件中的函数节点的集合;d={(fi,fj)}(fi∈n,fj∈n)是无向边的集合,表示函数间的调用关系;每条边将被赋予一个非负整数,作为函数调用关系的强度值。

(2)基于步骤(1)构建的fg计算函数节点i的g核数g(i),作为节点相应函数的重要性值。

(3)基于步骤(2)所得的函数节点的g核数对函数节点进行降序排列,得到关键函数。

进一步地,上述步骤(1)中的函数和函数间的调用关系都是根据该java软件在java虚拟机上实际运行过程中获取的,是一种动态分析,而非基于源代码的静态分析。

进一步地,上述步骤(1)中边上的强度值指的是函数之间的调用次数。调用次数是根据该java软件在java虚拟机上实际运行过程中获取的,是一种动态分析,而非基于源代码的静态分析。

进一步地,上述骤(2)中节点i的g核数g(i)的计算具体包括以下子步骤:

(2.1)求步骤(1)所得fg中所有函数节点的加权度。函数节点j的加权度wj定义为fg中与该函数节点相连的所有边的强度值和,即:

其中,vj是函数节点j的邻居函数节点集合;w(j,m)是边(j,m)上的强度值。

(2.2)求步骤(1)所得fg中所有函数节点的度。函数节点j的度kj定义为fg中与该函数节点相连的边数。

(2.3)求步骤(1)所得fg中所有节点的几何平均度。函数节点j的几何平均度sj数值上等于最接近wj和kj积的算术平方根的整数。sj计算公式为:

其中,round(n)返回最接近数值n的整数。

(2.4)求步骤(1)所得fg的g核(g=1,2,3,…):反复去掉fg中几何平均度小于g的函数节点及其连边,得到的子图即为fg的g核。

(2.5)求步骤(1)所得fg中所有函数节点的g核数:比较g核和(g+1)核中的函数节点,若函数节点存在于g核中,但是在(g+1)核中被删除,则该函数节点的g核数为g。

进一步地,上述步骤(3)中,使用冒泡排序算法对函数节点进行降序排列。

进一步地,上述步骤(3)中,降序排列后,将排名前15%(向上取整)的函数作为所识别的关键函数。

与现有技术相比,本发明具有以下优点和积极效果:

(1)本发明中fg的构建是基于java软件在执行时的动态分析构建的,代表了软件中的函数及函数间的真实交互关系,比基于软件源代码的静态分析方法更加准确,在一定程度上克服了基于静态分析的关键元素识别方法模型不准确的问题。

(2)本发明提出用基于g核分解的方法识别软件中的关键函数,在一定程度上克服了现有方法只关注软件中粗粒度的关键包和关键类的识别,忽视细粒度的软件关键函数识别的问题,可以为软件理解、软件测试、代码维护等工作提供技术支持。

附图说明

图1本发明的java语言编写的源代码;

图2本发明的实施例构建的fg;

图3本发明的实施例的g核分解过程。

具体实施方式

下面通过实施例并结合附图对本发明的技术方案作进一步的说明:

本发明提出的一种基于g核分解的软件关键函数识别方法,具体步骤如下:

(1)将java语言编写的软件在函数粒度抽象为函数依赖图fg=(n,d)。图1所示的是一个java源代码。按照图1所给的java源代码,当其在jvm上运行时,首先执行main函数,然后通过main函数调用add函数9次,通过main函数调用sub1函数1次;sub1在执行的时候调用sub2和add各1次。所以,根据其运行状况,可以得到如图2所示的fg,节点边的文字为节点相应函数的名字。其中,n={main,sub1,sub2,add}为函数节点的集合;d={(main,sub1),(main,add),(sub1,sub2),(sub1,add)}是无向边的集合,表示函数间的调用关系;边上的数字代表调用关系的频次。

(2)基于步骤(1)构建的fg计算函数节点i的g核数g(i),作为节点相应函数的重要性值。函数节点i的g核数g(i)的计算具体包括以下子步骤(这些步骤统称为fg的g核分解过程):

(2.1)求步骤(1)所得fg中所有函数节点的加权度。函数节点j的加权度wj定义为fg中与该函数节点相连的所有边的强度值和,即:

其中,vj是函数节点j的邻居函数节点集合;w(j,m)是边(j,m)上的强度值。因此,图2中函数节点main的加权度wmain=9+1=10,sub1的加权度为wsub1=1+1+1=3,sub2的加权度wsub2=1,add的加权度为wadd=9+1=10。

(2.2)求步骤(1)所得fg中所有函数节点的度。函数节点j的度kj定义为fg中与该函数节点相连的边数。因此,图2中函数节点main的度kmain=1+1=2,sub1的度为ksub1=1+1+1=3,sub2的度ksub2=1,add的度为kadd=1+1=2。

(2.3)求步骤(1)所得fg中所有函数节点的几何平均度。函数节点j的几何平均度sj数值上等于与wj和kj积的算术平方根最接近的整数。sj计算公式为:

其中,round(n)返回最接近数值n的整数。因此,图2中函数节点main的几何平均度

(2.4)求步骤(1)所得fg的g核(g=1,2,3,…):反复去掉fg中几何平均度小于g的函数节点及其连边,得到的子图即为fg的g核。图2的g核分解过程如图3所示。

计算1核(g=1)。基于步骤(2.3)可得故所得1核图如图3(左二)所示。

计算2核(g=2)。基于1核,同时因为故在2核中,原1核中的节点sub2及与其相连的边将被移除,所得2核图如图3(左三)子图所示。

计算3核(g=3)。基于2核,同时重新计算各个节点的几何平均度,如图3(左三)子图所示,因为故在3核中,原2核中的节点sub1及与其相连的边将被移除,所得3核图如图3(左四)子图所示。

计算4核(g=4)。基于3核,同时重新计算各个节点的几何平均度,如图3(左四)子图所示,因为故在4核中,原3核中的节点main,add及与它们相连的边都将被移除,所得4核为空,即图2的fg不存在4核。

(2.5)求步骤(1)所得fg中所有函数节点的g核数:比较g核和(g+1)核中的函数节点,若函数节点存在于g核中,但是在(g+1)核中被删除,便可得到该函数节点的g核数为g。如在图3中,因节点sub2在1核中,但是不在2核中,故其g核数为1。同理可得,节点sub1的g核数为2,main和add的g核数为3。

(3)基于步骤(2)所得的函数节点的g核数,使用冒泡排序算法对函数节点进行降序排列,将排名前15%(现有技术普遍采用的一个值)的函数作为所识别的关键函数。基于步骤(2.5)的结果,所得排序结果为(main=add:3)>(sub1:2)>(sub2:1)。故排名前15%(15%*4=0.6,取整为1)的函数节点是main或add。

本文中所描述的具体实施例仅仅是对本发明精神作举例说明,实施例中main和add的值相等,这只是现实中可能的一种情况,但并不代表所有的情况都是如此。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。

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