一种检测软件抄袭的方法和装置制造方法及图纸

技术编号:9935573 阅读:108 留言:0更新日期:2014-04-18 07:51
一种检测软件抄袭的方法,该方法基于抽象语法树的剪枝比对算法,其特征在于:所述方法包括以下步骤:A.获取源代码文件;B.生成抽象语法树;C.遍历该抽象语法树,并将其转化为所需的存储类型;D.赋值抽象语法树的节点并排序;E.比对排序后的节点;F.输出结果。

【技术实现步骤摘要】
【专利摘要】本专利技术提供一种检测软件抄袭的方法和装置,该方法基于抽象语法树的剪枝比对算法,其包括以下步骤:A.获取源代码文件;B.生成抽象语法树;C.遍历该抽象语法树,并将其转化为所需的存储类型;D.赋值抽象语法树的节点并排序;E.比对排序后的节点;F.输出结果。本专利技术在语法层次上,对源代码抄袭进行准确检测,尤其是对抽象语法树检测算法无法进行判别的变量类型改变和添加干扰变量的抄袭进行准确而有效的检测,且可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备执行本专利技术的方法。【专利说明】一种检测软件抄袭的方法和装置
本专利技术属于信息安全中的软件安全
,具体涉及一种检测软件抄袭的方法和装置。
技术介绍
随着科技的发展,软件产业的环境不断改善,新技术的快速涌现,促进了软件产业的飞速发展,每天出现在市场上的新软件越来越多。但是在这众多的新软件中,也不可避免的出现了软件质量参差不齐的情况,对软件源代码的克隆、抄袭等现象也日益涌现,软件的抄袭主要表现为完全拷贝代码,或者在此基础上再进行一些不影响代码功能的修改等。常见的对于代码的修改有修改方法的访问类型、改变变量属性和添加或删除类等。因此,针对软件源代码抄袭的检测技术在软件的剽窃检测和评估工作中起到非常重要的作用,在这样的背景下,出现了很多针对软件抄袭检测技术的研究成果。现在比较常用的软件源代码抄袭检测工具主要是基于文本的、基于Token的和基于代码语法结构的。基于文本的抄袭检测技术一般是在将源代码转化为字符串,通过对字符串的查找匹配检测克隆代码。在字符串查找匹配检测算法中,最常用的就是最长公共子串(LCS)算法,它通过计算两个文本最长相同文本长度来检测文本抄袭情况。而目前软件源代码抄袭的过程一般都是整块复制,或者在此基础上加以改动,比如替换变量名、在不影响程序功能的情况下打乱语句顺序、更改函数名或者函数位置等等,因此,基于文本的软件抄袭检测技术方案仅仅在文本层次进行软件检测,并不能满足软件抄袭检测的需求。而且,基于文本层次的软件抄袭检测完全忽略了软件源代码的语法含义,因而有很大的局限性,对于上述软件源代码抄袭手段都无法正确检测出来。基于Token比对的源代码抄袭检测技术就是将源代码的每个词转化为一个标记,通过比对标记来判定抄袭,其算法研究较多,CP-Miner, CCFinder等众多比对工具都采用了这种比对技术。在基于Token的源代码检测技术基础上,Muddu等学者最近提出了一种Robust技术,这种技术基于一种language aware Token序列,同时又融合了抽象语法树的一些技术。它首先遍历由JDT解析获得代码的语法树来获取代码的Token序列,然后通过K-gram技术把得到的Token序列分割成一系列的K-gram并将其存储在索引中,最后通过比对K-gram来定位源代码抄袭。这种技术在一定程度上弥补了最长公共子串(LCS)算法的缺陷。国内一些学者在基于Token的技术研究方面提出了 Token流分析和序列挖掘相结合的方法,将克隆代码和克隆代码引起的缺陷进行联合检测,降低克隆代码误检和漏检对标识符重命名不一致缺陷检测的影响;也有一些研究人员把聚类引入到代码同源性检测之中,提出了一种基于序列聚类的检测算法。该算法首先把源代码按照其自身的结构进行分段提取,然后对各个分段进行部分代码变换,再以带权重的编辑距离为相似度量标准对这些符号进行序列聚类,得到相似的程序代码片段,以达到对源程序进行相似功能检测的目的。基于标记Token的软件同源性检测技术方案在一定程度上考虑了语言特点,但其原理是查找软件源代码中最长的相似子串,所以不能应对软件源代码顺序调换这样的抄袭情况。在基于Token检测的技术上更进一步就是基于软件源代码语法结构的检测技术。现在已经有一些从源代码语法结构的层次进行代码抄袭检测和比对的研究成果,比如利用欧式向量空间记录语法树信息进行比对的DECKARD,由Wahler等人提到的用Xml记录语法树信息来比对的方法,同时还有一些在线比对系统,比如Moss,以及Prcchelt L等人开发的JPlag。Baxter等人也提出了一种利用源代码语法树进行代码抄袭检测的算法,并且有名为CloneDr的软件克隆检测软件。但是他的算法在整个比对过程中都保持了树形结构,需要进行多次树的遍历。基于抽象语法树的同源比对是语法树比对方法的一种改进,它的对语法树进行了两次存储格式的变换,将树形结构转换为了线性链表,并且按照子节点数进行了语法树子树的分组,并按照hash值对语法树子树进行了排序,从而提高了比对的效率,该算法还对交换位置后语义发生改变的运算(例如减法和除法)进行特殊处理,降低了误报率。然而,基于抽象语法树比对方法仍然具有局限性,它对那些修改底层数据结构的抄袭无法检测或检测误差较大。
技术实现思路
为了克服上述现有技术的不足,本专利技术提供一种基于抽象语法树剪枝比对算法的软件抄袭检测方法及装置,通过生成软件源代码对应的抽象语法树,并将抽象语法树中各个树节点转换存储类型并调整为统一结构;计算所述抽象语法树中各个节点的哈希值,并将节点按照哈希值大小排序;删除子树叶子节点,判断子树根节点哈希值是否一致;向子树中依次添加删除的叶子节点,找出影响比对结果的节点;计算软件源代码的相似度,输出软件检测的结果。为了实现上述专利技术目的,本专利技术采取如下技术方案:本专利技术的一方面,提供一种检测软件抄袭的方法,该方法基于抽象语法树的剪枝比对算法,其特征在于:所述方法包括以下步骤:A.获取源代码文件;B.生成抽象语法树;C.遍历该抽象语法树,并将其转化为所需的存储类型;D.赋值抽象语法树的节点并排序;E.比对排序后的节点;F.输出结果。优选地,所述步骤A包括:根据源代码文件的格式信息得到源代码文件的文本内容。优选地,所述步骤B包括:B-1.预处理源代码文件的文本内容;B-2.对该文本内容进行词法分析,以获取文本的标识信息;B-3.根据词法分析得到的标识信息和源代码的语法规则,申请内存空间,生成源代码文本对应的抽象语法树节点信息,并构建其所对应的抽象语法树;所述抽象语法树节点信息包括:抽象语法树的节点类型信息,节点在源代码文件中所处位置信息,节点ID标号和节点对应Token标识符信息。 优选地,所述步骤C包括:调用深度优先遍历方法,以生成的抽象语法树根节点为起始节点遍历整棵语法树,根据节点的内容开辟内存空间,并将节点转存为所需要的类型,加入到节点列表中。优选地,所述步骤D包括:D-1.从系统随机生成的哈希数组中选取数组下标等于节点ID标号的元素值赋给节点的哈希字段;所述节点ID标号是系统在生成抽象语法树过程中分配的;D-2.累加每个节点中所有子节点的哈希值作为该节点的最终哈希值;D-3.对节点按其哈希值大小和子节点数目进行排序。优选地,所述步骤E包括:E-1.从节点列表中取出次序对应的节点,判读哈希值是否相等;若相等,则执行步骤E-9 ;若不等,执行下一步;E-2.删除节点的所有叶子节点,并将这些叶子节点加入到叶子节点列表,同时重新计算所述节点的哈希值;E-3.再次比对所述哈希值,若相等,执本文档来自技高网
...

【技术保护点】
一种检测软件抄袭的方法,该方法基于抽象语法树的剪枝比对算法,其特征在于:所述方法包括以下步骤:A.获取源代码文件;B.生成抽象语法树;C.遍历该抽象语法树,并将其转化为所需的存储类型;D.赋值抽象语法树的节点并排序;E.比对排序后的节点;F.输出结果。

【技术特征摘要】

【专利技术属性】
技术研发人员:刘楠崔宝江夏坤峰韩丽芳
申请(专利权)人:国家电网公司中国电力科学研究院北京邮电大学江苏省电力公司
类型:发明
国别省市:

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

1