源代码文件克隆邻接表合并检测方法与流程

文档序号:11519322阅读:259来源:国知局
源代码文件克隆邻接表合并检测方法与流程
本发明涉及一种源代码处理方法,尤其涉及一种源代码文件克隆邻接表合并检测方法。
背景技术
:从软件产业的诞生到现在,随着计算机用户数量快速增加,软件产业发展迅猛,已渗透到人们工作与生活的方方面面。许多软件源代码开放在互联网上,开发人员在互联网查询所需要的相关代码已成为一种快速有效的生产方式。由于共同的软件功能,经过简单修改或者直接的复制粘贴,代码重用已经是软件开发中一个通用行为。开源代码的快速发展,上百万的软件工程源代码在相关网络上可以查找,如googlecodesearch,github,snippir,sourceforge,github等,今天开源代码已经在软件发展中处于重要地位。随之而来的现象就是,无论有意或无意的复制开源代码,软件系统存在代码段与其他代码非常相似,也称之为代码克隆。在一般的软件系统中都存在明显代码克隆部分,代码相似比例在7%-23%。代码克隆通常是有目的性的,可以减轻开发人员重复性工作,专注核心功能研发等,从这些方面来说是有用的。但是也存在许多问题不利于软件的维护和扩展。例如,在一个代码段中存在漏洞,所有相似的代码段都应该被检测出相同漏洞。特别是直接使用开源代码,没有任何风险意识的人员也将开源代码的问题带入开发的软件系统。这些产品应用在国防、医疗、金融等重要领域,给工作带来巨大的潜在风险。在大型软件系统中,代码的雷同、抄袭现象频发,人们维权意识增强,一些代码克隆侵犯了其他软件公司的知识产权。为保护软件产权,软件公司提前做好软件技术秘密的认定、保密措施,申请专利权、软件著作权登记。但是在发生侵权行为后,需要对软件产品进行判定,以维护自己的权利,这对双方公司都产生严重影响。无意识的代码克隆使软件产品引入外部风险,可以依赖代码克隆检测,在软件开发过程中得到避免或警示。一方面根据开源代码公布的漏洞,代码克隆检测出所有漏洞,可以让开发人员认识存在的问题,对风险进行识别再决定是否使用开源代码。另一方面,也能了解软件系统使用非自主开发代码情况,评估该软件产品的技术含量。还存在许多其他的软件工程任务需要代码克隆检测,如程序理解,了解克隆代码领域知识;代码质量分析,较少的克隆可能意味着更好的代码质量;对软件进行演化分析;分析代码重复程度,对代码进行压缩;根据代码来源进行代码病毒检测以及代码错误检测。而软件开发基于计算机语言,语言结构简单,比自然语言更易被机器识别。软件工程任务需要能够自主进行代码克隆检测的工具,识别克隆代码的漏洞、知识产权、授权许可等信息。并且与一般文本的自然语言克隆检测不同,根据不同类型的代码克隆,代码克隆有一定规律性,也更适合自动检测。现在代码克隆检测研究都是基于两个代码段间进行比对,实际无法提前知道该软件复制哪些代码源,需要将代码与大量代码进行匹配检测,对于检测效率有更高的要求。而使用开源代码是直接导入整个开源项目,若进行代码内容匹配则花费更多时间。本专利在代码克隆检测对象上,由一对一向一对多进行,分析不同克隆情况并开发检测工具,进行实际应用。有鉴于上述的缺陷,本设计人,积极加以研究创新,以期创设一种源代码文件克隆邻接表合并检测方法,使其更具有产业上的利用价值。技术实现要素:为解决上述技术问题,本发明的目的是提供一种源代码文件克隆邻接表合并检测方法。本发明的源代码文件克隆邻接表合并检测方法,其包括以下步骤:步骤一,构造开源项目指纹库,并进行指纹库索引建立和存储;步骤二,针对邻接表合并检测;步骤三,相似度计算;单个源文件中所有规范化后的token,从第一个开始,每固定个数被转换为一个chunk,这样,每个代码文件转换后会生成很多chunk,然后将每个chunk都存储到hbase中。进一步地,上述的源代码文件克隆邻接表合并检测方法,其中,所述步骤一中,对源代码文件所在目录进行遍历,根据用户定义的开发语言,从目录中过滤出对应的源文件,通过词法分析器对源代码文件进行分析,从中提取出token并记录每个token的类型,所述词法分析器,根据源代码的语言类型,从源文件中提取标识符、常量、关键字、运算符等token单元,存放到符号表中,所述词法分析器,每次分析到一个新的token,就交给规范化程序,对提取到的token进行规范化。更进一步地,上述的源代码文件克隆邻接表合并检测方法,其中,所述规范化的规则为,(1)直接忽略注释、括号等分隔符、预处理指令、this调用、命名空间限定符、可见度修饰符等内容;(2)标识符用id加上编号进行替换,编号从0开始,出现过的使用已有编号,没有出现过的编号递增;(3)字符串用空串替换;(4)字符用固定字符串替换;(5)整型数值用0替换;(6)浮点类型用0.0替换;(7)布尔值用true替换。更进一步地,上述的源代码文件克隆邻接表合并检测方法,其中,所述步骤一中,当有项目需要进行检测的时候,首先对项目的源代码也进行转化,以单个文件为粒度,转换为chunk序列,然后根据每个chunk单元的hash值,到hbase中进行检索,检索出所有具有同样hash值的索引单元;检索出来的结果,需要根据待检测文件中索引单元的排列顺序进行排列,最终形成一个二维邻接表类型的数据结构;采用行头元素构成待检测文件中的chunk单元,每一行中存放与行头元素具有相同hash值的从索引库中检索出来的chunk单元,行与行之间按照行头元素在待检测文件中排列的顺序进行排列。更进一步地,上述的源代码文件克隆邻接表合并检测方法,其中,所述步骤一中,将经过步骤一预处理的源代码,被转换成了规范化后的token序列,由后续过程利用这个token序列建立索引单元chunk,经过预处理过程的token,按照固定数目进行结合,构成了一个基本的索引单元chunk,所述索引单元chunk是对源代码进行的一种压缩,索引单元chunk里面不含源代码的文本信息,只含有这一段代码(固定数目token合并到一起)的hash值等信息,所述索引单元的基本结构如下表所示,更进一步地,上述的源代码文件克隆邻接表合并检测方法,其中,所述步骤二中,位于邻接表的每一行的行头元素为某个待检测文件生成的chunk单元,行头按照在待检测文件中的顺序排列;每一行除了行头外,其他所有chunk都是从hbase的索引库中检索出来的,这些是开源代码生成的chunk,这些索引单元的hash值都与行头元素的hash值相同,并且,同一行内,索引单元序列按照所在的文件编号和在文件中出现的位置进行排序。再进一步地,上述的源代码文件克隆邻接表合并检测方法,其中,所述步骤三中,对克隆结果汇总之后,计算源文件之间的相似度,设两个源文件为p和q,p是由一系列元素p1,p2,...pn构成,q由一系列元素q1,q2,...qn构成,这些元素表示源文件p和q中的索引单元;所有索引单元之间的克隆对(pi,qj)构成一个集合,用rs表示,源文件p和q之间的相似度s(p,q)采用下面的公式来表示,其中,p中存在克隆现象的索引单元个数与q中存在克隆现象的索引单元个数之和,比上p中索引单元个数与q中索引单元个数之和。借由上述方案,本发明至少具有以下优点:实现能在时间复杂度为o(nm),空间复杂度为o(nm)内检测出克隆的代码文件,实现海量检测。上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,并可依照说明书的内容予以实施,以下以本发明的较佳实施例并配合附图详细说明如后。附图说明图1是本发明实施期间代码克隆来源分析系统流程图。图2是本发明实施期间两个chunk序列之间的合并规则图。图3是本发明实施期间代码克隆检测系统功能模块设计图。具体实施方式下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。如图1至3的源代码文件克隆邻接表合并检测方法,本方法是对工程项目文件指纹构造分布式索引和邻接表合并检测算法,在时间复杂度为o(nm)内,实现代码文件克隆检测。其实现可大致分为如下三个步骤:步骤一,数据预处理。源代码文件在被转换为索引数据之前,需要经历几个阶段的处理,主要是过滤对应的代码文件,提取词法单元(token)等。首先需要对源代码文件所在目录进行遍历,根据用户定义的开发语言,从目录中过滤出对应的源文件。接着,词法分析器对源代码文件进行分析,从中提取出token并记录每个token的类型。词法分析器主要的工作是根据源代码的语言类型,从源文件中提取标识符、常量、关键字、运算符等token单元,存放到符号表中。词法分析器每次分析到一个新的token,就交给规范化程序,对提取到的token进行规范化,规范化的主要规则如下:(1)直接忽略注释、括号等分隔符、预处理指令、this调用、命名空间限定符、可见度修饰符等内容。(2)标识符用id加上编号进行替换,编号从0开始,出现过的使用已有编号,没有出现过的编号递增。(3)字符串用空串替换。(4)字符用固定字符串替换。(5)整型数值用0替换。(6)浮点类型用0.0替换。(7)布尔值用true替换。同时,经过预处理的源代码,被转换成了规范化后的token序列,由后续过程利用这个token序列建立索引单元chunk。进一步来看,本发明采用的数据预处理实现过程如下:通过本发明构建的系统在为源代码建立索引前,需要对源代码进行预处理。预处理的过程主要是从源文件中提取出词法单元,并根据特定转换规则,删除或替换词法单元。系统采用jflex从源代码中提取单词,对每个词法单元的处理代码如表1所示。表1,对单词的处理算法表1中第2行的isignored(token)是对单词进行过滤,需要过滤掉的单词总共有6种:(1)注释内容。(2)左右圆括号和左右大括号。(3)预处理命令。(4)this调用。(5)命名空间限定符。(6)可见度修饰符。jflex提取单词的时候会返回单词的类型,根据单词的类型进行判断并过滤掉对应的单词即可。并且,上面的代码调用词法分析器不断获取token单元,如果token单元是不能忽略的,就调用normalizecontent过程对token单元进行规范化。步骤二,索引建立和存储。经过之前预处理过程的token,按照固定数目进行结合,构成了一个基本的索引单元chunk。该索引单元是对源代码进行的一种压缩,索引单元里面不含源代码的文本信息,只含有这一段代码(固定数目token合并到一起)的hash值等信息。索引单元的基本结构如表2所示。表2,基本索引单元chunk属性说明chunkhash该段代码文本的md5hash值elementunits索引单元中包含的词法token数目firstrawlinenumber对应源文件的开始行号firstunitindex所含token中,第一个token的编号lastrawlinenumber对应源代码文件的结束行号originid该索引单元所在文件的唯一路径rawendoffset对应源代码文件中结束行中的偏移量rawstartoffset对应源代码文件中开始行中的偏移量结合本发明一较佳的实施方式来看,单个源文件中所有规范化后的token,从第一个开始,每固定个数被转换为一个chunk,这样,每个代码文件转换后会生成很多chunk,然后将每个chunk都存储到hbase中。当有项目需要进行检测的时候,首先对项目的源代码也进行转化,以单个文件为粒度,转换为chunk序列,然后根据每个chunk单元的hash值,到hbase中进行检索,检索出所有具有同样hash值的索引单元。检索出来的结果,需要根据待检测文件中索引单元的排列顺序进行排列,最终形成一个二维邻接表类型的数据结构。行头元素是待检测文件中的chunk单元,每一行中存放与行头元素具有相同hash值的从索引库中检索出来的chunk单元,行与行之间按照行头元素在待检测文件中排列的顺序进行排列。再进一步结合建立索引的实现来看,可根据前面的预处理过程,利用tokennormalization对源代码进行词法分析,并进行格式化处理,处理之后得到一个单词序列。接着,需要对这个单词序列建立索引。建立索引数据的基本流程是根据前一阶段处理后得到的源文件单词序列,按照chunksize定义的大小,每chunksize个单词被封装成为一个chunk,即生成一个索引单元。该单元的文本内容是其封装的单词序列的内容的拼接,拼接过程使用一个比较特殊的字符串作为间隔符,接着根据拼接后得到的内容进行md5计算,作为该索引单元的hash值,利用这个hash值来代表整段代码的内容,这样就对源代码进行了一定程度的压缩。在后续的过程中,依此进行检索和计算。当索引建立好之后,将索引数据以其hash值为行键,存储到hbase中,存储时,由于hbase是面向列的数据库,需要构建列键,具体构建的方法是利用索引所在文件的唯一路径加上索引在该文件中的索引编号,核心代码如表3所示。表3,向hbase中存储索引数据的伪代码从上面的代码第3行可以看出,向hbase中存储索引的时候,每个属性都加上一个列键,该列键是由路径加上索引号构成的。从hbase中取数据的时候,先取出所有的列键,然后按照每一个列键对应唯一一个索引数据的原则,从hbase中取出索引数据并按照列键对数据进行封装。步骤三,匹配算法。根据克隆代码的性质,建立基于索引的代码克隆检测算法伪代码,如表,4所示。表4,基于索引的代码克隆检测算法伪代码具体来说,代码第1至2行表示将temlist初始化为第0行chunk序列,并对每个chunk单元的属性进行初始化。第3行表示对chunklist进行一次遍历,在遍历过程中对scanindex指向的当前行与temlist进行合并。4至6行表示如果temlist为空,即遇到了空行,那么将temlist置为scanindex当前指向的行,并对其中的chunk的属性进行初始化。从第9行开始表示对temlist和scanindex指向的chunk序列进行合并。第10-16行表示发现来源于同一文件并且连续的两个chunk单元,保留编号较大的那个chunk。17至19行与24至26行处理的情况类似,表示temlist中的某个chunk,在scanindex指向的chunk序列中没有与之连续的chunk,那么预示着temlist中这个chunk达到了最大连续,需要认定为一段克隆代码。20至23行与27至30行处理的情况类似,表示scanindex指向的序列中的某个chunk在temlist没有找到对应的前序chunk,需要将这个chunk的属性初始化之后放到合并结果中。由于合并过程时间复杂度为o(m),而算法外层只剩下一个循环,可以得到,算法的时间复杂度为o(nm),空间复杂度为o(nm)。本发明的实施思的基础是在hadoop分布式环境中为大规模代码高效地建立索引数据,在此基础上建立代码克隆检测算法。其采用hadoop对大规模代码进行分布式并行处理。为大规模代码建立索引,存放在hbase中,进而实现分布式索引。在本发明的实施期间,设计了基于索引的克隆检测算法,提高算法的效率,解决海量信息处理问题。同时,引入开源代码授权追踪,当检测到目标系统与开源代码之间的代码克隆后,进一步对目标系统的授权信息进行确认。进一步结合本发明实施期间的算法实现来看,采用检测实现算法主要包括数据预处理,索引,算法。并且,本发明在实施过程中,还可提供一种基于索引的克隆检测算法,其实现如下:在进行匹配算法之前,首先需要根据待检测项目的hash值序列从hbase中去检索,还要对检索到的结果进行排序。对源代码文件进行代码克隆检测的完整过程如图1所示。对于每一个待检测的源代码文件,经过构建索引并利用索引到hbase中进行检索之后,都会生成一个二维邻接表的数据结构,待检测的代码的索引序列作为行头,每行存放与行头元素具有相同hash值的索引数据,每一行的元素按照文件路径进行排序,行头按照其在待检测文件中所处的索引编号进行排序。得到这个邻接表结构后,就可以在上面进行克隆检测算法,算法主要流程如前介绍过了。算法得到的是克隆类信息,也就是在检测的过程中,会对相似的代码段进行归类,每一个克隆类包含有多个代码段信息,为了依据源文件目录结构那样将克隆代码展示给用户,在检测之后,还需要从克隆类中获取克隆对信息,并且克隆对信息是针对正在检测的项目的。通过上述的文字表述并结合附图可以看出,采用本发明后,拥有如下优点:实现能在时间复杂度为o(nm),空间复杂度为o(nm)内检测出克隆的代码文件,实现海量检测。以上所述仅是本发明的优选实施方式,并不用于限制本发明,应当指出,对于本
技术领域
的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变型,这些改进和变型也应视为本发明的保护范围。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1