基于后缀树的代码文件克隆检测方法技术

技术编号:15894958 阅读:30 留言:0更新日期:2017-07-28 19:38
本发明专利技术涉及一种基于后缀树的代码文件克隆检测方法,对工程项目文件构造后缀树,在线性时间内实现代码文件克隆检测。LP检测方案及算法是以计算机软件源代码文件内容为粒度,通过对代码文件进行词法分析过滤,并MD5哈希得到指纹值,构造指纹建立指纹库。指纹库保存在MySQL数据库中,以指纹所在的开源项目id作为索引。可以直接提取后缀树中被标记为克隆结果的节点,将这些节点直接保存到克隆结果数据表中。由此,能在线性时间内检测出克隆的代码文件,比直接按照指纹值进行检测有更高效率,实现海量检测。

Code file clonal detection method based on suffix tree

The invention relates to a code file cloning and detecting method based on suffix tree, which constructs a suffix tree for the engineering project file, and realizes the cloning and testing of the code file in the linear time. The LP detection scheme and algorithm are based on the content of the computer software source code file. By analyzing and filtering the code file, the MD5 hash is used to obtain the fingerprint value, the fingerprint is constructed, and the fingerprint database is built. The presence of MySQL in the database with the fingerprint fingerprint bank, open source project ID as index. Nodes in the suffix tree can be directly labeled as clones, and these nodes are stored directly in the clone result data table. As a result, it is more efficient to detect the cloned code files in linear time than to detect them directly.

【技术实现步骤摘要】
基于后缀树的代码文件克隆检测方法
本专利技术涉及一种检测方法,尤其涉及一种基于后缀树的代码文件克隆检测方法。
技术介绍
从软件产业的诞生到现在,随着计算机用户数量快速增加,软件产业发展迅猛,已渗透到人们工作与生活的方方面面。许多软件源代码开放在互联网上,开发人员在互联网查询所需要的相关代码已成为一种快速有效的生产方式。由于共同的软件功能,经过简单修改或者直接的复制粘贴,代码重用已经是软件开发中一个通用行为。开源代码的快速发展,上百万的软件工程源代码在相关网络上可以查找,如GoogleCodeSearch,GitHub,Snippir,SourceForge,GitHub等,今天开源代码已经在软件发展中处于重要地位。随之而来的现象就是,无论有意或无意的复制开源代码,软件系统存在代码段与其他代码非常相似,也称之为代码克隆。在一般的软件系统中都存在明显代码克隆部分,代码相似比例在7%-23%。代码克隆通常是有目的性的,可以减轻开发人员重复性工作,专注核心功能研发等,从这些方面来说是有用的。但是也存在许多问题不利于软件的维护和扩展。例如,在一个代码段中存在漏洞,所有相似的代码段都应该被检测出相同漏洞。特别是直接使用开源代码,没有任何风险意识的人员也将开源代码的问题带入开发的软件系统。这些产品应用在国防、医疗、金融等重要领域,给工作带来巨大的潜在风险。在大型软件系统中,代码的雷同、抄袭现象频发,人们维权意识增强,一些代码克隆侵犯了其他软件公司的知识产权。为保护软件产权,软件公司提前做好软件技术秘密的认定、保密措施,申请专利权、软件著作权登记。但是在发生侵权行为后,需要对软件产品进行判定,以维护自己的权利,这对两方公司都产生严重影响。无意识的代码克隆使软件产品引入外部风险,可以依赖代码克隆检测,在软件开发过程中得到避免或警示。一方面根据开源代码公布的漏洞,代码克隆检测出所有漏洞,可以让开发人员认识存在的问题,对风险进行识别再决定是否使用开源代码。另一方面,也能了解软件系统使用非自主开发代码情况,评估该软件产品的技术含量。还存在许多其他的软件工程任务需要代码克隆检测,如程序理解,了解克隆代码领域知识;代码质量分析,较少的克隆可能意味着更好的代码质量;对软件进行演化分析;分析代码重复程度,对代码进行压缩;根据代码来源进行代码病毒检测以及代码错误检测。而软件开发基于计算机语言,语言结构简单,比自然语言更易被机器识别。软件工程任务需要能够自主进行代码克隆检测的工具,识别克隆代码的漏洞、知识产权、授权许可等信息。并且与一般文本的自然语言克隆检测不同,根据不同类型的代码克隆,代码克隆有一定规律性,也更适合自动检测。现在代码克隆检测研究都是基于两个代码段间进行比对,实际无法提前知道该软件复制哪些代码源,需要将代码与大量代码进行匹配检测,对于检测效率有更高的要求。而使用开源代码是直接导入整个开源项目,若进行代码内容匹配则花费更多时间。本专利在代码克隆检测对象上,由一对一向一对多进行,分析不同克隆情况并开发检测工具,进行实际应用。有鉴于上述的缺陷,本设计人,积极加以研究创新,以期创设一种基于后缀树的代码文件克隆检测方法,使其更具有产业上的利用价值。
技术实现思路
为解决上述技术问题,本专利技术的目的是提供一种基于后缀树的代码文件克隆检测方法。本专利技术的基于后缀树的代码文件克隆检测方法,其中:对工程项目文件构造后缀树,在线性时间内实现代码文件克隆检测,其包括以下步骤:步骤一,构造开源项目指纹库,采用的后缀树为Ukkonen算法,步骤二,对代码文件克隆进行检测,若从指纹库中直接检索相同的文件指纹,整个检测实现的算法复杂度为O(mn),m为待检测项目的文件指纹数,n是指纹库的指纹数;以后缀树方法为基础,完成在线性时间内检测相同代码文件。进一步地,上述的基于后缀树的代码文件克隆检测方法,其中,所述步骤一中,代码文件为粒度构造代码指纹,所述代码指纹直接保存在主服务器上,建立指纹库和代码克隆检测;用户输入相关信息并上传开源工程项目,或是选择直接从网络上进行自动抓取,对开源工程项目解压并存放到指定目录,遍历开源项目,对符合用户输入语言的代码文件进行处理;根据用户输入的最小文件行数对较少行数的代码文件进行过滤,通过MD5哈希得到指纹值,并将指纹保存到MySQL数据库中。更进一步地,上述的基于后缀树的代码文件克隆检测方法,其中,所述步骤一中,以代码文件自定义对象的序列作为节点内容,自定义对象FileNode结构如表所示,文件粒度指纹库保存在MySQL数据库的t_file_hash表中,更进一步地,上述的基于后缀树的代码文件克隆检测方法,其中,所述步骤一中,将开源工程项目添加到指纹库中,遍历该工程项目,对符合条件的代码文件采用JFLex进行词法分析过滤,并MD5哈希。更进一步地,上述的基于后缀树的代码文件克隆检测方法,其中,采用的算法括构建后缀树和递归处理剩余后缀节点两部分,构造后缀树的伪代码表,对两个工程项目构成的FileNode序列构造后缀树,遍历序列每个对象,如果后缀树中存在当前对象指纹值为前缀的后缀,则改变三元组和剩余后缀数的值,否则直接添加到当前节点的子节点;对于已经保存的待插入剩余后缀,直到遍历到不存在以当前对象为前缀的后缀节点,则需要对后缀树进行分裂;分裂活动中,将活动节点的FileNode序列以活动长度作为分裂点,前半部分作为活动节点的序列,后半部分添加到其子节点,并且将当前剩余序列添加到活动节点的子节点;分裂完成后按照三个规则处理三元组,最后按照剩余插入后缀数递归处理待插入的FileNode序列。更进一步地,上述的基于后缀树的代码文件克隆检测方法,其中,所述步骤一中,对Ukkonen算法进行适应性优化,将后缀树构造应用到代码文件克隆检测中,包括,d)序列节点,每次插入新对象时,构造的新节点内容为对象序列,而不是单个对象;e)节点标记,在构造后缀树过程中及时标记公共子串所在的节点;减少比较,扫描一个新文件对象时,查找是否存在以该文件相同指纹值的对象为开头的后缀节点时,对标记为不可能是克隆文件的节点不进行比较。更进一步地,上述的基于后缀树的代码文件克隆检测方法,其中,每次插入新节点时,节点内容是以该字符为起始位置到结束的序列,检测两个FileNode序列的克隆代码文件,在两个项目序列中间添加标识符标识一个项目的结束,而在构造过程中,若一个非叶节点的子节点中含有这个标识符,则说明这个非叶节点的FileNode对象既在检测任务中出现也在开源项目中出现,为两个项目的克隆代码文件。再进一步地,上述的基于后缀树的代码文件克隆检测方法,其中,所述步骤二中,进行克隆度和相似度计算,根据后缀树构造过程中保存的克隆结果进行统计计算,检测项目的克隆度指该项目有克隆开源项目的代码文件行数占所有代码文件行数和的比值,定义如公式1所示,fi是检测项目克隆文件,fj是检测项目代码文件,line表示该文件的行数,相似度,指检测项目与一个开源项目的相似度,检测项目与开源项目克隆的文件行数占两个项目所有代码文件行数和的比值,定义如公式2所示,fi是检测项目克隆文件,pi是开源项目克隆文件,fj是检测项目代码文件,pj是开源项目代码文件,line表示该文件的行数,借由上述本文档来自技高网
...
基于后缀树的代码文件克隆检测方法

【技术保护点】
基于后缀树的代码文件克隆检测方法,其特征在于:对工程项目文件构造后缀树,在线性时间内实现代码文件克隆检测,其包括以下步骤:步骤一,构造开源项目指纹库,采用的后缀树为Ukkonen算法,步骤二,对代码文件克隆进行检测,若从指纹库中直接检索相同的文件指纹,整个检测实现的算法复杂度为O(mn),m为待检测项目的文件指纹数,n是指纹库的指纹数;以后缀树方法为基础,完成在线性时间内检测相同代码文件。

【技术特征摘要】
1.基于后缀树的代码文件克隆检测方法,其特征在于:对工程项目文件构造后缀树,在线性时间内实现代码文件克隆检测,其包括以下步骤:步骤一,构造开源项目指纹库,采用的后缀树为Ukkonen算法,步骤二,对代码文件克隆进行检测,若从指纹库中直接检索相同的文件指纹,整个检测实现的算法复杂度为O(mn),m为待检测项目的文件指纹数,n是指纹库的指纹数;以后缀树方法为基础,完成在线性时间内检测相同代码文件。2.根据权利要求1所述的基于后缀树的代码文件克隆检测方法,其特征在于:所述步骤一中,代码文件为粒度构造代码指纹,所述代码指纹直接保存在主服务器上,建立指纹库和代码克隆检测;用户输入相关信息并上传开源工程项目,或是选择直接从网络上进行自动抓取,对开源工程项目解压并存放到指定目录,遍历开源项目,对符合用户输入语言的代码文件进行处理;根据用户输入的最小文件行数对较少行数的代码文件进行过滤,通过MD5哈希得到指纹值,并将指纹保存到MySQL数据库中。3.根据权利要求2所述的基于后缀树的代码文件克隆检测方法,其特征在于:所述步骤一中,以代码文件自定义对象的序列作为节点内容,自定义对象FileNode结构如表所示,文件粒度指纹库保存在MySQL数据库的t_file_hash表中,4.根据权利要求1所述的基于后缀树的代码文件克隆检测方法,其特征在于:所述步骤一中,将开源工程项目添加到指纹库中,遍历该工程项目,对符合条件的代码文件采用JFLex进行词法分析过滤,并MD5哈希。5.根据权利要求1所述的基于后缀树的代码文件克隆检测方法,其特征在于:采用的算法括构建后缀树和递归处理剩余后缀节点两部分,构造后缀树的伪代码表,对两个工程项目构成的FileNode序列构造后缀树,遍历序列每个对象,如果后缀树中存在当前对象指纹值为前缀的后缀,则改变三元组和剩余后缀数的值,否则直接添加到当前节点的子节点;对于已经保存的待插入剩余后缀,直到遍历到不存在以当前对象为前缀的后缀节点,则需...

【专利技术属性】
技术研发人员:罗峋饶飞
申请(专利权)人:苏州棱镜七彩信息科技有限公司
类型:发明
国别省市:江苏,32

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

1