一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于知识图谱的代码克隆检测优化方法、装置和电子设备与流程

2022-03-05 09:13:05 来源:中国专利 TAG:


1.本技术涉及软件克隆技术领域,特别是涉及一种基于知识图谱的代码克隆检测优化方法、装置和电子设备。


背景技术:

2.代码克隆作为软件复用的重要手段,一方面加速了软件的开发效率,另一方面也带来了软件质量问题,增加了软件缺陷修复的困难,带来了软件知识产权保护的问题。基于这些原因,学术界和工业界涌现出了大量代码克隆检测相关研究和大量克隆检测算法,其中一些算法关注于克隆检测的效率(执行时间)。
3.然而对于现有开源世界来说,开源项目众多,代码量巨大,且克隆情况严重。因此现有的方法很难快速实现对这种规模代码的克隆检测。


技术实现要素:

4.基于此,有必要针对上述技术问题,提供一种基于知识图谱的代码克隆检测优化方法、装置和电子设备。该方法现有代码克隆检测算法检测效率无法适应大规模开源代码的问题,在代码检测过程中动态构建克隆关系知识图谱,利用知识图谱对克隆检测的候选代码片段进行筛选,减少克隆检测次数,进而优化现有克隆检测方法,提升克隆检测效率。
5.一种基于知识图谱的代码克隆检测优化方法,所述方法包括:
6.获取多个待检测代码片段以及采用预定筛选策略对每个待检测代码片段对应的候选代码片段集合进行筛选得到的对应初始候选代码片段集合,并将多个所述待检测代码片段组成待检测代码片列表。
7.将所述待检测代码片列表中的第一个元素作为当前待检测代码片段;并设置初始知识图谱为空。
8.根据所述初始知识图谱中的聚簇中心节点信息,对所述当前待检测代码片段对应的候选代码片段集合进行筛选,并根据得到的筛选结果和当前待检测代码片段所对应的初始候选代码片段集合,得到当前待检测代码片段对应的优化后的候选代码片段集合。
9.采用预设克隆检测方法检测每个所述待检测代码片段与对应的优化后的候选代码片段集合中的每个候选代码片段之间的克隆关系,得到克隆检测结果。
10.根据所述克隆检测结果、所述当前待检测代码片段以及对应的最优候选代码片段集合对初始知识图谱进行动态更新,将所述待检测代码片列表中的下一个元素作为当前待检测代码片段,并进行下一次克隆检测,直到所述待检测代码片列表中所有元素检测完为止,得到优化后的克隆知识图谱。
11.根据所述克隆知识图谱,得到优化后的所有克隆对集合。
12.一种基于知识图谱的代码克隆检测优化装置,所述装置包括:
13.待检测代码片段获取模块,用于获取多个待检测代码片段以及采用预定筛选策略对每个待检测代码片段对应的候选代码片段集合进行筛选得到的对应初始候选代码片段
集合,并将多个所述待检测代码片段组成待检测代码片列表;
14.克隆检测准备模块,用于将所述待检测代码片列表中的第一个元素作为当前待检测代码片段;并设置初始知识图谱为空。
15.克隆检测模块,用于根据所述初始知识图谱中的聚簇中心节点信息,对所述当前待检测代码片段对应的候选代码片段集合进行筛选,并根据得到的筛选结果和当前待检测代码片段所对应的初始候选代码片段集合,得到当前待检测代码片段对应的优化后的候选代码片段集合;采用预设克隆检测方法检测每个所述待检测代码片段与对应的优化后的候选代码片段集合中的每个候选代码片段之间的克隆关系,得到克隆检测结果。
16.克隆知识图谱构建模块,用于根据所述克隆检测结果、所述当前待检测代码片段以及对应的最优候选代码片段集合对初始知识图谱进行动态更新,将所述待检测代码片列表中的下一个元素作为当前待检测代码片段,并进行下一次克隆检测,直到所述待检测代码片列表中所有元素检测完为止,得到优化后的克隆知识图谱。
17.克隆检测结果确定模块,用于根据所述克隆知识图谱,得到优化后的所有克隆对集合。
18.上述基于知识图谱的代码克隆检测优化方法、装置和电子设备,所述方法获取多个待检测代码片段以及采用预定筛选策略对每个待检测代码片段对应的候选代码片段集合进行筛选得到的对应初始候选代码片段集合;利用知识图谱的知识对初始获选代码片段进行筛选,得到优化后的候选代码片段集合;采用预设克隆检测方法检测每个待检测代码片段与对应的优化后的候选代码片段集合中的每个候选代码片段之间的克隆关系,得到克隆检测结果;根据克隆检测结果、待检测代码片段以及对应的最优候选代码片段集合构建优化后的克隆知识图谱;根据克隆知识图谱,得到优化后的所有克隆对集合。本方法未对现有克隆检测方法进行修改,而仅利用克隆传递性对克隆检测候选代码集合进行了进一步筛选,因此不会导致原有克隆检测方法在准确度发生变化,同时该技术没有对开发语言的依赖性,因此可以适用于现有所有克隆检测方法。
附图说明
19.图1为一个实施例中基于知识图谱的代码克隆检测优化方法的流程示意图;
20.图2为现有代码克隆检测算法流程;
21.图3为一个实施例中基于知识图谱的代码克隆检测优化技术架构图及对应的各子模块的流程图;
22.图4为一个实施例中基于知识图谱的代码克隆检测优化装置的结构框图;
23.图5为一个实施例中电子设备的内部结构图。
具体实施方式
24.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。
25.在一个实施例中,如图1所示,提供了一种基于知识图谱的代码克隆检测优化方法,该方包括以下步骤:
26.步骤100:获取多个待检测代码片段以及采用预定筛选策略对每个待检测代码片段对应的候选代码片段集合进行筛选得到的对应初始候选代码片段集合,并将多个待检测代码片段组成待检测代码片列表。
27.具体的:预定筛选策略是自定义筛选策略,以减少克隆检测次数,提升检测效率。
28.预定筛选策略可以是:根据编程语言筛选无关代码文件中的代码片段来筛选代码片段、根据代码片段是否包含相同子字符串来筛选代码片段。例如:“abcdefg”,“bcduiopl”包含相同子字符串“bcd”,因此它们有可能是克隆的,如果任何子字符串都不相同,则认为两个代码片段不可能存在克隆关系。
29.步骤102:将待检测代码片列表中的第一个元素作为当前待检测代码片段;并设置初始知识图谱为空。
30.步骤104:根据初始知识图谱中的聚簇中心节点信息,对当前待检测代码片段对应的候选代码片段集合进行筛选,并根据得到的筛选结果和当前待检测代码片段对应的初始候选代码片段集合,得到当前待检测代码片段对应的优化后的候选代码片段集合。
31.知识图谱中具有克隆关系的节点会形成聚簇,其中第一个加入网络中的节点被认为是中心节点,用于代表整个聚簇与待检测代码片段进行克隆检测。
32.步骤106:采用预设克隆检测方法检测每个待检测代码片段与对应的优化后的候选代码片段集合中的每个候选代码片段之间的克隆关系,得到克隆检测结果。
33.具体的,预设克隆检测方法是现有的克隆检测方法。
34.步骤108:根据克隆检测结果、当前待检测代码片段以及对应的最优候选代码片段集合对初始知识图谱进行动态更新,将待检测代码片列表中的下一个元素作为当前待检测代码片段,并进行下一次克隆检测,直到待检测代码片列表中所有元素检测完为止,得到优化后的克隆知识图谱。
35.步骤110:根据克隆知识图谱,得到优化后的所有克隆对集合。
36.具体的,克隆对集合用来记录与当前待检测代码片段存在克隆关系的所有代码片段。
37.上述基于知识图谱的代码克隆检测优化方法中,所述方法获取多个待检测代码片段以及采用预定筛选策略对每个待检测代码片段对应的候选代码片段集合进行筛选得到的对应初始候选代码片段集合;利用知识图谱的知识对初始获选代码片段进行筛选,得到优化后的候选代码片段集合;采用预设克隆检测方法检测每个待检测代码片段与对应的优化后的候选代码片段集合中的每个候选代码片段之间的克隆关系,得到克隆检测结果;根据克隆检测结果、待检测代码片段以及对应的最优候选代码片段集合构建优化后的克隆知识图谱;根据克隆知识图谱,得到优化后的所有克隆对集合。本方法未对现有克隆检测方法进行修改,而仅利用克隆传递性对克隆检测候选代码集合进行了进一步筛选,因此不会导致原有克隆检测方法在准确度发生变化,同时该技术没有对开发语言的依赖性,因此可以适用于现有所有克隆检测方法。
38.在其中一个实施例中,聚簇是初始知识图谱中具有克隆关系的节点形成的;其中第一个加入每个聚簇的节点是聚簇的中心节点;步骤104包括:查询初始知识图谱中所有的聚簇中心节点,并根据聚簇中心节点信息对当前待检测代码片段对应的候选代码片段集合进行筛选;并根据得到的筛选结果和当前待检测代码片段对应的初始候选代码片段集合取
交集后,得到优化后的候选代码片段集合。
39.在其中一个实施例中,步骤106包括:遍历每个优化后候选代码片段集合中的候选代码片段,利用预设克隆检测算法检测每个待检测代码片段与对应的候选代码片段是否存在克隆关系,得到每个待检测代码片段的克隆检测结果。
40.在其中一个实施例中,克隆检测结果包括待检测代码片段与候选代码片段中存在克隆关系,待检测代码片段与候选代码片段中不存在克隆关系;步骤108包括:当克隆检测结果为当前待检测代码片段与候选代码片段存在克隆关系时,在初始知识图谱中将当前待检测代码片段以新节点的形式插入,并添加候选代码片段对应的聚簇中心节点到该节点的有向边,节点的有向边代表克隆关系;当克隆检测结果为当前待检测代码片段与候选代码片段中不存在克隆关系时,在初始知识图谱中将当前待检测代码片段以新节点的形式插入,同时将该节点作为新的聚簇中心节点;将待检测代码片列表中的下一个元素作为当前待检测代码片段集合,并进行下一次克隆检测,直到待检测代码片列表中所有元素检测完为止,得到优化后的克隆知识图谱。
41.在其中一个实施例中,步骤110包括:查询克隆知识图谱中所有聚簇节点,形成聚簇节点列表;其中聚簇节点列表中的元素表示聚簇中心节点对应的代码片段;遍历聚簇节点列表中每个聚簇中心节点,查询与每个聚簇中心节点具有克隆关系的聚簇中所有非中心节点,得到聚簇节点列表,聚簇节点列表中的元素为与聚簇中心节点具有克隆关系的聚簇中所有非中心节点和该聚簇中心节点组成的元素;将聚簇节点列表中的元素两两组合形成元组,得到单个聚簇的克隆对集合;将所有单个聚簇的克隆对集合取并集,得到优化后的所有克隆对集合。
42.在其中一个实施例中,步骤100中初始候选代码片段集合确定的具体步骤包括:采用预定筛选策略对每个待检测代码片段进行筛选,得到对应的初始候选代码片段集合;其中预定筛选策略为根据编程语言筛选无关代码文件中的代码片段和/或根据代码片段是否包含相同子字符串。
43.在一个实施例中,提供了一种基于知识图谱的代码克隆检测优化方法,本方法旨在优化候选代码筛选阶段,利用知识图谱和克隆传递性原则,减少代码克隆检测比较次数。克隆传递性原则是指:a与b是克隆关系,b与c是克隆关系,则a与c也是克隆关系。
44.在介绍本方案之前先介绍现有克隆检测方法的构成,如图2所示,现有代码克隆检测算法主要包括三个步骤:
45.步骤1、代码抽取:抽取目标检测文件夹中所有的代码片段,形成集合codeset,其目标是找到目标文件夹中所有克隆的代码对。
46.步骤2、单个代码片段克隆检测:遍历codeset中的每个代码片段(code),找到所有与code存在克隆关系的其他代码片段,形成克隆对集合(codecloneset)。具体步骤包括:
47.步骤2.1、候选代码片段筛选:对于每个待检测代码片段(code),筛选候选代码片段集合(candidateset)。值得注意的是,大量检测工作中会自定义筛选策略,以减少克隆检测次数,提升检测效率。现有的筛选策略举例如下:根据编程语言筛选无关代码文件中的代码片段来筛选代码片段、根据代码片段是否包含相同子字符串来筛选代码片段。
48.步骤2.2、候选集合检测:遍历每个candidateset中的元素(candidate),利用自定义克隆检测算法检测code与candidate是否存在克隆关系,如果存在克隆关系,则将code,
candidate以元组的形式插入到克隆对集合codecloneset中。克隆对集合用来记录与当前代码片段code存在克隆关系的所有代码片段。
49.步骤3、构建克隆对集合:将步骤2中检测到的克隆对集合(codecloneset)
[0050][0051]
codeset集合大小)。
[0052]
如图3所示,本实施例的方案包括以下模块:
[0053]
模块1、克隆检测模块:在原有克隆检测方法筛选候选代码片段的基础上,利用知识图谱中的聚簇中心节点信息,减少候选代码片段数量,完成克隆检测并调用动态构建知识图谱模块完成图的更新。具体步骤见步骤11-步骤13。
[0054]
模块2、动态构建知识图谱:根据模块1中的检测结果更新知识图谱,主要包括两个子模块来分别处理检测到克隆关系的代码片段和未检测到克隆关系的代码片段。具体描述见模块21-模块22。
[0055]
模块3、构建克隆检测结果:在克隆检测结束后,形成了完整的克隆知识图谱,根据知识图谱构建最终的克隆对集合。具体步骤见步骤31-步骤34。
[0056]
模块1所述的具体执行以下步骤:
[0057]
步骤11、候选代码片段筛选:对于待检测代码片段(code),在原有方法候选代码列表(candidateset1)的基础上,通过查询克隆关系网络,查询所有聚簇中心节点,作为本方法的候选代码列表(candidateset2),通过交集计算公式candidateset1∩candidateset2得到最终的候选代码片段集合(candidateset)。
[0058]
步骤12、克隆检测算法运行:遍历对步骤11中得到的候选代码片段(candidateset),对每个元素candidate,利用现有克隆检测方法检测code与candidate之间的克隆关系。
[0059]
步骤13、动态构建知识图谱接口调用:步骤12中如果发现克隆关系,则利用模块21更新知识图谱,将待检测代码片段加入到已有克隆聚簇中,至此完成了模块1的操作,并可退出后续检测;如果未发现克隆关系,则利用模块22更新知识图谱,将待检测代码片段以新聚簇中心的形式加入到知识图谱中。
[0060]
模块2所述的具体包括以下子模块:
[0061]
模块21、存在克隆关系代码片段更新子模块:如果待检测代码片段在步骤12中检测到了候选代码片段中存在克隆关系,则在知识图谱中将待检测代码片段以新节点的形式插入,同时添加候选代码片段对应的聚簇中心节点到该节点的有向边;其中聚簇中心节点到该节点的有向边表示克隆关系
[0062]
模块22、不存在克隆关系代码片段更新子模块:如果待检测代码片段在步骤12中未检测到候选代码片段中存在克隆关系,则在知识图谱中将待检测代码片段以新节点的形式插入,同时将该节点作为新的聚簇中心节点,因为该节点与知识图谱中其他节点不存在克隆关系。
[0063]
模块3所述的具体执行以下步骤:
[0064]
步骤31、查询聚簇中心节点:查找所有聚簇中心节点,形成聚簇中心节点列表centrallist,列表中的元素表示聚簇中心节点对应的代码片段;
[0065]
步骤32、克隆节点查询:遍历centrallist中每个聚簇中心节点central,查询与该节点具有克隆关系的聚簇中所有非中心节点,与该节点central共同形成聚簇节点列表nodelist;
[0066]
步骤33、克隆对构建:将centrallist中的元素两两组合形成元组,即可形成单个聚簇的克隆对集合centralcloneset;
[0067]
步骤34、克隆对列表构建:将步骤32得到的所有centralcloneset求并集,得到的集合cloneset,即所有克隆对集合。
[0068]
该方法基于克隆知识图谱,利用现有的克隆检测结果对候选检测集合进行过滤,从而提升克隆检测速度,该方法充分考虑了开源世界中代码重复性严重这一特点,并且代码规模越大,速度提升效果越明显。该方法没有对开发语言的依赖性,因此可以适用于现有所有克隆检测方法。
[0069]
应该理解的是,虽然图1-3的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1-3中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
[0070]
在一个实施例中,如图4所示,提供了一种基于知识图谱的代码克隆检测优化装置,包括待检测代码片段获取模块、克隆检测准备模块、克隆检测模块、克隆知识图谱构建模块和克隆检测结果确定模块,其中:
[0071]
待检测代码片段获取模块,用于获取多个待检测代码片段以及采用预定筛选策略对每个待检测代码片段对应的候选代码片段集合进行筛选得到的对应初始候选代码片段集合,并将多个待检测代码片段组成待检测代码片列表。
[0072]
克隆检测准备模块,用于将待检测代码片列表中的第一个元素作为当前待检测代码片段;并设置初始知识图谱为空。
[0073]
克隆检测模块,用于根据初始知识图谱中的聚簇中心节点信息,对当前待检测代码片段对应的候选代码片段集合进行筛选,并根据得到的筛选结果和当前待检测代码片段对应的初始候选代码片段集合,得到当前待检测代码片段对应的优化后的候选代码片段集合;采用预设克隆检测方法检测每个待检测代码片段与对应的优化后的候选代码片段集合中的每个候选代码片段之间的克隆关系,得到克隆检测结果。
[0074]
克隆知识图谱构建模块,用于根据克隆检测结果、当前待检测代码片段以及对应的最优候选代码片段集合对初始知识图谱进行动态更新,将待检测代码片列表中的下一个元素作为当前待检测代码片段,并进行下一次克隆检测,直到待检测代码片列表中所有元素检测完为止,得到优化后的克隆知识图谱。
[0075]
克隆检测结果确定模块,用于根据克隆知识图谱,得到优化后的所有克隆对集合。
[0076]
在其中一个实施例中,聚簇是初始知识图谱中具有克隆关系的节点形成的;其中聚簇的中心节点是第一个加入每个聚簇的节点;克隆检测模块,还用于查询初始知识图谱中所有的聚簇中心节点,并根据聚簇中心节点信息对当前待检测代码片段对应的候选代码
片段集合进行筛选;并根据得到的筛选结果和当前待检测代码片段对应的初始候选代码片段集合取交集后,得到优化后的候选代码片段集合。
[0077]
在其中一个实施例中,克隆检测模块,还用于遍历每个优化后候选代码片段集合中的候选代码片段,利用预设克隆检测算法检测每个待检测代码片段与对应的候选代码片段是否存在克隆关系,得到每个待检测代码片段的克隆检测结果。
[0078]
在其中一个实施例中,克隆检测结果包括待检测代码片段与候选代码片段中存在克隆关系,待检测代码片段与候选代码片段中不存在克隆关系;克隆知识图谱构建模块,还用于当克隆检测结果为当前待检测代码片段与候选代码片段存在克隆关系时,在初始知识图谱中将当前待检测代码片段以新节点的形式插入,并添加候选代码片段对应的聚簇中心节点到该节点的有向边,节点的有向边代表克隆关系;当克隆检测结果为当前待检测代码片段与候选代码片段中不存在克隆关系时,在初始知识图谱中将当前待检测代码片段以新节点的形式插入,同时将该节点作为新的聚簇中心节点;将待检测代码片列表中的下一个元素作为当前待检测代码片段集合,并进行下一次克隆检测,直到待检测代码片列表中所有元素检测完为止,得到优化后的克隆知识图谱。
[0079]
在其中一个实施例中,克隆检测结果确定模块,还用于查询克隆知识图谱中所有聚簇节点,形成聚簇节点列表;其中聚簇节点列表中的元素表示聚簇中心节点对应的代码片段;遍历聚簇节点列表中每个聚簇中心节点,查询与每个聚簇中心节点具有克隆关系的聚簇中所有非中心节点,得到聚簇节点列表,聚簇节点列表中的元素为与聚簇中心节点具有克隆关系的聚簇中所有非中心节点和该聚簇中心节点组成的元素;将聚簇节点列表中的元素两两组合形成元组,得到单个聚簇的克隆对集合;将所有单个聚簇的克隆对集合取并集,得到优化后的所有克隆对集合。
[0080]
在其中一个实施例中,待检测代码片段获取模块,还用于采用预定筛选策略对每个待检测代码片段进行筛选,得到对应的初始候选代码片段集合;其中预定筛选策略为根据编程语言筛选无关代码文件中的代码片段和/或根据代码片段是否包含相同子字符串。
[0081]
关于基于知识图谱的代码克隆检测优化装置的具体限定可以参见上文中对于基于知识图谱的代码克隆检测优化方法的限定,在此不再赘述。上述基于知识图谱的代码克隆检测优化装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
[0082]
在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图5所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种基于知识图谱的代码克隆检测优化方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
[0083]
本领域技术人员可以理解,图5中示出的结构,仅仅是与本技术方案相关的部分结构的框图,并不构成对本技术方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
[0084]
在一个实施例中,提供了一种电子设备,包括存储器和处理器,该存储器存储有计算机程序,该处理器执行计算机程序时实现上式方法实施例中的步骤。
[0085]
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
[0086]
以上所述实施例仅表达了本技术的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本技术构思的前提下,还可以做出若干变形和改进,这些都属于本技术的保护范围。因此,本技术专利的保护范围应以所附权利要求为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献