- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基干中间表示代码相似性检测方法
基于中间表示的代码相似性检测方法 摘 要
研究表明软件系统普遍存在重复代码,为了维护和重构系统,人们需要代码相似性检测工具找到重复代码。大部分传统代码相似性检测方法和工具是基于特定程序语言和目标平台,但是许多软件系统包含多种程序语言编写的源代码。为了使代码相似性检测方法不局限于特定语言或平台,本文提出了一种基于中间表示的代码相似性检测方法。中间表示包含了程序的运行的基本信息,并且很少受到语言与平台的影响。所以基于中间表示的代码相似性检测方法能够有效的检测出代码的相似程度,并且具有跨语言和跨平台的特性。这种方法的主要思想是利用编译器将源代码编译为中间表示,再对中间表示进行文本的相似性比较,最后利用局部敏感性哈希高效的检测出相似代码对。实验表明基于中间表示的代码相似性检测方法比其他方法有更高的精确性
【关键词】中间表示 代码相似性 相似性检测
1 相关研究
1.1 基于文本的代码相似性检测方法
在基于文本的代码相似检测方法中,源代码被视为行或字符串的序列。通过比较代码块之间相同的子序列来检测其相似程度。一旦代码片段间相同字符超过给定的阈值时,就提交给用户。基于纯文本或词法的方法不能将源代码对应到程序数据结构
Baker的Dup是一个被广泛使用的基于文本的代码相似性检测工具。Dup在正规化的过程中移除了制表符,空格和注释,并且替换了函数的标识符,还把变量类型和变量名进行了统一替换。需要说明的是,Dup也支持行与行的比对,所以Dup也可以属于基于标记的方法
1.2 基于标志的代码相似性检测方法
在基于标志(token)的相似性检测方法中,源代码会被转化为一个标志序,通过扫描序列来查找相同子序列进而确定其相似程度。相较于基于文本的方法,基于标志的方法对例如代码样式的更改有更高的鲁棒性
2 基于中间表示的代码相似性检测
基于中间表示的代码相似性检测方法的核心思想是通过编译得到代码的中间表示,然后检测个代码块对应中间表示之间的文本相似度。首先将源代码编译为中间表示,再提取源代码对应中间表示的指纹,通过指纹之间的对比得到源代码相似度
2.1 中间表示
中间表示是用于分析程序并应用于抽象机器(abstract machine)的编程语言。在编译器将源代码编译为目的码的过程中,会先将源代码转换为一个或多个中间表示,以编译器进行最佳化,并产生目的机器的机器语言。中间表示是一种原始代码的机器无关和语言无关版本。使用中间表示有助于抽象代码,编译器前端与后端的解耦和,并且支持重定位与交叉编译。中间表示同时可以使编译器支持高级优化
GCC与Clang是目前最流行的编译器,它们分别使用GCC表达式树与LLVM汇编语言作为中间表示。GGC RTL与LLVM IR都可以支持多个平台与多种语言。LLVM 编译流程是基于库接口进行设计的,可以对IR任意进行操作,最后在于调用平台相关的库接口转换成机器码。GGC的编译流程大致为使用内部头文件构造RTL,再有后端编译为目标平台的机器码。LLVM IR作为一种独立的编程语言,其可扩展性更高
综上所述,各方面比较之下,LLVM更适合运用在基于中间表示的代码相似度检测
2.2 文本相似性检测
目前有许多算法能被用于在哈希值序列中提取指纹,该类算法具有两个性质:
(1)上下文无关性,即选取指纹的依据只能在序列中得到,这保证了对于同一序列选取的指纹是唯一的
(2)指纹密度,即在序列中选取的指纹数量与序列长度的比
在保证随机性的情况下,密度越小则后续的相似性计算的复杂度就越低。比较常见的方法是选定能整除给定p的值作为指纹,p一般选取一个素数。假设序列S的值随机,那么该方法的指纹密度为d= |S| /p。此方法的缺陷在于会有聚集问题,需要将p设为一个较大的数。Schleimer等人在文献中提出了Winnowing,一种选取指纹的本地算法。Winnowing的主要思路是选择序列中长度为w的滑动窗口W中最左的最小值作为指纹,如果该值曾经被选中,则跳过该窗口。算法的指纹密度为d=2/(w+1)。所以,在本文中,我们使用Winnowing在哈希序列中选取指纹
至此,通过以上步骤可以得到在[0,1]区间内的中间表示文本的相似度
3 实验
为了验证基于中间表示的方法在代码相似性检测方面的准确性。本文从互联网上搜集了分别归属于158个问题274个C/C++程序。在归一化文件名之后,分别使用编辑距离,基于文本的代码相似性检测和基于IR的方法对数据进行分类。实验先使用LLVM的编译器前端Clang将源代码编译为LLVM中间表示。接着使用滚动哈希技术将中间表示转换成标志序列。最后使用雅可比系数计算代码之间的相似性
4 结束语
在本文中
您可能关注的文档
最近下载
- XX国际建设项目竣工环境保护验收监测报告PPT汇报课件.pptx
- 40w机械白金机电3米并非子虚乌有.pdf VIP
- 四川乐山市市中区区属国有企业招聘笔试题库2023.pdf VIP
- 2025四川乐山市市中区国有企业选聘领导人员4人笔试参考题库附答案解析.docx VIP
- eVTOL飞行系统容错控制策略的技术现状与发展方向.docx VIP
- 小猪佩奇第一季台词本(11-20集).doc VIP
- 公司内部研发项目立项申请表.doc VIP
- 山东省职业指导师职业技能竞赛决赛考试题库(含答案).docx VIP
- 小猪佩奇第一季(1-10)集中英互译台词.pdf VIP
- 文艺演出服务项目组织机构及人员配备.doc VIP
文档评论(0)