System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种基于差异代码的程序修改意图分析方法技术_技高网

一种基于差异代码的程序修改意图分析方法技术

技术编号:40367788 阅读:5 留言:0更新日期:2024-02-20 22:13
本发明专利技术涉及一种基于差异代码的软件修改意图分析方法,首先,从高质量开源代码库爬取commit数据并处理,构建差异代码数据集;并根据通用的修改原因分类标准,将其分为:Corrective,Perfective,和Adaptive三类。再次,为差异代码的前后两个版本构建差异依赖图,这个过程需要先构建次语句级的系统依赖图,对差异部分进行前向与后向的次语句级切片,提取其差异影响范围,并将其视为差异依赖图。最终使用神经网络技术与图池化提取差异图的特征,并通过特征融合的方式融合差异代码的语法特征,构建为差异代码的特征表示,通过分类器,实现差异的意图识别。本发明专利技术的目的在于填补针对差异代码的修改意图分析技术的空白,帮助开发人员在软件开发和维护过程中更好的理解其他人的代码修改。

【技术实现步骤摘要】

本专利技术差异代码修改意图分析领域,主要用于解决软件版本更新过程中的修改意图分析领域,可以更好的帮助管理者和开发人员审查这些代码的修改。


技术介绍

1、软件维护对于确保软件项目在整个生命周期中的可持续性至关重要,了解维护活动的执行方式之一是了解代码更新的意图,即通过对版本控制系统(vcs)中提交历史的差异代码进行分类。对代码更改进行分类的重要性在于提供对整体维护工作的洞察,促进决策制定和有效管理软件演进。

2、在软件维护过程中,开发人员提交各种代码更改来修复错误、添加新功能或改进代码实现。理解这些程序提交的变更意图可以帮助开发人员审查其他开发人员的代码更改,并优先处理这些修改请求。此外,这种理解还可以帮助研究人员有效地研究程序特征,最终可以提升软件质量,提高了用户满意度,增加了可靠性,并降低了长期维护成本。

3、目前,常见的代码修改意图分类的方法有以下几种:

4、1)基于指标特征的方法:这种方法主要是利用代码一次修改过程中,语法特征的改变来刻画差异的情况。比如通过识别操作符的变化、圈复杂度的变化、代码行数的变化、函数个数的变化、代码的密度来描述软件改变。通过回归模型对差异进行建模

5、2)基于代码语法特征的方法,通过代码的抽象语法树asts,基于代码前后两个版本中ast树中节点的差异,来描述差异代码语法结构上的改变。在差异代码建模方面多使用的是基于文本信息的bert模型,或者基于cnn与rnn的模型。

6、现有方法存在的几个问题:

7、1)在分析差异代码时,并没有对差异部分进行显著的区分,而是将两个版本的全部代码一起输入到神经网络,没有精确描述差异的范围。

8、2)基于代码语法特征的方法,仅考虑了代码的语法特征,而代码之间更深层次的结构如数据依赖,控制依赖。以及函数的调用,多态,面向对象等特性则没有刻画。不能完整的描述代码的差异。在数据建模方面传统的cnn、rnn方法不能工作在图结构上,因而不能分析出图结构上的依赖控制关系。

9、3)基于指标特征的方法中,仅仅通过代码的常见指标来粗粒度的分析代码的结构变化,不能完整刻画代码的语法和语义信息。在建模方面使用基于回归的模型太过于传统,不能完整描述差异的信息。

10、针对这些问题,在本文中我们实验ssldg,来更为深层次且全面的描述代码的结构,其可以复杂的代码结构,如:多态,面向对象,函数的调用等等。从而能完整、清晰、细粒度的描述代码的结构。凭借ssldg,我们可以通过次语句切片来提取差异的修改范围从而更好的描述差异。在方法建模方面选择图神经网络可以有效的捕捉代码的图结构上的依赖关系,节点信息,从而更好的描述代码的差异。


技术实现思路

1、本专利技术通过提出了一种基于次语句代码系统依赖图的差异代码修改意图识别方法,来有效解决目前存在的差异代码的影响范围表述不清晰,且代码结构表示不细致的问题,并通过新颖的基于图神经网络的深度学习方式,更完整的描述差异的信息。

2、为了实现上述目的,本专利技术的技术方案如下:

3、步骤1):数据集构建和数据筛选与清洗,

4、1.1一般常将差异分类为corrective,perfective和adaptive。corrective:为了修正代码中出现的错误而进行的修改。perfective:为了提升代码的质量比如提高代码的性能,和可用性,可维护性而进行的修改。adaptive:意为将代码迁移到新的环境新的平台中,或为代码增加新的功能而进行的代码修改。

5、1.2:通过pydriller工具从github中爬取差异代码前后版本的所有文件,并筛选掉所有非java文件。

6、1.3:当差异的类型为增加时,前一个版本所有文件均为空。同样的,当差异类型为删除时,后一个版本所有的文件为空。

7、步骤2):对差异代码前后版本分别构建次语句级的系统依赖图。

8、2.1.构建系统依赖图,首先通过javaparser等工具构建代码的ast树,

9、2.2通过分析ast树的结构找出语句之间的控制依赖构建cfg图,找出ast树中的数据流传递构建ddg图,其后将cfg图与ddg图合并,即可得到sdg图。

10、2.3在最终的sdg图中加入更为细粒度的节点与依赖类型,最终边与节点类型见表1。

11、步骤3)对差异代码进行次语句级的切片,提取差异的影响范围。

12、3.1.分别在两个版本中对代码的差异行进行切片,切片准则为前向与后向切片相结合,找出他们的影响范围。

13、3.2.整合这些切片行,对于重复被切到的切片行,仅保存他们一次,且对不同文件的差异行要分别对他们进行汇总。

14、3.3.将以上切片范围保存为代码的差异依赖图(cig)。

15、步骤4):在上述的差异依赖图中,通过node2vec生成节点的初始特征,并拼接一个12bit长度的向量指示节点类型,节点类型见表1。

16、

17、表1.ssldg中的节点类型

18、其节点类型包括packagenode,classnode,instancemethodnode,statementnode,interfacenode,objectnode,polyobjectextension,formal-in,formal-out,actual-in,actual-out,membervariablenode.

19、步骤5):通过一个多层次gcn网络以及sortpooling方法得到代码的结构差异的抽象表示,网络具体结构见图2。

20、5.1对于差异图中任意一个节点v,它在gcn中的节点信息传播和汇聚的公式如下:

21、

22、其中n(v)代表了节点v的所有邻居节点,w为信息传递的权重矩阵。σ(*)为激活函数,可以为softmax、sigmoid、leakyrelu等,为神经网络传播第l层的u节点的隐藏层向量,∑为累加函数,|*|为取模运算,为图中v节点经过神经网络信息传播和汇聚最后的向量表示。

23、5.2sortpooling主要基于w-l算法,将拥有相同结构的节点安排在一个相同的位置,这个排序分方式使用weisfeiler-lehman算法。weisfeiler-lehman基本思想是将顶点的颜色与其一跳邻居的颜色连接起来作为顶点的wl signature,然后按字典顺序对签名字符串进行排序,以分配新的颜色;具有相同signature的顶点被赋予相同的新颜色。一个wlsignature刻画了顶点为根的height-1的子树。重复这个过程,直到颜色收敛或达到某个最大迭代次数h,这些具有相同颜色的结点就代表在图中具有相同的结构。任何一次迭代t上的顶点颜色唯一地对应于以顶点为根的height-t子树。相当于迭代次数越大,那么比较的子树深度越深。

24、这个本文档来自技高网...

【技术保护点】

1.一种基于差异代码的程序修改意图分析方法,其特征在于,所述方法包括如下步骤:

2.根据权利要求1所述的一种基于差异代码的程序修改意图分析方法,其特征在于,所述步骤1)中从开源代码数据库GitHub中爬取项目的commit信息,包括commit前后版本的所有JAVA文件,并通过Gumtree、Myer’s算法识别差异行。

3.根据权利要求1所述的一种基于差异代码的程序修改意图分析方法,其特征在于,步骤2)对差异代码前后版本分别构建次语句级的系统依赖图,具体如下:

4.根据权利要求1所述的一种基于差异代码的程序修改意图分析方法,其特征在于,步骤3)基于次语句级切片工具进行前后向的切片,提取本次差异的影响范围,视为差异依赖图,具体如下:

5.根据权利要求1所述的一种基于差异代码的程序修改意图分析方法,其特征在于,所述步骤4)图的差异信息通过<Pool(CIGbefore),Pool(CIGafter)>,其中CIG为差异依赖图,池化方法为基于Weisfeiler-Lehman的SortPooling算法,具体如下:步骤4):在上述的差异依赖图中,通过Node2vec生成节点的初始特征,并拼接一个12bit长度的向量指示节点类型,其节点类型包括PackageNode,ClassNode,InstanceMethodNode,StatementNode,InterfaceNode,ObjectNode,PolyObjectExtension,Formal-in,Formal-out,Actual-in,Actual-out,MemberVariableNode。

6.根据权利要求1所述的一种基于差异代码的程序修改意图分析方法,其特征在于,步骤5)基于DeepGCN模型,该模型包括一个三层的GCN网络提取图的特征,并最终使用SortPooling方法得到图的特征向量表示,具体如下:

7.根据权利要求1所述的一种基于差异代码的程序修改意图分析方法,其特征在于,

...

【技术特征摘要】

1.一种基于差异代码的程序修改意图分析方法,其特征在于,所述方法包括如下步骤:

2.根据权利要求1所述的一种基于差异代码的程序修改意图分析方法,其特征在于,所述步骤1)中从开源代码数据库github中爬取项目的commit信息,包括commit前后版本的所有java文件,并通过gumtree、myer’s算法识别差异行。

3.根据权利要求1所述的一种基于差异代码的程序修改意图分析方法,其特征在于,步骤2)对差异代码前后版本分别构建次语句级的系统依赖图,具体如下:

4.根据权利要求1所述的一种基于差异代码的程序修改意图分析方法,其特征在于,步骤3)基于次语句级切片工具进行前后向的切片,提取本次差异的影响范围,视为差异依赖图,具体如下:

5.根据权利要求1所述的一种基于差异代码的程序修改意图分析方法,其特征在于,所述步骤4)图的差异信息通过<pool(cigbefore),pool(cigafter)>,其中ci...

【专利技术属性】
技术研发人员:姚潮生梁哲恒张金波沈伍强曾纪钧龙震岳张小陆周昉昉崔磊李凯王业超沈桂泉
申请(专利权)人:广东电网有限责任公司
类型:发明
国别省市:

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

1