一种代码依赖关系的检测方法、装置和系统制造方法及图纸

技术编号:38390886 阅读:8 留言:0更新日期:2023-08-05 17:44
本发明专利技术公开了一种代码依赖关系的检测方法、装置和系统,属于软件成分分析技术领域,所述检测方法包括:构建代码仓库

【技术实现步骤摘要】
一种代码依赖关系的检测方法、装置和系统


[0001]本专利技术属于软件成分分析
,更具体地,涉及一种代码依赖关系的检测方法、装置和系统。

技术介绍

[0002]软件成分分析是软件工程中一个重要的研究领域。软件成分分析技术通过分析软件组件之间的依赖关系,帮助开发人员理解和管理软件系统的结构和复杂性,以提高软件系统的可维护性和可重用性。目前,大部分主流编程语言的软件成分分析方法主要通过标准的项目管理工具解析软件依赖文件获得软件依赖关系。目前软件成分分析仅能够依靠代码克隆检测技术完成。但是对待测项目中的全部函数或文件与开源社区中其他组件的函数或文件一一进行相似性比较的时间复杂度过高。因此,受限于代码克隆检测方法的时间开销,其难以支持大规模编程项目的软件成分分析。
[0003]现有的软件成分分析方法主要基于代码克隆检测技术完成,即一般以函数粒度与开源社区的所有项目函数进行相似性比较,对于相似性较高的函数则认为其存在代码依赖关系。事实上,一个项目中仅有少部分的函数具有项目代表性,即其核心函数。因此,将全部函数均进行相似性比较的方法不仅产生较高的时间开销,且会引入大量误报。比如,大部分项目均具有文件读写的功能函数,因此在对该函数进行克隆检测时,势必得到其与大量软件存在代码依赖关系。然而,该功能函数的依赖关系并非事实意义上的组件依赖。

技术实现思路

[0004]针对现有技术的以上缺陷或改进需求,本专利技术提供了一种代码依赖关系的检测方法、装置和系统,其目的在于,本专利技术通过创建代码仓库
‑<br/>版本

函数对应的嵌套索引字典,对其进行两次噪声函数过滤得到项目指纹函数;区别于现有技术中直接将待测函数与仓库内所有项目函数进行相似性比较,本专利技术将待测项目函数与项目指纹函数进行代码克隆检测得到待测项目函数的依赖关系,其计算复杂度更低且检测效率更高;由此解决现有代码可能检测计算复杂大且精度低的技术问题。
[0005]为实现上述目的,按照本专利技术的一个方面,提供了一种代码依赖关系的检测方法,包括:
[0006]S1:将代码仓库中各项目每个版本的代码拆分成多个函数,并生成每个函数的调用图;将每个版本对应的所有函数的调用图进行拼接,得到每个版本的函数调用图;
[0007]S2:根据每个项目各版本对应函数并集计算每个项目的索引字典D1;创建代码仓库

版本

函数对应的嵌套索引字典H1;将各项目的索引字典D1,得到代码仓库的索引字典D2;
[0008]S3:将嵌套索引字典H1中函数与索引字典D2中函数进行查重对比以去重,再对去重后的嵌套索引字典H1中各函数进行复杂度过滤,得到新嵌套索引字典H2;对嵌套索引字典H1中每个版本的函数调用图进行中心性过滤,得到每个版本的核心函数列表FL2;将核心
函数列表FL2和新嵌套索引字典H2中函数信息列表FL1交集运算得到项目指纹函数H3;
[0009]S4:对待检测项目的代码函数与项目指纹函数H3进行代码克隆检测,得到待检测项目的代码依赖关系。
[0010]在其中一个实施例中,所述S3包括:
[0011]S301:将嵌套索引字典H1中函数与索引字典D2中函数进行查重对比以去重,再对去重后的嵌套索引字典H1中各函数进行复杂度过滤,得到新嵌套索引字典H2及其函数信息列表FL1;
[0012]S302:基于中心性分析方法,计算代码仓库中各项目中每个版本的函数调用图的中心性评估值C
mean
,将符合中心性要求对应的函数列入每个版本的核心函数列表FL2;
[0013]S303:将核心函数列表FL2和新嵌套索引字典H2中的函数信息列表FL1进行交集运算,得到项目指纹函数H3。
[0014]在其中一个实施例中,所述S302包括:
[0015]S3021:分别计算嵌套索引字典H1中每个版本对应函数调用图的度中心性、katz中心性、介数中心性、特征向量中心性、紧密中心性和调和中心性;
[0016]S3022:基于S3021中计算得到中心性及各自的权重计算对应版本的函数调用图的中心性评估值C
mean

[0017]在其中一个实施例中,所述S3022包括:利用公式在其中一个实施例中,所述S3022包括:利用公式计算版本的函数调用图的中心性评估值C
mean

[0018]其中,C
d
为katz中心性,C
k
为katz中心性,C
b
为介数中心性,C
e
为特征向量中心性,C
c
为紧密中心性,C
h
为调和中心性。
[0019]在其中一个实施例中,所述S301包括:
[0020]S3011:将嵌套索引字典H1中函数与索引字典D2中函数进行查重对比以去重;
[0021]S3012:计算去重后的嵌套索引字典H1中各函数的代码可维护性指数,以表征函数计算复杂度,进而滤除复杂度不满足预设要求的函数,得到函数信息列表FL1及其对应的新嵌套索引字典H2。
[0022]在其中一个实施例中,所述S2包括:
[0023]S201:将每个项目各版本对应函数库的并集作为该项目的唯一函数库,以每个项目的唯一函数库的哈希值为键,值为其函数信息,构建每个项目的索引字典D1;
[0024]S202:创建仓库

版本

函数信息列表对应的嵌套索引字典H1;其第一个键是仓库号的哈希值、第二个键是版本信息的哈希值,值是函数信息;
[0025]S203:将各项目的唯一函数库的并集作为代码仓库的唯一函数库,以代码仓库的唯一函数库的哈希值为键,值为项目名称、函数路径、函数信息,构建代码仓库的索引字典D2。
[0026]在其中一个实施例中,所述S4包括:
[0027]S401:将待检测项目的代码函数和项目指纹函数H3中各函数均转化为语义向量;
[0028]S402:利用聚类算法待检测项目的代码函数的语义向量与项目指纹函数H3中各函数的语义向量进行代码克隆检测,得到待检测项目的代码依赖关系。
[0029]在其中一个实施例中,所述S402包括:
[0030]S4021:利用k

means算法对待检测项目的语义向量和项目指纹函数H3中各函数的语义向量进行聚类,使用肘部法来确定簇类的数量;
[0031]S4022:若待检测项目的代码函数处于项目指纹函数H3中各函数的聚类结果任一簇类,则标识待检测项目存在代码克隆现象。
[0032]按照本专利技术的另一方面,提供了一种代码依赖关系的检测装置,包括:
[0033]预处理模块,用于将代码仓库中各项目每个版本的代码拆分成多个函数,并生成每个函数的调用图;将每个版本对应的所有函数的调用图进行拼接,得到每个版本的函数调用图;
[0034]索引构建模块本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种代码依赖关系的检测方法,其特征在于,包括:S1:将代码仓库中各项目每个版本的代码拆分成多个函数,并生成每个函数的调用图;将每个版本对应的所有函数的调用图进行拼接,得到每个版本的函数调用图;S2:根据每个项目各版本对应函数并集计算每个项目的索引字典D1;创建代码仓库

版本

函数对应的嵌套索引字典H1;将各项目的索引字典D1,得到代码仓库的索引字典D2;S3:将嵌套索引字典H1中函数与索引字典D2中函数进行查重对比以去重,再对去重后的嵌套索引字典H1中各函数进行复杂度过滤,得到新嵌套索引字典H2;对嵌套索引字典H1中每个版本的函数调用图进行中心性过滤,得到每个版本的核心函数列表FL2;将核心函数列表FL2和新嵌套索引字典H2中函数信息列表FL1交集运算得到项目指纹函数H3;S4:对待检测项目的代码函数与项目指纹函数H3进行代码克隆检测,得到待检测项目的代码依赖关系。2.如权利要求1所述的代码依赖关系的检测方法,其特征在于,所述S3包括:S301:将嵌套索引字典H1中函数与索引字典D2中函数进行查重对比以去重,再对去重后的嵌套索引字典H1中各函数进行复杂度过滤,得到新嵌套索引字典H2及其函数信息列表FL1;S302:基于中心性分析方法,计算代码仓库中各项目中每个版本的函数调用图的中心性评估值C
mean
,将符合中心性要求对应的函数列入每个版本的核心函数列表FL2;S303:将核心函数列表FL2和新嵌套索引字典H2中的函数信息列表FL1进行交集运算,得到项目指纹函数H3。3.如权利要求2所述的代码依赖关系的检测方法,其特征在于,所述S302包括:S3021:分别计算嵌套索引字典H1中每个版本对应函数调用图的度中心性、katz中心性、介数中心性、特征向量中心性、紧密中心性和调和中心性;S3022:基于S3021中计算得到中心性及各自的权重计算对应版本的函数调用图的中心性评估值C
mean
。4.如权利要求3所述的代码依赖关系的检测方法,其特征在于,所述S3022包括:利用公式计算版本的函数调用图的中心性评估值C
mean
;其中,C
d
为katz中心性,C
k
为katz中心性,C
b
为介数中心性,C
e
为特征向量中心性,C
c
为紧密中心性,C
h
为调和中心性。5.如权利要求2所述的代码依赖关系的检测方法,其特征在于,所述S301包括:S3011:将嵌套索引字典H1中函数与索引字典D2中函数进行查重对比以去重;S3012:计算去重后的嵌套索引字典H1中各函数的代码可维护性指数,...

【专利技术属性】
技术研发人员:胡雨涛张明昊吴月明王可馨邹德清李珍
申请(专利权)人:华中科技大学
类型:发明
国别省市:

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

1