CN110554868B - 一种软件复用代码检测方法及系统 - Google Patents

一种软件复用代码检测方法及系统 Download PDF

Info

Publication number
CN110554868B
CN110554868B CN201910857936.9A CN201910857936A CN110554868B CN 110554868 B CN110554868 B CN 110554868B CN 201910857936 A CN201910857936 A CN 201910857936A CN 110554868 B CN110554868 B CN 110554868B
Authority
CN
China
Prior art keywords
node
similar
neighbor
software function
function network
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201910857936.9A
Other languages
English (en)
Other versions
CN110554868A (zh
Inventor
艾骏
郭皓然
施韬
王飞
邹卓良
许嘉熙
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beihang University
Original Assignee
Beihang University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beihang University filed Critical Beihang University
Priority to CN201910857936.9A priority Critical patent/CN110554868B/zh
Publication of CN110554868A publication Critical patent/CN110554868A/zh
Application granted granted Critical
Publication of CN110554868B publication Critical patent/CN110554868B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/36Software reuse

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Data Exchanges In Wide-Area Networks (AREA)

Abstract

本发明公开一种软件复用代码检测方法及系统。该方法包括:获取两个待检测软件的软件代码;以软件代码中的函数作为节点,以函数之间的调用关系作为边建立软件函数网络;分别计算两个软件函数网络特征参数;特征参数包括节点参数和边参数;节点参数包括节点结构特征参数和节点代码特征参数;根据各个节点与周围节点的连通关系将两个软件函数网络中的各个节点进行分类;根据节点参数计算两个软件函数网络中属于同一类别的节点中的相似节点,得到多组相似节点对;以每组相似节点对作为基准节点,逐步识别两个软件函数网络中的相似边,得到多对相似子网,从而确定每对相似子网所对应的软件代码为复用代码。本发明能提高复用代码的检测精度。

Description

一种软件复用代码检测方法及系统
技术领域
本发明涉及软件代码检测领域,特别是涉及一种软件复用代码检测方法及系统。
背景技术
随着互联网技术和开源软件的蓬勃发展,越来越多的开发者参与到开源软件开发中,开源社区也因此积累了海量优秀的开源软件资源和开源知识资源。开源软件的免费、开放、可定制、受整个社区监督等特性,使其可为软件开发提供技术快速应用、增加创新、减少成本和开发时间等有利条件。在如今软件开发效率和质量亟需提高的背景下,开源已经成为IT行业中势力庞大的一支生力军。今年上半年,Synopsys公司发布了《“2018年开源代码安全和风险分析Black Duck(黑鸭)”》报告,报告审计了2017年超过1100个商业代码库,行业涉及了包括企业软件、金融服务、医疗保健、制造业在内的9个领域。报告显示,96%的被扫描应用中存在开源组件,开源代码在代码库中占的平均比例从去年的36%增长到57%,这表明开源代码的使用量在持续大幅度增长,目前大量的应用所包含的开源代码要多于专有代码。
开源的好处却也是风险的来源。依然根据上文中的报告,每个代码库中开源漏洞数量较去年增长了134%。此外,开源软件需要用户自行负责跟踪他们所使用的开源软件的漏洞、修复和更新。如果一个组织机构不了解其所使用的所有开源代码,就不可能抵御针对这些组件中已知漏洞的常见攻击,并将自己暴露在许可证合规风险和知识产权等法律风险之中,带来不同程度的安全威胁及经济或名誉损失,而这个问题目前在软件所有者中是普遍存在的。与此同时,开源软件抄袭问题也会严重影响开源生态发展。抄袭行为既是对开源软件作者的不尊重,也会对所在组织机构造成恶劣影响。2017年,美国三大个人信用评估机构之一的Equifax遭遇黑客攻击,约有1.43亿美国用户的个人重要信息面临泄漏。事件由开源Apache Struts2包中的一个已知漏洞引发,该漏洞能让远程攻击者发送恶意请求,从而执行任意命令,且该漏洞从被公开到被利用只间隔一天。2018年8月15日,号称自主可控、自主研发浏览器核心产品的红芯公司被爆出该浏览器包含大量和谷歌chorme浏览器一致的同名文件,其安装程序的文件属性中也显示了原始文件名chrome.exe。红芯浏览器的官网已撤下了浏览器的下载链接,所属公司发表声明进行致歉。
有调查显示,在复用开源软件进行开发的过程中,源代码是最主要且重要的复用对象。由此可见,识别代码中的开源成分以抵御开源风险是非常必要的,然而目前还没有成熟且有效的工具或技术来解决这一问题。目前识别并检测复用代码或相似代码的常用方法是代码克隆检测技术。代码克隆检测技术主要被分为基于文本、基于token、基于度量、基于抽象语法树和基于程序依赖图五类。其中前三类代码克隆检测技术是非语法的检测工具,只能检测到除空白、注释和布局以外完全相同或者除标识名、变量名、变量类型和函数名以外完全相同的代码。这类检测技术对代码间的相似程度要求较高,检测精度低。基于抽象语法树和基于程序依赖图的代码克隆检测技术是基于语法的检测工具,可以检测到存在着一定的插入、删除和修改语句的相似代码,以及功能相似但是通过不同的语法方式实现的代码。但这类检测技术仍拘泥于代码语句上的检测,并没有抓住代码复用或相似代码的主要特点,检测精度同样较低。
发明内容
本发明的目的是提供一种软件复用代码检测方法及系统,提高复用代码的检测精度。
为实现上述目的,本发明提供了如下方案:
一种软件复用代码检测方法,包括:
获取两个待检测软件的软件代码;
以软件代码中的函数作为节点,以函数之间的调用关系作为边分别对两个所述待检测软件建立软件函数网络,得到第一软件函数网络和第二软件函数网络;
分别计算所述第一软件函数网络和所述第二软件函数网络的特征参数;所述特征参数包括节点参数和边参数;所述节点参数包括节点结构特征参数和节点代码特征参数;所述边参数包括调用类型;
根据各个节点与周围节点的连通关系将所述第一软件函数网络和所述第二软件函数网络中的各个节点进行分类;
根据节点参数计算所述第一软件函数网络和所述第二软件函数网络中属于同一类别的节点中的相似节点,得到多组相似节点对;
以每组相似节点对作为基准节点,逐步识别所述第一软件函数网络和所述第二软件函数网络中的相似边,得到多对相似子网,从而确定每对相似子网所对应的软件代码为复用代码。
可选的,所述根据各个节点与周围节点的连通关系将所述第一软件函数网络和所述第二软件函数网络中的各个节点进行分类,具体包括:
按照待检测软件各个部分的功能分别所述第一软件函数网络和所述第二软件函数网络划分为多个网络模块;
计算每个节点与所在网络模块中的各个节点之间的连通程度,得到模块内的连通度;
根据各个节点的模块内连通度对各个节点进行初步分类,得到初步分类结果;
计算每个节点与外部网络模块中的各个节点之间的连通程度,得到模块间的连通度;
根据各个节点的模块间连通度在所述初步分类结果的基础上对各个节点进行进一步分类。
可选的,所述根据节点参数计算所述第一软件函数网络和所述第二软件函数网络中属于同一类别的节点中的相似节点,得到多组相似节点对,具体包括:
将各个节点的所述节点结构特征参数生成第一特征向量,将各个节点的所述节点代码特征参数生成第二特征向量;
计算所述第一软件函数网络与所述第二软件函数网络中属于同一类别的节点的第一特征向量之间的堪培拉距离,得到节点结构相似度;
将所述节点结构相似度满足结构相似度阈值的节点对确定为结构相似节点对;
计算所述结构相似节点对的第二特征向量之间的堪培拉距离,得到节点代码相似度;
将所述节点代码相似度满足代码相似度阈值的节点对确定为相似节点对。
可选的,所述以每组相似节点对作为基准节点,逐步识别所述第一软件函数网络和所述第二软件函数网络中的相似边,得到多对相似子网,从而确定每对相似子网所对应的软件代码为复用代码,具体包括:
选取当前相似节点对作为基准节点对;所述当前相似节点对中属于所述第一软件函数网络的节点为第一基准节点,所述当前相似节点对中属于所述第二软件函数网络的节点为第二基准节点;
将所述第一基准节点和所述第二基准节点标记为当前相似子网的点;
搜索所述基准节点对中每个节点的邻居节点中出度为1的节点,得到基准节点对中每个节点所对应的邻居节点集合;节点的出度为节点指向其他节点的有向边的数量;
计算其中一个邻居节点集合中的每个节点与另外一个邻居节点集合中国每个节点的特征向量之间的堪培拉距离,得到多个邻居节点对的堪培拉距离;
筛选多个所述邻居节点对的堪培拉距离中的最小值所对应的邻居节点对,得到最小相似邻居节点对;所述最小相似邻居节点对包括第一软件函数网络中的第一相似邻居节点和第二软件函数网络中的第二相似邻居节点;
判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边是否相似,得到第一判断结果;
若所述第一判断结果表示是,则将所述第一相似邻居节点和所述第二相似邻居节点标记为当前相似子网的点,将所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边标记为当前相似子网的边;
判断所述第一相似邻居节点和所述第二相似邻居节点是否都有出边,得到第二判断结果;
若所述第二判断结果表示是,则更新所述第一基准节点为所述第一相似邻居节点,更新所述第二基准节点为所述第二相似邻居节点,并返回步骤“搜索所述基准节点对中每个节点的邻居节点中出度为1的节点,得到基准节点对中每个节点所对应的邻居节点集合”;
若所述第一判断结果表示否,则将多个所述邻居节点对的堪培拉距离中与所述第一相似邻居节点以及所述第二相似邻居节点相关的距离值删除,并判断删除后是否有剩余距离值,得到第三判断结果;
若所述第三判断结果表示是,则返回步骤“筛选多个所述邻居节点对的堪培拉距离中的最小值所对应的邻居节点对,得到最小相似邻居节点对”;
若所述第二判断结果表示否或所述第三判断结果表示否,则当前相似子网建立完成,更新所述基准节点对为下一个相似节点对,并返回步骤“将所述第一基准节点和所述第二基准节点标记为当前相似子网的点”。
可选的,所述判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边是否相似,得到第一判断结果,具体包括:
判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边的linktype值是否相同,得到第四判断结果;
若所述第四判断结果表示否,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边不相似;
若所述第四判断结果表示是,则判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边linktype值为depend还是call,得到第五判断结果;
若所述第五判断结果表示depend,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边相似;
若所述第五判断结果表示call,则判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边的calltype值是否相同,得到第六判断结果;
若所述第六判断结果表示是,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边相似;
若所述第六判断结果表示否,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边不相似。
一种软件复用代码检测系统,包括:
获取模块,用于获取两个待检测软件的软件代码;
网络建立模块,用于以软件代码中的函数作为节点,以函数之间的调用关系作为边分别对两个所述待检测软件建立软件函数网络,得到第一软件函数网络和第二软件函数网络;
特征参数计算模块,用于分别计算所述第一软件函数网络和所述第二软件函数网络的特征参数;所述特征参数包括节点参数和边参数;所述节点参数包括节点结构特征参数和节点代码特征参数;所述边参数包括调用类型;
节点分类模块,用于根据各个节点与周围节点的连通关系将所述第一软件函数网络和所述第二软件函数网络中的各个节点进行分类;
相似节点计算模块,用于根据节点参数计算所述第一软件函数网络和所述第二软件函数网络中属于同一类别的节点中的相似节点,得到多组相似节点对;
相似子网确定模块,用于以每组相似节点对作为基准节点,逐步识别所述第一软件函数网络和所述第二软件函数网络中的相似边,得到多对相似子网,从而确定每对相似子网所对应的软件代码为复用代码。
可选的,所述节点分类模块包括:
模块划分单元,用于按照待检测软件各个部分的功能分别所述第一软件函数网络和所述第二软件函数网络划分为多个网络模块;
模块内连通度计算单元,用于计算每个节点与所在网络模块中的各个节点之间的连通程度,得到模块内的连通度;
初步分类单元,用于根据各个节点的模块内连通度对各个节点进行初步分类,得到初步分类结果;
模块外连通度计算单元,用于计算每个节点与外部网络模块中的各个节点之间的连通程度,得到模块间的连通度;
进一步分类单元,用于根据各个节点的模块间连通度在所述初步分类结果的基础上对各个节点进行进一步分类。
可选的,所述相似节点计算模块包括:
特征向量生成单元,用于将各个节点的所述节点结构特征参数生成第一特征向量,将各个节点的所述节点代码特征参数生成第二特征向量;
结构相似度计算单元,用于计算所述第一软件函数网络与所述第二软件函数网络中属于同一类别的节点的第一特征向量之间的堪培拉距离,得到节点结构相似度;
结构相似节点对筛选单元,用于将所述节点结构相似度满足结构相似度阈值的节点对确定为结构相似节点对;
结构相似节点对计算单元,用于计算所述结构相似节点对的第二特征向量之间的堪培拉距离,得到节点代码相似度;
相似节点对确定单元,用于将所述节点代码相似度满足代码相似度阈值的节点对确定为相似节点对。
可选的,所述相似子网确定模块包括:
基准节点对选取单元,用于选取当前相似节点对作为基准节点对;所述当前相似节点对中属于所述第一软件函数网络的节点为第一基准节点,所述当前相似节点对中属于所述第二软件函数网络的节点为第二基准节点;
第一相似子网标记单元,用于将所述第一基准节点和所述第二基准节点标记为当前相似子网的点;
邻居节点搜索单元,用于搜索所述基准节点对中每个节点的邻居节点中出度为1的节点,得到基准节点对中每个节点所对应的邻居节点集合;节点的出度为节点指向其他节点的有向边的数量;
邻居节点堪培拉距离计算单元,用于计算其中一个邻居节点集合中的每个节点与另外一个邻居节点集合中国每个节点的特征向量之间的堪培拉距离,得到多个邻居节点对的堪培拉距离;
最小距离筛选单元,用于筛选多个所述邻居节点对的堪培拉距离中的最小值所对应的邻居节点对,得到最小相似邻居节点对;所述最小相似邻居节点对包括第一软件函数网络中的第一相似邻居节点和第二软件函数网络中的第二相似邻居节点;
第一判断单元,用于判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边是否相似,得到第一判断结果;
第二相似子网标记单元,用于若所述第一判断结果表示是,则将所述第一相似邻居节点和所述第二相似邻居节点标记为当前相似子网的点,将所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边标记为当前相似子网的边;
第二判断单元,用于判断所述第一相似邻居节点和所述第二相似邻居节点是否都有出边,得到第二判断结果;
相似邻居节点更新单元,用于若所述第二判断结果表示是,则更新所述第一基准节点为所述第一相似邻居节点,更新所述第二基准节点为所述第二相似邻居节点,并返回步骤所述邻居节点搜索单元;
删除单元,用于若所述第一判断结果表示否,则将多个所述邻居节点对的堪培拉距离中与所述第一相似邻居节点以及所述第二相似邻居节点相关的距离值删除,并判断删除后是否有剩余距离值,得到第三判断结果;
返回单元,用于若所述第三判断结果表示是,则返回所述最小距离筛选单元;
相似节点对更新单元,用于若所述第二判断结果表示否或所述第三判断结果表示否,则当前相似子网建立完成,更新所述基准节点对为下一个相似节点对,并返回所述第一相似子网标记单元。
可选的,所述第一判断单元包括:
第四判断子单元,用于判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边的linktype值是否相同,得到第四判断结果;
第一确定子单元,用于若所述第四判断结果表示否,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边不相似;
第五判断子单元,用于若所述第四判断结果表示是,则判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边linktype值为depend还是call,得到第五判断结果;
第二确定子单元,用于若所述第五判断结果表示depend,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边相似;
第六判断子单元,用于若所述第五判断结果表示call,则判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边的calltype值是否相同,得到第六判断结果;
第三确定子单元,用于若所述第六判断结果表示是,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边相似;
第四确定子单元,用于若所述第六判断结果表示否,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边不相似。
根据本发明提供的具体实施例,本发明公开了以下技术效果:本发明公开的软件复用代码检测方法及系统,同时采用软件代码的结构特征参数和代码特征参数对服用代码进行检测,从而使代码检测过程既包含语法方式,又包含非语法方式,使得代码检测过程涉及代码更多的特征,提高复用代码的检测精度。同时,涉及到边特征,即函数之间的调用关系,从而进一步提高复用代码的检测精度。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例1的软件复用代码检测方法的方法流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
实施例1:
该实施例1公开一种软件复用代码检测方法。本实施例旨在从代码结构出发,基于软件函数网络模型并利用特征匹配方法,对软件复用代码检测方法进行改进。面向软件复用代码检测,研究并构建软件函数网络模型,将软件代码中的函数及函数间的调用等信息网络化。在此基础上,利用特征匹配方法并基于逐层逼近的思路实现相似子网的逐步检测。
对于软件代码的复用多是为了完成需求的某项功能,复用过程中即使会对变量名、函数名或者语法方式等代码语句上进行改编,也很难改变代码的算法设计和逻辑结构,也即程序的结构骨架在复用的过程中基本保持不变。基于此,本实施例基于复杂网络实现复用代码检测。复杂网络是一种结合图论和统计学手段描述复杂系统结构的方法,随着大量系统被描述成复杂网络,以复杂网络系统为对象的网络数据挖掘应运而生,利用图匹配技术完成复杂网络系统间的相似性识别在大规模复杂关联系统的分析与优化设计、多源信息系统集成、跨网络信息搜索、同源蛋白质发现、多语言自动翻译等领域都取得了积极的现实意义和显著成果。本发明在复杂网络(即软件函数网络模型)的基础上,结合函数的特征参数,从而实现代码复用的检测。
该方法的核心思想为:对一对待检测的软件,分别构建面向代码复用检测的软件函数网络模型;在得到的软件函数网络模型基础上,利用软件网络特征,搜索软件网络间的相似子网络,最终对于一对软件网络得到若干对相似子网。本发明实现了对软件模块动态运行重要性的定量评价;并且综合软件模块在静态结构和动态运行中的重要性,而不是单纯仅仅从动态或者静态的角度计算软件模块的重要性。
图1为本发明实施例1的软件复用代码检测方法的方法流程图。
参见图1,该软件复用代码检测方法,包括:
步骤101:获取两个待检测软件的软件代码。
步骤102:以软件代码中的函数作为节点,以函数之间的调用关系作为边分别对两个所述待检测软件建立软件函数网络,得到第一软件函数网络和第二软件函数网络。软件函数被抽象为节点,用vi表示,函数间的调用关系被抽象为边,用eij=<vi,vj>(i,j=1,2,3,...,n)表示。因此,一个软件的源代码可被表示为软件函数网络G=(V,E),其中V=(v1,v2,v3,...,vn)表示软件函数网络的节点集,E=(eij|i,j=1,2,3,...,n)表示软件函数网络的有向边集,n为软件函数网络中的总节点数。i,j代表网络中的节点代号,i不等于j。第一软件函数网络用Graphm表示,第二软件函数网络用Graphg表示。
步骤103:分别计算所述第一软件函数网络和所述第二软件函数网络的特征参数;所述特征参数包括节点参数和边参数;所述节点参数包括节点结构特征参数和节点代码特征参数;所述边参数包括调用类型。
节点结构特征参数即函数结构特征参数,包括出度、介数、聚类系数。节点代码特征参数即函数代码特征参数,包括:圈复杂度、代码行数、关键字个数、全局/成员变量赋值个数。
出度:节点的出度即由该节点指向其他节点的有向边的数量。
介数:反映了节点对整个网络的影响力,在软件函数网络中从控制信息传递的角度来说,介数越高的节点对于网络中信息的流动具有越高的控制力,其重要性越大。节点i的介数bci的计算公式如下:
Figure BDA0002198802120000121
其中,huj为从节点第u个节点到第j个节点的最短路径的数目,
Figure BDA0002198802120000123
为从第u个节点到第j个节点的最短路径中经过第i个节点的最短路径的数目。
聚类系数:用于度量图中的节点倾向于集聚在一起的程度。节点的聚类系数值越大,表明该节点的影响力越大。节点vi的聚类系数值可以计算为:
Figure BDA0002198802120000122
其中,T(i)表示通过节点vi的三角形的个数,deg(i)是节点vi的度,即出度和入度的和。
圈复杂度:圈复杂度用来计算代码的控制流复杂性。
代码行数:函数内的代码行数。
关键字个数:函数内的关键字个数。
全局/成员变量赋值个数:函数内的全局/成员变量赋值个数。
边参数:depend类型调用,call类型调用,call类型调用中包括sequence,if,else,switch,for,while,do调用类型。
在上述步骤得到的软件函数网络模型基础上,利用特征参数,基于由点及面的思路搜索软件函数网络间的相似子网,即先检测网络间的相似节点,再以其为基点搜索软件函数网络间的相似子网络。
步骤104:根据各个节点与周围节点的连通关系将所述第一软件函数网络和所述第二软件函数网络中的各个节点进行分类。即在网络间相似节点检测中,需要首先根据节点在软件函数网络中所处位置的不同对节点进行角色划分。
该步骤104具体包括:
104A:按照待检测软件各个部分的功能分别所述第一软件函数网络和所述第二软件函数网络划分为多个网络模块。
软件系统的设计一般遵循“高内聚,低耦合”原则,因此软件系统一般具有良好的模块结构。将软件网络划分为模块时,尽量使一个模块内尽可能多的包含模块内连接,尽可能少的包含模块间连接。
104B:计算每个节点与所在网络模块中的各个节点之间的连通程度,得到模块内的连通度。
模块内的连通度的计算方法如下:
Figure BDA0002198802120000131
式中,s表示模块;si表示第i个节点所在的模块;ki表示模块si中的节点vi连接到该模块中其他节点的边数;
Figure BDA0002198802120000132
表示模块si中所有节点的k的平均值;
Figure BDA0002198802120000133
表示模块si中k的标准偏差。该指标主要用于度量节点vi连接到模块内其他节点的紧密程度,反映出节在模块内的重要性,节点的z值越大越能凸显它在模块内的中心地位。
104C:根据各个节点的模块内连通度对各个节点进行初步分类,得到初步分类结果。即可以根据z值将各模块内的节点划分为中心节点和一般节点。
104D:计算每个节点与外部网络模块中的各个节点之间的连通程度,得到模块间的连通度。如果有节点含有连接到其他模块内节点的边,同一模块中有相同z值的节点也可能会扮演不同的角色,因此还需要考虑模块间连接的影响。拟用即节点vi的参与系数Pi来反映节点与外界的连接方式,其计算公式如下:
Figure BDA0002198802120000134
式中,k'i表示节点vi的连接度;
Figure BDA0002198802120000135
表示节点vi连接到模块si中所有节点的边数。NM为模块的总数量。如果节点的边均匀地分布在所有的模块中,那么P值会趋近于1;如果节点的边都分布在一个模块内,则其P值为0。节点的P值反映了它对模块间连接和通信的重要性。
104E:根据各个节点的模块间连通度在所述初步分类结果的基础上对各个节点进行进一步分类。即在中心节点和一般节点划分完成后,根据P值进一步对中心节点和一般节点进行分类。
步骤105:根据节点参数计算所述第一软件函数网络和所述第二软件函数网络中属于同一类别的节点中的相似节点,得到多组相似节点对。
节点分类完成后,在同类节点内进行节点相似度计算。节点的特征参数构成该节点的特征向量,从结构特征和代码特征分两层进行筛选。
该步骤105具体包括:
105A:将各个节点的所述节点结构特征参数生成第一特征向量,将各个节点的所述节点代码特征参数生成第二特征向量。
对第i个节点生成其结构特征的特征向量
fi1=(r1,r2,r3)
其中r1,r2,r3分别代表节点的各结构特征参数,即出度、介数和聚类系数。
对第i个节点生成其代码特征的特征向量
fi2=(r4,r5,r6,r7)
其中r4,r5,r6,r7分别代表节点的各代码特征参数,即圈复杂度、代码行数、关键字个数和全局/成员变量赋值个数。
105B:将各个节点的所述节点结构特征参数生成第一特征向量,将各个节点的所述节点代码特征参数生成第二特征向量;
105C:计算所述第一软件函数网络与所述第二软件函数网络中属于同一类别的节点的第一特征向量之间的堪培拉距离,得到节点结构相似度;
105D:将所述节点结构相似度满足结构相似度阈值的节点对确定为结构相似节点对;
105E:计算所述结构相似节点对的第二特征向量之间的堪培拉距离,得到节点代码相似度;
105F:将所述节点代码相似度满足代码相似度阈值的节点对确定为相似节点对。
先结构特征筛选再代码特征筛选,即首先计算第一软件函数网络与第二软件函数网络中属于同一类别的节点的第一特征向量之间的堪培拉距离,筛选出结构特征相似的节点,再计算第一软件函数网络与第二软件函数网络中属于结构特征相似的节点的第二特征向量之间的堪培拉距离,筛选出代码特征相似的节点,得到相似节点。
第一特征向量之间的堪培拉距离与第二特征向量之间的堪培拉距离的计算公式均采用如下公式:
Figure BDA0002198802120000151
式中,d(fi,fj)表示节点vi与节点vj的某个特征向量间的堪培拉距离。fik是节点vi的某个特征向量的第k个特征参数的值,fjk是节点vj的某个特征向量的第k个特征参数的值。
对两个网络同类角色的节点进行特征向量堪培拉距离的计算,可得到一个特征向量距离的矩阵,如下所示:
Figure BDA0002198802120000152
其中
Figure BDA0002198802120000153
表示同类角色的软件函数网络Graphm的第p个节点与软件函数网络Graphg的第q个节点的特征向量间的距离值。
相似节点检测结束后,对于软件函数网络Graphm中的节点vi,在软件函数网络Graphg中会得到一个它的相似节点集simi=(vi1,vi2,vi3,...)。
步骤106:以每组相似节点对作为基准节点,逐步识别所述第一软件函数网络和所述第二软件函数网络中的相似边,得到多对相似子网,从而确定每对相似子网所对应的软件代码为复用代码。
该步骤106具体包括:
106A:选取当前相似节点对作为基准节点对;所述当前相似节点对中属于所述第一软件函数网络的节点为第一基准节点,所述当前相似节点对中属于所述第二软件函数网络的节点为第二基准节点。
这里以一对相似节点对
Figure BDA0002198802120000154
Figure BDA0002198802120000155
为例进行说明。
Figure BDA0002198802120000156
是带匹配软件网络Graphm中的基准节点,
Figure BDA0002198802120000157
是目标软件网络Graphg中的基准节点。
106B:将所述第一基准节点和所述第二基准节点标记为当前相似子网的点。
新建一对空的相似子网集合,分别定义为
Figure BDA0002198802120000158
Figure BDA00021988021200001511
将基准节点
Figure BDA00021988021200001510
放入集合
Figure BDA0002198802120000163
中,将基准节点
Figure BDA0002198802120000164
放入
Figure BDA0002198802120000165
中。
106C:搜索所述基准节点对中每个节点的邻居节点中出度为1的节点,得到基准节点对中每个节点所对应的邻居节点集合;节点的出度为节点指向其他节点的有向边的数量。
由经验可知,在函数被复用前后,它被其他函数调用的情况可能会发生很大的变化,而它调用其他函数的情况基本保持不变。因此,本方法只考虑出边以及出边指向的节点。该步骤中,对于基准节点
Figure BDA0002198802120000166
Figure BDA0002198802120000167
分别得到一组邻居节点。
106D:计算其中一个邻居节点集合中的每个节点与另外一个邻居节点集合中国每个节点的特征向量之间的堪培拉距离,得到多个邻居节点对的堪培拉距离。
在两组邻居节点间分别两两计算节点特征向量的Canberra距离,并得到一个特征向量距离的矩阵
Figure BDA0002198802120000161
其中,
Figure BDA0002198802120000162
表示
Figure BDA0002198802120000168
的第α个邻居节点的特征向量与
Figure BDA0002198802120000169
的第β个邻居节点的特征向量的堪培拉(Canberra)距离值。
106E:筛选多个所述邻居节点对的堪培拉距离中的最小值所对应的邻居节点对,得到最小相似邻居节点对;所述最小相似邻居节点对包括第一软件函数网络中的第一相似邻居节点和第二软件函数网络中的第二相似邻居节点。
搜索特征向量距离矩阵中的最小值,该最小值对应的节点对
Figure BDA00021988021200001610
Figure BDA00021988021200001611
即为基准节点
Figure BDA00021988021200001612
Figure BDA00021988021200001613
的第一层网络中最相似的邻居节点。
106F:判断所述第一基准节点与所述第一相似邻居节点之间的边
Figure BDA00021988021200001614
和所述第二基准节点与所述第二相似邻居节点之间的边
Figure BDA00021988021200001615
是否相似,得到第一判断结果。
106G:若所述第一判断结果表示是,则将所述第一相似邻居节点和所述第二相似邻居节点标记为当前相似子网的点,将所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边标记为当前相似子网的边。
具体方式可为:将
Figure BDA0002198802120000173
Figure BDA0002198802120000174
放入
Figure BDA00021988021200001715
Figure BDA0002198802120000176
Figure BDA0002198802120000177
放入
Figure BDA0002198802120000171
106H:判断所述第一相似邻居节点和所述第二相似邻居节点是否都有出边,得到第二判断结果。
106I:若所述第二判断结果表示是,则更新所述第一基准节点为所述第一相似邻居节点,更新所述第二基准节点为所述第二相似邻居节点,并返回106C。
如果第一相似邻居节点
Figure BDA0002198802120000178
和第二相似邻居节点
Figure BDA0002198802120000179
均有出边,则
Figure BDA00021988021200001710
Figure BDA00021988021200001711
被认为是新的基准节点并返回106C开始新一层的搜索。
106J:若所述第一判断结果表示否,则将多个所述邻居节点对的堪培拉距离中与所述第一相似邻居节点以及所述第二相似邻居节点相关的距离值删除,并判断删除后是否有剩余距离值,得到第三判断结果。
删除的具体手段为:删除特征向量距离矩阵中最小值所在的行和列。判断删除后是否有剩余距离值采用的手段为:判断删除最小值所在行和列后的特征向量距离矩阵是否为空集。
106K:若所述第三判断结果表示是,即删除最小值所在行和列后的特征向量距离矩阵不是空集,则返回106E。
106L:若所述第二判断结果表示否(即第一相似邻居节点
Figure BDA00021988021200001712
和第二相似邻居节点
Figure BDA00021988021200001713
中至少有一个没有出边)或所述第三判断结果表示否(即删除最小值所在行和列后的特征向量距离矩阵是空集),则当前相似子网建立完成,更新所述基准节点对为下一个相似节点对,并返回106B。
相似子网分割结束后,将会得到Graphm中的一个子网集合
Figure BDA00021988021200001714
以及与之对应相似的Graphg中的一个子网集合
Figure BDA0002198802120000172
如果子网集合中的子网有共同节点,这样的子网将被合并成一个更大的子网。
作为一种可选的实施方式,106F可采用以下方法实现:
106FA:判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边的linktype值是否相同,得到第四判断结果。
106FB:若所述第四判断结果表示否,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边不相似。
106FC:若所述第四判断结果表示是,则判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边linktype值为depend还是call,得到第五判断结果。
106FD:若所述第五判断结果表示depend,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边相似。
106FE:若所述第五判断结果表示call,则判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边的calltype值是否相同,得到第六判断结果。Calltype值中,“if”和“while”被认为是相同的,“seq”被认为是与“if”和“while”不同的。
106FF:若所述第六判断结果表示是,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边相似。
106FG:若所述第六判断结果表示否,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边不相似。
实施例2:
该实施例2公开一种软件复用代码检测系统,包括:
获取模块,用于获取两个待检测软件的软件代码;
网络建立模块,用于以软件代码中的函数作为节点,以函数之间的调用关系作为边分别对两个所述待检测软件建立软件函数网络,得到第一软件函数网络和第二软件函数网络;
特征参数计算模块,用于分别计算所述第一软件函数网络和所述第二软件函数网络的特征参数;所述特征参数包括节点参数和边参数;所述节点参数包括节点结构特征参数和节点代码特征参数;所述边参数包括调用类型;
节点分类模块,用于根据各个节点与周围节点的连通关系将所述第一软件函数网络和所述第二软件函数网络中的各个节点进行分类;
相似节点计算模块,用于根据节点参数计算所述第一软件函数网络和所述第二软件函数网络中属于同一类别的节点中的相似节点,得到多组相似节点对;
相似子网确定模块,用于以每组相似节点对作为基准节点,逐步识别所述第一软件函数网络和所述第二软件函数网络中的相似边,得到多对相似子网,从而确定每对相似子网所对应的软件代码为复用代码。
可选的,所述节点分类模块包括:
模块划分单元,用于按照待检测软件各个部分的功能分别所述第一软件函数网络和所述第二软件函数网络划分为多个网络模块;
模块内连通度计算单元,用于计算每个节点与所在网络模块中的各个节点之间的连通程度,得到模块内的连通度;
初步分类单元,用于根据各个节点的模块内连通度对各个节点进行初步分类,得到初步分类结果;
模块外连通度计算单元,用于计算每个节点与外部网络模块中的各个节点之间的连通程度,得到模块间的连通度;
进一步分类单元,用于根据各个节点的模块间连通度在所述初步分类结果的基础上对各个节点进行进一步分类。
可选的,所述相似节点计算模块包括:
特征向量生成单元,用于将各个节点的所述节点结构特征参数生成第一特征向量,将各个节点的所述节点代码特征参数生成第二特征向量;
结构相似度计算单元,用于计算所述第一软件函数网络与所述第二软件函数网络中属于同一类别的节点的第一特征向量之间的堪培拉距离,得到节点结构相似度;
结构相似节点对筛选单元,用于将所述节点结构相似度满足结构相似度阈值的节点对确定为结构相似节点对;
结构相似节点对计算单元,用于计算所述结构相似节点对的第二特征向量之间的堪培拉距离,得到节点代码相似度;
相似节点对确定单元,用于将所述节点代码相似度满足代码相似度阈值的节点对确定为相似节点对。
可选的,所述相似子网确定模块包括:
基准节点对选取单元,用于选取当前相似节点对作为基准节点对;所述当前相似节点对中属于所述第一软件函数网络的节点为第一基准节点,所述当前相似节点对中属于所述第二软件函数网络的节点为第二基准节点;
第一相似子网标记单元,用于将所述第一基准节点和所述第二基准节点标记为当前相似子网的点;
邻居节点搜索单元,用于搜索所述基准节点对中每个节点的邻居节点中出度为1的节点,得到基准节点对中每个节点所对应的邻居节点集合;节点的出度为节点指向其他节点的有向边的数量;
邻居节点堪培拉距离计算单元,用于计算其中一个邻居节点集合中的每个节点与另外一个邻居节点集合中国每个节点的特征向量之间的堪培拉距离,得到多个邻居节点对的堪培拉距离;
最小距离筛选单元,用于筛选多个所述邻居节点对的堪培拉距离中的最小值所对应的邻居节点对,得到最小相似邻居节点对;所述最小相似邻居节点对包括第一软件函数网络中的第一相似邻居节点和第二软件函数网络中的第二相似邻居节点;
第一判断单元,用于判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边是否相似,得到第一判断结果;
第二相似子网标记单元,用于若所述第一判断结果表示是,则将所述第一相似邻居节点和所述第二相似邻居节点标记为当前相似子网的点,将所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边标记为当前相似子网的边;
第二判断单元,用于判断所述第一相似邻居节点和所述第二相似邻居节点是否都有出边,得到第二判断结果;
相似邻居节点更新单元,用于若所述第二判断结果表示是,则更新所述第一基准节点为所述第一相似邻居节点,更新所述第二基准节点为所述第二相似邻居节点,并返回步骤所述邻居节点搜索单元;
删除单元,用于若所述第一判断结果表示否,则将多个所述邻居节点对的堪培拉距离中与所述第一相似邻居节点以及所述第二相似邻居节点相关的距离值删除,并判断删除后是否有剩余距离值,得到第三判断结果;
返回单元,用于若所述第三判断结果表示是,则返回所述最小距离筛选单元;
相似节点对更新单元,用于若所述第二判断结果表示否或所述第三判断结果表示否,则当前相似子网建立完成,更新所述基准节点对为下一个相似节点对,并返回所述第一相似子网标记单元。
可选的,所述第一判断单元包括:
第四判断子单元,用于判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边的linktype值是否相同,得到第四判断结果;
第一确定子单元,用于若所述第四判断结果表示否,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边不相似;
第五判断子单元,用于若所述第四判断结果表示是,则判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边linktype值为depend还是call,得到第五判断结果;
第二确定子单元,用于若所述第五判断结果表示depend,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边相似;
第六判断子单元,用于若所述第五判断结果表示call,则判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边的calltype值是否相同,得到第六判断结果;
第三确定子单元,用于若所述第六判断结果表示是,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边相似;
第四确定子单元,用于若所述第六判断结果表示否,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边不相似。
根据本发明提供的具体实施例,本发明公开了以下技术效果:
1)同时包含代码的语法信息和非语法信息,提高检测准确度和精度:
由实验和开发经验可知,对开源代码的复用主要是使用了开源代码的数据处理逻辑和关键算法,虽然对复用部分代码的调用可能会千差万别,但是被复用部分代码内部的调用关系、模块属性却仍然存在一定的稳定性,即程序的结构骨架在复用过程中基本保持不变,模块特征差异不大。由软件代码中的函数和函数间的关系抽象而成的软件函数网络可以很好的体现代码的结构骨架,并引入复杂网络理论,使得软件函数网络模型包含了代码的语法信息。在这基础上,本发明增加了节点代码特征和边特征,使得软件函数网络模型包含了更多的代码的语法和非语法信息。
面向复用代码检测的软件函数网络模型同时包含了代码的语法信息和非语法信息,使得复用代码检测可以从代码结构和代码内容两方面分层次进行,提高检测准确度和精度,可以检测到高级别的复用代码。
2)适用于多种编程语言:
软件函数网络模型实现将不同程序语言的复用代码检测统一在同一模型框架(即软件函数网络)下,对于各种编程云具有通用性,并有利于海量开源代码以网络形式存储和使用。
3)实现在不预知代码复用位置和数量的情况下检测复用代码:
软件代码复用通常是局部对局部的复用,有关代码复用的位置和数量的信息无法提前获得,使复用代码检测变得困难。在建立软件函数网络模型之后,检测软件代码中复用位置、复用规模、复用对象不能预知的开源代码的问题,就转化为两个软件函数网络间具有相似特征的子网络搜索识别问题。
4)缩减代码比对空间,提高代码检测效率:
软件代码复用通常是局部对局部的复用,直接对两个软件的所有源代码进行检测会造成大量冗余检测,降低检测效率。本发明从两个层面缩减了代码对比空间,提高代码检测效率。
第一个层面,基于基准节点游走的相似子网分割方法采用由点及面的检测原则,首先检测到相似节点,再从相似节点出发搜索相似子网,避免了不必要的代码检测。
第二个层面,对节点进行角色分类,缩小相似节点检测空间。由于大规模软件网络中的节点非常多,相似子网络具有海量的组合可能,如果采用节点两两对比的方式进行检测计算,不但计算复杂性会数量级似的增加,还可能漏掉修改代码带来的差异情况。因此根据软件函数网络模型中承载的特征信息,对节点角色进行分类,仅在同类角色的节点中进行相似节点检测。
5)时间复杂度低
目前常见的可以检测出高级别代码克隆的检测方法中,多使用图同构算法,使检测的时间复杂度高。本方法不涉及时间复杂度高的算法,同时可以检测到高级别的复用代码。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。

Claims (8)

1.一种软件复用代码检测方法,其特征在于,包括:
获取两个待检测软件的软件代码;
以软件代码中的函数作为节点,以函数之间的调用关系作为边分别对两个所述待检测软件建立软件函数网络,得到第一软件函数网络和第二软件函数网络;
分别计算所述第一软件函数网络和所述第二软件函数网络的特征参数;所述特征参数包括节点参数和边参数;所述节点参数包括节点结构特征参数和节点代码特征参数;所述边参数包括调用类型;
根据各个节点与周围节点的连通关系将所述第一软件函数网络和所述第二软件函数网络中的各个节点进行分类;
根据节点参数计算所述第一软件函数网络和所述第二软件函数网络中属于同一类别的节点中的相似节点,得到多组相似节点对;
以每组相似节点对作为基准节点,逐步识别所述第一软件函数网络和所述第二软件函数网络中的相似边,得到多对相似子网,从而确定每对相似子网所对应的软件代码为复用代码;
所述以每组相似节点对作为基准节点,逐步识别所述第一软件函数网络和所述第二软件函数网络中的相似边,得到多对相似子网,从而确定每对相似子网所对应的软件代码为复用代码,具体包括:
选取当前相似节点对作为基准节点对;所述当前相似节点对中属于所述第一软件函数网络的节点为第一基准节点,所述当前相似节点对中属于所述第二软件函数网络的节点为第二基准节点;
将所述第一基准节点和所述第二基准节点标记为当前相似子网的点;
搜索所述基准节点对中每个节点的邻居节点中出度为1的节点,得到基准节点对中每个节点所对应的邻居节点集合;节点的出度为节点指向其他节点的有向边的数量;
计算其中一个邻居节点集合中的每个节点与另外一个邻居节点集合中国每个节点的特征向量之间的堪培拉距离,得到多个邻居节点对的堪培拉距离;
筛选多个所述邻居节点对的堪培拉距离中的最小值所对应的邻居节点对,得到最小相似邻居节点对;所述最小相似邻居节点对包括第一软件函数网络中的第一相似邻居节点和第二软件函数网络中的第二相似邻居节点;
判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边是否相似,得到第一判断结果;
若所述第一判断结果表示是,则将所述第一相似邻居节点和所述第二相似邻居节点标记为当前相似子网的点,将所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边标记为当前相似子网的边;
判断所述第一相似邻居节点和所述第二相似邻居节点是否都有出边,得到第二判断结果;
若所述第二判断结果表示是,则更新所述第一基准节点为所述第一相似邻居节点,更新所述第二基准节点为所述第二相似邻居节点,并返回步骤“搜索所述基准节点对中每个节点的邻居节点中出度为1的节点,得到基准节点对中每个节点所对应的邻居节点集合”;
若所述第一判断结果表示否,则将多个所述邻居节点对的堪培拉距离中与所述第一相似邻居节点以及所述第二相似邻居节点相关的距离值删除,并判断删除后是否有剩余距离值,得到第三判断结果;
若所述第三判断结果表示是,则返回步骤“筛选多个所述邻居节点对的堪培拉距离中的最小值所对应的邻居节点对,得到最小相似邻居节点对”;
若所述第二判断结果表示否或所述第三判断结果表示否,则当前相似子网建立完成,更新所述基准节点对为下一个相似节点对,并返回步骤“将所述第一基准节点和所述第二基准节点标记为当前相似子网的点”。
2.根据权利要求1所述的软件复用代码检测方法,其特征在于,所述根据各个节点与周围节点的连通关系将所述第一软件函数网络和所述第二软件函数网络中的各个节点进行分类,具体包括:
按照待检测软件各个部分的功能分别所述第一软件函数网络和所述第二软件函数网络划分为多个网络模块;
计算每个节点与所在网络模块中的各个节点之间的连通程度,得到模块内的连通度;
根据各个节点的模块内连通度对各个节点进行初步分类,得到初步分类结果;
计算每个节点与外部网络模块中的各个节点之间的连通程度,得到模块间的连通度;
根据各个节点的模块间连通度在所述初步分类结果的基础上对各个节点进行进一步分类。
3.根据权利要求1所述的软件复用代码检测方法,其特征在于,所述根据节点参数计算所述第一软件函数网络和所述第二软件函数网络中属于同一类别的节点中的相似节点,得到多组相似节点对,具体包括:
将各个节点的所述节点结构特征参数生成第一特征向量,将各个节点的所述节点代码特征参数生成第二特征向量;
计算所述第一软件函数网络与所述第二软件函数网络中属于同一类别的节点的第一特征向量之间的堪培拉距离,得到节点结构相似度;
将所述节点结构相似度满足结构相似度阈值的节点对确定为结构相似节点对;
计算所述结构相似节点对的第二特征向量之间的堪培拉距离,得到节点代码相似度;
将所述节点代码相似度满足代码相似度阈值的节点对确定为相似节点对。
4.根据权利要求1所述的软件复用代码检测方法,其特征在于,所述判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边是否相似,得到第一判断结果,具体包括:
判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边的linktype值是否相同,得到第四判断结果;
若所述第四判断结果表示否,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边不相似;
若所述第四判断结果表示是,则判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边linktype值为depend还是call,得到第五判断结果;
若所述第五判断结果表示depend,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边相似;
若所述第五判断结果表示call,则判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边的calltype值是否相同,得到第六判断结果;
若所述第六判断结果表示是,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边相似;
若所述第六判断结果表示否,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边不相似。
5.一种软件复用代码检测系统,其特征在于,包括:
获取模块,用于获取两个待检测软件的软件代码;
网络建立模块,用于以软件代码中的函数作为节点,以函数之间的调用关系作为边分别对两个所述待检测软件建立软件函数网络,得到第一软件函数网络和第二软件函数网络;
特征参数计算模块,用于分别计算所述第一软件函数网络和所述第二软件函数网络的特征参数;所述特征参数包括节点参数和边参数;所述节点参数包括节点结构特征参数和节点代码特征参数;所述边参数包括调用类型;
节点分类模块,用于根据各个节点与周围节点的连通关系将所述第一软件函数网络和所述第二软件函数网络中的各个节点进行分类;
相似节点计算模块,用于根据节点参数计算所述第一软件函数网络和所述第二软件函数网络中属于同一类别的节点中的相似节点,得到多组相似节点对;
相似子网确定模块,用于以每组相似节点对作为基准节点,逐步识别所述第一软件函数网络和所述第二软件函数网络中的相似边,得到多对相似子网,从而确定每对相似子网所对应的软件代码为复用代码;
所述相似子网确定模块包括:
基准节点对选取单元,用于选取当前相似节点对作为基准节点对;所述当前相似节点对中属于所述第一软件函数网络的节点为第一基准节点,所述当前相似节点对中属于所述第二软件函数网络的节点为第二基准节点;
第一相似子网标记单元,用于将所述第一基准节点和所述第二基准节点标记为当前相似子网的点;
邻居节点搜索单元,用于搜索所述基准节点对中每个节点的邻居节点中出度为1的节点,得到基准节点对中每个节点所对应的邻居节点集合;节点的出度为节点指向其他节点的有向边的数量;
邻居节点堪培拉距离计算单元,用于计算其中一个邻居节点集合中的每个节点与另外一个邻居节点集合中国每个节点的特征向量之间的堪培拉距离,得到多个邻居节点对的堪培拉距离;
最小距离筛选单元,用于筛选多个所述邻居节点对的堪培拉距离中的最小值所对应的邻居节点对,得到最小相似邻居节点对;所述最小相似邻居节点对包括第一软件函数网络中的第一相似邻居节点和第二软件函数网络中的第二相似邻居节点;
第一判断单元,用于判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边是否相似,得到第一判断结果;
第二相似子网标记单元,用于若所述第一判断结果表示是,则将所述第一相似邻居节点和所述第二相似邻居节点标记为当前相似子网的点,将所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边标记为当前相似子网的边;
第二判断单元,用于判断所述第一相似邻居节点和所述第二相似邻居节点是否都有出边,得到第二判断结果;
相似邻居节点更新单元,用于若所述第二判断结果表示是,则更新所述第一基准节点为所述第一相似邻居节点,更新所述第二基准节点为所述第二相似邻居节点,并返回步骤所述邻居节点搜索单元;
删除单元,用于若所述第一判断结果表示否,则将多个所述邻居节点对的堪培拉距离中与所述第一相似邻居节点以及所述第二相似邻居节点相关的距离值删除,并判断删除后是否有剩余距离值,得到第三判断结果;
返回单元,用于若所述第三判断结果表示是,则返回所述最小距离筛选单元;
相似节点对更新单元,用于若所述第二判断结果表示否或所述第三判断结果表示否,则当前相似子网建立完成,更新所述基准节点对为下一个相似节点对,并返回所述第一相似子网标记单元。
6.根据权利要求5所述的软件复用代码检测系统,其特征在于,所述节点分类模块包括:
模块划分单元,用于按照待检测软件各个部分的功能分别所述第一软件函数网络和所述第二软件函数网络划分为多个网络模块;
模块内连通度计算单元,用于计算每个节点与所在网络模块中的各个节点之间的连通程度,得到模块内的连通度;
初步分类单元,用于根据各个节点的模块内连通度对各个节点进行初步分类,得到初步分类结果;
模块外连通度计算单元,用于计算每个节点与外部网络模块中的各个节点之间的连通程度,得到模块间的连通度;
进一步分类单元,用于根据各个节点的模块间连通度在所述初步分类结果的基础上对各个节点进行进一步分类。
7.根据权利要求5所述的软件复用代码检测系统,其特征在于,所述相似节点计算模块包括:
特征向量生成单元,用于将各个节点的所述节点结构特征参数生成第一特征向量,将各个节点的所述节点代码特征参数生成第二特征向量;
结构相似度计算单元,用于计算所述第一软件函数网络与所述第二软件函数网络中属于同一类别的节点的第一特征向量之间的堪培拉距离,得到节点结构相似度;
结构相似节点对筛选单元,用于将所述节点结构相似度满足结构相似度阈值的节点对确定为结构相似节点对;
结构相似节点对计算单元,用于计算所述结构相似节点对的第二特征向量之间的堪培拉距离,得到节点代码相似度;
相似节点对确定单元,用于将所述节点代码相似度满足代码相似度阈值的节点对确定为相似节点对。
8.根据权利要求5所述的软件复用代码检测系统,其特征在于,所述第一判断单元包括:
第四判断子单元,用于判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边的linktype值是否相同,得到第四判断结果;
第一确定子单元,用于若所述第四判断结果表示否,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边不相似;
第五判断子单元,用于若所述第四判断结果表示是,则判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边linktype值为depend还是call,得到第五判断结果;
第二确定子单元,用于若所述第五判断结果表示depend,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边相似;
第六判断子单元,用于若所述第五判断结果表示call,则判断所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边的calltype值是否相同,得到第六判断结果;
第三确定子单元,用于若所述第六判断结果表示是,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边相似;
第四确定子单元,用于若所述第六判断结果表示否,则确定所述第一基准节点与所述第一相似邻居节点之间的边和所述第二基准节点与所述第二相似邻居节点之间的边不相似。
CN201910857936.9A 2019-09-11 2019-09-11 一种软件复用代码检测方法及系统 Active CN110554868B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910857936.9A CN110554868B (zh) 2019-09-11 2019-09-11 一种软件复用代码检测方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910857936.9A CN110554868B (zh) 2019-09-11 2019-09-11 一种软件复用代码检测方法及系统

Publications (2)

Publication Number Publication Date
CN110554868A CN110554868A (zh) 2019-12-10
CN110554868B true CN110554868B (zh) 2020-07-31

Family

ID=68739893

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910857936.9A Active CN110554868B (zh) 2019-09-11 2019-09-11 一种软件复用代码检测方法及系统

Country Status (1)

Country Link
CN (1) CN110554868B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111596897B (zh) 2020-05-07 2023-04-28 北京百度网讯科技有限公司 代码复用的处理方法、装置及电子设备
CN111625466B (zh) * 2020-06-01 2023-11-10 Oppo广东移动通信有限公司 一种软件检测方法、装置及计算机可读存储介质
US11662998B2 (en) * 2020-11-05 2023-05-30 Outsystems—Software Em Rede, S.A. Detecting duplicated code patterns in visual programming language code instances
CN113869378B (zh) * 2021-09-13 2023-04-07 四川大学 一种基于聚类与标签传播的软件系统模块划分方法
CN114077741B (zh) * 2021-11-01 2022-12-09 清华大学 软件供应链安全检测方法和装置、电子设备及存储介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102054149A (zh) * 2009-11-06 2011-05-11 中国科学院研究生院 一种恶意代码行为特征提取方法
US10146530B1 (en) * 2017-07-12 2018-12-04 International Business Machines Corporation Simulating and evaluating code branch merge
CN109101816A (zh) * 2018-08-10 2018-12-28 北京理工大学 一种基于系统调用控制流图的恶意代码同源性分析方法
CN109214191A (zh) * 2018-09-18 2019-01-15 北京理工大学 一种利用深度学习预测软件安全漏洞的方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101873323B (zh) * 2010-06-21 2012-09-05 南京邮电大学 基于程序切片技术的Web服务平台
CN103927177B (zh) * 2014-04-18 2017-01-25 扬州大学 基于LDA模型和PageRank算法建立特征接口有向图的方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102054149A (zh) * 2009-11-06 2011-05-11 中国科学院研究生院 一种恶意代码行为特征提取方法
US10146530B1 (en) * 2017-07-12 2018-12-04 International Business Machines Corporation Simulating and evaluating code branch merge
CN109101816A (zh) * 2018-08-10 2018-12-28 北京理工大学 一种基于系统调用控制流图的恶意代码同源性分析方法
CN109214191A (zh) * 2018-09-18 2019-01-15 北京理工大学 一种利用深度学习预测软件安全漏洞的方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
网络恶意代码协同识别与特征提取研究;陆华彪;《中国博士学位论文全文数据库_信息科技辑》;20151115;全文 *

Also Published As

Publication number Publication date
CN110554868A (zh) 2019-12-10

Similar Documents

Publication Publication Date Title
CN110554868B (zh) 一种软件复用代码检测方法及系统
Arora A survey on graph neural networks for knowledge graph completion
Liu et al. A task scheduling algorithm based on classification mining in fog computing environment
CN106709613B (zh) 一种适用于工业控制系统的风险评估方法
CN105138601B (zh) 一种支持模糊约束关系的图模式匹配方法
CN111309824A (zh) 实体关系图谱显示方法及系统
CN110704846B (zh) 一种人在回路的智能化安全漏洞发现方法
CN107679035A (zh) 一种信息意图检测方法、装置、设备和存储介质
Chen et al. Do different cross‐project defect prediction methods identify the same defective modules?
CN109002712B (zh) 一种基于值依赖图的污染数据分析方法、系统与电子设备
Sun et al. An artificial bee colony algorithm with random location updating
Xiong et al. A method for assigning probability distributions in attack simulation languages
CN112330519A (zh) 一种数据处理的方法和装置
Do Xuan et al. A novel approach for software vulnerability detection based on intelligent cognitive computing
Ratul et al. Evaluating attribution methods in machine learning interpretability
CN112131259A (zh) 一种相似恶意软件推荐方法、装置、介质和设备
CN115935367A (zh) 一种基于图神经网络的源代码漏洞静态检测及定位方法
Andalib et al. Anomaly detection of policies in distributed firewalls using data log analysis
CN114238992A (zh) 基于信息安全大数据的威胁漏洞挖掘方法及信息安全系统
Zhong et al. Recommendations for mobile apps based on the hits algorithm combined with association rules
Seiler et al. Systematic mapping study on the security and efficiency of blockchain in industrial context
Marín et al. Devolved ontology in practice for a seamless semantic alignment within dynamic collaboration networks of smes
Sharmila et al. Blockchain Based Consensus Algorithm and Trustworthy Evaluation of Authenticated Subgraph Queries.
CN105629874A (zh) 一种机床装备资源分级匹配方法
Makarova et al. A case-based reasoning approach with fuzzy linguistic rules: Accuracy validation and application in interface design-support intelligent system

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant