CN104407872B - 代码克隆的检测方法 - Google Patents

代码克隆的检测方法 Download PDF

Info

Publication number
CN104407872B
CN104407872B CN201410730368.3A CN201410730368A CN104407872B CN 104407872 B CN104407872 B CN 104407872B CN 201410730368 A CN201410730368 A CN 201410730368A CN 104407872 B CN104407872 B CN 104407872B
Authority
CN
China
Prior art keywords
api
groups
code
program codes
program
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
CN201410730368.3A
Other languages
English (en)
Other versions
CN104407872A (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.)
Beijing University of Posts and Telecommunications
Original Assignee
Beijing University of Posts and Telecommunications
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 Beijing University of Posts and Telecommunications filed Critical Beijing University of Posts and Telecommunications
Priority to CN201410730368.3A priority Critical patent/CN104407872B/zh
Publication of CN104407872A publication Critical patent/CN104407872A/zh
Application granted granted Critical
Publication of CN104407872B publication Critical patent/CN104407872B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

本申请公开了一种代码克隆的检测方法,包括:对待检测的两组程序代码,分别提取各自调用的应用程序编程接口(API)集合;确定每组程序代码的API集合中各API的调用频率;对于每组程序代码k,根据其对应的所述API的调用频率,生成该组程序代码的n维标记向量,所述n维标记向量中的各维度值vk,i与集合N中的各API一一对应,集合N为两组程序代码的API集合的并集,所述vk,i根据第k组程序代码对所对应的APIi的调用频率pk,i得到;根据每组程序代码的所述n维标记向量,计算所述两组程序代码的相似度;根据所述相似度和预设相似阈值,确定所述两组程序代码是否存在克隆关系。采用本发明,可以提高检测的抗混淆性,准确度高且易于实现。

Description

代码克隆的检测方法
技术领域
本发明涉及计算机应用技术,特别是涉及一种代码克隆的检测方法。
背景技术
代码克隆(Code Clone)是指软件源代码中重复出现的相同或相似的代码片断。这些代码片断可能完全相同,也可能经过了一些编辑性(如修改变量名)或逻辑性的修改(如修改为相似但不相同的功能)。被认为互相克隆的代码片段往往具有相似的逻辑运算,实现了类似的功能。代码克隆一般是由于复制粘贴式的代码复用造成的,也可能是由于解决相似问题的模式化思维造成的。代码克隆大量存在于大型软件系统以及若干相似的软件系统中。克隆代码在软件工程中与许多问题密切相关,如软件的质量、复杂性、架构、进化、专利和剽窃等。克隆代码检测有广泛的应用:首先,随着开源项目的发展、代码复用规模的扩大,代码复用的广泛程度可以作为代码质量的评判标准和选择所复用的代码模块的参考依据;其次,通过克隆代码检测可以找出大型系统中的克隆代码,并进行重构,从而消除克隆代码,提高源代码的质量。
目前业内普遍依据源代码的文本相似性与功能相似性将克隆代码分成四类:1)除了空格与注释外都相同的代码段;2)除了标志符、类型、空格和注释外句法上都相同的代码段;3)对语句做了增/删/改的复制代码段;4)功能上相同但句法上不同的代码段。其中,一些研究者将第1类称为完全克隆,将第2、3类称为近似克隆,将第4类称为语义克隆。
国内外学者已提出许多克隆检测方法及技术并开发出相应的克隆检测工具。这些方法可大致地分成基于文本、基于词法(token)、基于语法(syntax)、基于语义等。
1)基于文本的检测方法。该方法是在软件系统的源代码上直接进行比较处理(只过滤源代码的注释和布局上的不同点),而不将源代码转换成某种中间表示形式。Johnson首次提出基于文本的克隆检测技术:首先将固定行数的代码段哈希,然后利用增量哈希函数来识别出具有相同哈希值的代码段即克隆代码,同时结合使用滑动窗口技术来查找不同长度的克隆代码。
2)基于词法的检测方法。该方法(也称为基于token的方法)首先使用词法分析工具(如lex)将所有源代码的每一行转换成一个token序列,并将所有序列连接成一个token串;接着扫描这个token以查找相似的token子序列,然后报告这些相似子串所对应的源代码为克隆。
3)基于语法的检测方法。该方法是根据相似的代码段应该也有相似的句法结构而设计的。程序被解析成一棵语法树,其中相似的子树所对应的源代码段就是克隆代码。Baxter等人首次将抽象语法树(AST)技术应用在克隆代码检测上,首先将源代码解析成带有标注的语法树,接着将子树哈希到N个桶(bucket)中,然后对同一个桶中的子树比较相似性,进而获得克隆代码。
4)基于语义的检测方法。该技术主要以程序依赖图(PDG)方法为代表,即给定一个程序,根据程序语句之间的数据流和控制依赖关系建立一个PDG的集合,在此集合中的同构子图所对应的代码段为克隆代码。近年来,也有学者使用动态分析的方法去检测语义上相似的代码段,如加州大学的Jiang等人通过对代码段给定一组输入数据,比较它们的输出结果,进而得到语义上相似的克隆代码。Marcus等人使用信息检索技术(潜在的语义索引)去静态地分析软件系统的源代码进而检测出语义克隆。
基于文本的方法不需考虑程序句法的正确性,时空复杂度最低,可克隆的查全率偏低。该方法主要用来检测第l类克隆。但Lee等人利用n-neighbor方法也能检测到部分近似克隆,效果不理想。
基于token的方法能有效地检测第1、2类克隆,时空复杂度较低,也不需考虑程序句法的正确性,且独立于源代码,但在处理第3类的克隆时会有许多误检。
基于语法的方法能有效地检测第1-3类克隆,但由于需将源代码解析成AST后再查找相似子树,所以时空复杂度偏高。不过后来Jiang等人采用欧式距离和特征向量来优化基于AST的检测方法,降低了寻找同构子树的复杂度。
与基于语法的比较方法相比,基于PDG的技术从一个更高层面去分析源代码,以获得程序的语义信息,所以该技术能检测到一些被打乱顺序、但语义相同的代码段。但建立PDG和寻找同构子图花费的代价亦非常高,难以应用于大规模软件。
由此可见,现有的代码克隆的检测方法存在克隆类型检测不全面、准确度低、复杂度高不易于实现等问题。
发明内容
有鉴于此,本发明的主要目的在于提供一种代码克隆的检测方法,该方法可以有效判断出两个程序代码之间是否存在代码克隆关系,且易于实现。
为了达到上述目的,本发明提出的技术方案为:
一种代码克隆的检测方法,包括:
a、对待检测的两组程序代码,分别提取各自调用的应用程序编程接口(API)集合;
b、确定每组程序代码的API集合中各API的调用频率;
c、对于每组程序代码k,根据其对应的所述API的调用频率,生成该组程序代码的n维标记向量Vk={vk,1,vk,2,...,vk,n},所述n维标记向量中的各维度值vk,i与集合N={API1,API2,...,APIn}中的各API一一对应,所述集合N为所述两组程序代码的API集合的并集,所述vk,i根据第k组程序代码对所对应的APIi的调用频率pk,i得到;
d、根据每组程序代码的所述n维标记向量,计算所述两组程序代码的相似度;
e、根据所述相似度和预设相似阈值,确定所述两组程序代码是否存在克隆关系。
综上所述,本发明提出的代码克隆的检测方法,基于API调用频率进行代码克隆关系的判断,可以提高检测的抗混淆性,准确度高且易于实现。
附图说明
图1为本发明实施例一的流程示意图;
图2为本发明实施例一中程序代码对API调用的示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图及具体实施例对本发明作进一步地详细描述。
本发明的核心思想是:考虑到对于应用程序实现基本功能来说,面向大多数开发者最底层的API都不会改变。如果两个应用使用的API频率基本吻合的话,不管剽窃者对代码的控制流、数据流如何做混淆,最基本的API调用都不会发生大的改变,本发明将利用API调用频率进行代码克隆关系的判断,以提高代码克隆检测的抗混淆性和准确度,并且API的提取易于实现且不需要依赖于源代码,因此还可以有效降低代码克隆检测的难度、提高应用的兼容性。
图1为本发明实施例一的流程示意图,如图1所示,该实施例主要包括:
步骤101、对待检测的两组程序代码,分别提取各自调用的应用程序编程接口(API)集合。
本步骤,用于提取各组程序代码中调用的API,得到每组程序代码的API集合,以便基于各API在程序代码中的调用频率,确定两组程序代码的相似性。
在具体实现时,将根据程序代码的具体类型而采用相应的API提取工具。例如,对于apk程序二进制文件,将使用dex2jar把apk应用程序转化为jar包,然后利用IDApro从jar包中提取出API调用集;对于java应用程序源代码:将使用antlr对程序源代码进行分析,提取API调用集。上述API的具体提取方法为本领域技术人员所掌握,在此不再赘述。
步骤102、确定每组程序代码的API集合中各API的调用频率。
本步骤,用于确定每组程序代码中对各API的调用频率,较佳地,在确定各API的调用频率时可以基于下述原则来对API调用进行计数:
如果程序代码中的一个函数直接或间接调用了一API,并且该函数不是其他函数用于间接调用该API的中间函数,则确定该API被调用一次。
例如,如图2所示的程序代码中API调用的示意图,F1、F2、F3、F4四个函数是可以用来计数的,函数F5和F6则不行。调用API f1的函数有F1、F4,所以f1调用频率记为2,同理APIf2的调用频率为4,f3的调用频率为3。
步骤103、对于每组程序代码k,根据其对应的所述API的调用频率,生成该组程序代码的n维标记向量Vk={vk,1,vk,2,...,vk,n},所述n维标记向量中的各维度值vk,i与集合N={API1,API2,...,APIn}中的各API一一对应,所述集合N为所述两组程序代码的API集合的并集,所述vk,i根据第k组程序代码对所对应的APIi的调用频率pk,i得到。
本步骤,用于根据步骤102中统计到的API调用频率,确定出每组程序代码的n维标记向量,这里,n是由两组程序代码的API集合的并集N确定的,该并集中的元素数即为n。
其中,n维标记向量中的各维度值vk,i与N={API1,API2,...,APIn}中的各API一一对应,i={1,2...,n},vk,i的具体取值由第k组程序代码对集合N中第i个API的调用频率决定。在实际应用中,有可能集合N中的某个API在一组程序代码中未曾被调用,此种情况下,该API在该程序代码中对应的vk,i将取值为0。
具体地,所述vk,i可以直接等于pk,i。较佳地,为了提高克隆的准确度,可以按照vk,i=pk,i/di,计算所述vk,i。其中,di为所述vk,i对应的调整系数,如果所述vk,i对应的API在所述两组程序代码中均被调用,则di=2,否则,di=1。
如此,通过引入调整系数di,可以强化差异性API数据影响,弱化通用性API数据影响,放大了差异性数据的得分,提高了检测的准确度。
步骤104、根据每组程序代码的所述n维标记向量,计算所述两组程序代码的相似度。
本步骤中,通过比较两组程序代码各自的n维标记向量,可以计算出两组程序代码的相似度,较佳地,本步骤可以采用下述方法实现。
对于两组程序代码的所述n维标记向量V1={v1,1,v1,2,...,v1,n}和V2={v2,1,v2,2,...,v2,n},按照进行归一化处理,得到U1={u1,1,u1,2,...,u1,n}和U2={u2,1,u2,2,...,u2,n};
按照计算所述两组程序代码的相似度S(U1,U2)。
步骤105、根据所述相似度和预设相似阈值,确定所述两组程序代码是否存在克隆关系。
较佳地,本步骤可以采用下述方法实现:
如果所述相似度小于所述相似阈值α,则确定所述两组程序代码存在克隆关系,所述相似阈值α∈[0.1,1];
如果所述相似度大于2-α,则确定所述两组程序代码之间不存在克隆关系。
当所述相似度介于α与2-α之间时,暂时无法判定是否为代码克隆。
较佳地,所述相似阈值α=0.8。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (4)

1.一种代码克隆的检测方法,其特征在于,包括:
a、对待检测的两组程序代码,分别提取各自调用的应用程序编程接口API集合;
b、确定每组程序代码的API集合中各API的调用频率;其中,确定所述调用频率时判断API被调用的原则为:如果程序代码中的一个函数直接或间接调用了一API,并且该函数不是其他函数用于间接调用该API的中间函数,则确定该API被调用一次;
c、对于每组程序代码k,根据其对应的所述API的调用频率,生成该组程序代码的n维标记向量Vk={vk,1,vk,2,...,vk,n},所述n维标记向量中的各维度值vk,i与集合N={API1,API2,...,APIn}中的各API一一对应,i={1,2...,n},所述集合N为所述两组程序代码的API集合的并集,所述vk,i根据第k组程序代码对所对应的APIi的调用频率pk,i得到;所述vk,i=pk,i/di,di为所述vk,i对应的调整系数,如果所述vk,i对应的API在所述两组程序代码中均被调用,则di=2,否则,di=1;
d、根据每组程序代码的所述n维标记向量,计算所述两组程序代码的相似度;
e、根据所述相似度和预设相似阈值α,确定所述两组程序代码是否存在克隆关系。
2.根据权利要求1所述的方法,其特征在于,所述步骤d包括:
对于两组程序代码的所述n维标记向量V1={v1,1,v1,2,...,v1,n}和V2={v2,1,v2,2,...,v2,n},按照进行归一化处理,得到U1={u1,1,u1,2,...,u1,n}和U2={u2,1,u2,2,...,u2,n};
按照计算所述两组程序代码的相似度S(U1,U2)。
3.根据权利要求1所述的方法,其特征在于,所述步骤e包括:
如果所述相似度小于所述相似阈值α,则确定所述两组程序代码存在克隆关系,所述相似阈值α∈[0.1,1];
如果所述相似度大于2-α,则确定所述两组程序代码之间不存在克隆关系。
4.根据权利要求1所述的方法,其特征在于,所述相似阈值α=0.8。
CN201410730368.3A 2014-12-04 2014-12-04 代码克隆的检测方法 Active CN104407872B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410730368.3A CN104407872B (zh) 2014-12-04 2014-12-04 代码克隆的检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410730368.3A CN104407872B (zh) 2014-12-04 2014-12-04 代码克隆的检测方法

Publications (2)

Publication Number Publication Date
CN104407872A CN104407872A (zh) 2015-03-11
CN104407872B true CN104407872B (zh) 2018-01-16

Family

ID=52645505

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410730368.3A Active CN104407872B (zh) 2014-12-04 2014-12-04 代码克隆的检测方法

Country Status (1)

Country Link
CN (1) CN104407872B (zh)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106919403B (zh) * 2017-03-16 2019-12-13 杭州鹿径科技有限公司 云环境下基于Java字节码的多粒度代码克隆检测方法
CN108875317B (zh) * 2017-05-08 2022-06-07 中国移动通信有限公司研究院 软件克隆检测方法及装置、检测设备及存储介质
CN107169358B (zh) * 2017-05-24 2019-10-08 中国人民解放军信息工程大学 基于代码指纹的代码同源性检测方法及其装置
CN109472145A (zh) * 2017-12-29 2019-03-15 北京安天网络安全技术有限公司 一种基于图论的代码复用识别方法及系统
CN108446540B (zh) * 2018-03-19 2022-02-25 中山大学 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统
CN108491228B (zh) * 2018-03-28 2020-03-17 清华大学 一种二进制漏洞代码克隆检测方法及系统
CN108920361B (zh) * 2018-06-13 2022-04-26 南京邮电大学 一种串匹配代码相似度检测方法
CN111124487B (zh) * 2018-11-01 2022-01-21 浙江大学 代码克隆检测方法、装置以及电子设备
CN110688315A (zh) * 2019-09-26 2020-01-14 招商局金融科技有限公司 接口代码检测报告生成方法、电子装置及存储介质
CN113656066B (zh) * 2021-08-16 2022-08-05 南京航空航天大学 一种基于特征对齐的克隆代码检测方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103262047A (zh) * 2010-12-15 2013-08-21 微软公司 使用代码克隆检测的智能代码差分
CN104077147A (zh) * 2014-07-11 2014-10-01 东南大学 一种基于代码克隆自动检测和及时提醒的软件复用方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103262047A (zh) * 2010-12-15 2013-08-21 微软公司 使用代码克隆检测的智能代码差分
CN104077147A (zh) * 2014-07-11 2014-10-01 东南大学 一种基于代码克隆自动检测和及时提醒的软件复用方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
Dynamic Software Birthmarks to Detect the Theft of Windows Applications;Haruaki Tamada等;《International Symposium on Future Software Technology 2004 (ISFST 2004)》;20041031;第1-6页 *

Also Published As

Publication number Publication date
CN104407872A (zh) 2015-03-11

Similar Documents

Publication Publication Date Title
CN104407872B (zh) 代码克隆的检测方法
US20210256127A1 (en) System and method for automated machine-learning, zero-day malware detection
CN107885999B (zh) 一种基于深度学习的漏洞检测方法及系统
Zou et al. CCGraph: a PDG-based code clone detector with approximate graph matching
US9971967B2 (en) Generating a superset of question/answer action paths based on dynamically generated type sets
CN107844705B (zh) 基于二进制代码特征的第三方组件漏洞检测方法
CN106843840B (zh) 一种基于相似度分析的源代码版本演化注释复用方法
US20070005598A1 (en) Computer program, device, and method for sorting dataset records into groups according to frequent tree
CN108182523A (zh) 故障数据的处理方法和装置、计算机可读存储介质
KR101617696B1 (ko) 데이터 정규표현식의 마이닝 방법 및 장치
CN108268777A (zh) 一种利用补丁信息进行未知漏洞发现的相似性检测方法
Eskandari et al. Metamorphic malware detection using control flow graph mining
TW201508534A (zh) 產生純化惡意程式的方法、偵測惡意程式之方法及其系統
CN104899147A (zh) 一种面向安全检查的代码静态分析方法
CN107066262A (zh) 源代码文件克隆邻接表合并检测方法
CN112733156A (zh) 基于代码属性图的软件脆弱性智能检测方法、系统及介质
CN105205397A (zh) 恶意程序样本分类方法及装置
Tao et al. Improved plagiarism detection algorithm based on abstract syntax tree
CN103873318A (zh) 一种网站自动化测试方法及自动化测试系统
CN113297580B (zh) 基于代码语义分析的电力信息系统安全防护方法及装置
Huang et al. Efficient and exact query of large process model repositories in cloud workflow systems
CN104572904A (zh) 一种标签关联程度的确定方法及装置
Castiglione et al. On extremal cases of Hopcroft’s algorithm
CN116821903A (zh) 检测规则确定及恶意二进制文件检测方法、设备及介质
Nguyen et al. A method for mining top-rank-k frequent closed itemsets

Legal Events

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