【VB开源代码栏目提醒】:网学会员在VB开源代码频道为大家收集整理了“程序代码相似度识别的研究 - 其它论文“提供大家参考,希望对大家有所帮助!
内蒙古师范大学 硕士学位
论文程序
代码相似度识别的研究 级别:硕士 专业:教育技术学 指导教师:刘东升 20060615 中文摘要 程序
代码相似度识别是利用一定的检测手段度量两个程序
代码间的相似程度。
本文着重于C语言源程序相似度的识别,重点介绍了程序
代码相似度获取的理论依据和技术支持、本设计的各功能模块和具体实施及实验测试。
本文采用属性计数和结构度量相结合的方法来识别相似度,提高识别的精度和效率。
属性计数统计程序的Halstead属性(总的标识符数、唯一标识符数、程序的容量)、物理属性(行数、词数、字符数)和混合属性(Halstead属性+物理属性),获取属性相似度。
结构度量利用最长公共子序列算法,计算两个程序的顺序(从上到下,从左到右)的标识符集的最长的严格递增的公共标识符子序列的最优值(长度)并构造最长公共标识符子序列,获取结构相似度。
本设计能够实现对输入程序
代码相似度的自动获取,供教师对学生程序设计的完成和内容的掌握情况进行分析,以促进教学的开展和评价的科学性。
也可以将其应用在程序复制检测和检测合作学习的效果等相关研究领域中。
程序输出简单明了并可以作为
文档保存,且具有较好的精确度。
由于程序的运行只需要源程序设计语言的标识符数据库,很容易实现语言的移植。
论文最后,简单阐述了本研究取得的结论以及本人对研究继续进行的几点建议。
关键词:属性计数,结构度量,程序
代码相似度 ABSTRACT Identi劬ng program code simil撕够is to measure siIllilar degree bet、Ⅳeen t、)lro pr0班n codes wim a k抽d of detection mem()d.Ide确聊ng t11e sirnil撕白r of C pro掣anlI珀【ing language source codes are focused on i11 this也esis.The meory fblulda_tion,tecllnolo酬suppofti芏lg alld expedment test of making siIIlil撕够a11d eve巧向nction module aIld concrete inlplemem of this project are mainly in们duced. Using t圭1e combined me也od of a心bute coun缸g and strLlcture metrics to idem姆similar时can improve me precision a11d emciency of detection.At晡bute coum堍counts Halstead profile(i11cluding number of tokenoccu玎ences,number of unique tokens,HalStead Volume),physical pro矗1e∞cludillg liIle cou芏1t,word count,character count),composite profile僻1ysical+Halstead prome)aIld can obtain廿le a艇bute sirnil撕够.S蜘cturemetrics whjch usmg也e 10ngest common subsequence algorimm calculatesme optimized value(1eng出)of也e 10ngest,strictly incrementaI,commontoken subsequence of me ordered token sets accord油g to也e top—to-bottomorder of me statements a11d me lef【一to-right order of tlle code lille of twoprograms a11d constn】cts廿1e 10ngest cor啪on token subsequence of t、voprograms can ob诅ins the strIlctLIre simila五锣.111is project can automaticallyachieVe the code simil撕t)r of input pm蚪ns.Teacher call aIlalyses me协mgof student’s finishing t王1e pro笋删ng assi印ment and hOldmg onprogr猢ing contents with me simila矗妙of progmm code,which canpromote the development of teachillg and t11e validity of evalu撕ng.Si面larity of program code can also be印plied in也e rel曲ed research fields,such as prog日m copy detection and detectir培the effect of cOoperativeleam.mg.Pmgram’s ou:lput is simple aIld u11derstandable easily aIld call besaved as documents.This project haS 900d precision.Since tlle n11111ing ofprogmm only require me token database 0f source pro目a妇m证g language,itis easy to transpl如t to other prograI珊mg language. In me end,吐le conclusion of t呈1is research and some suggestions ofcominuing me research arc simply discussed.皿YWoRDS:A蜘bute account,S咖咖re metrics,Program code siIIlilari够 图表公式目录图卜1程序更改谱系图(Faidhi and Robinson)…………………………l图4—1本设计功能模块图………………………………………………30图4—2程序界面…………………………………………………………31图4—3属性统计模块流程图……………………………………………32图4—4程序对比较窗口…………………………………………………38图5一l源程序TESTl……………………………………………………40图5—2修改后程序TEST2…………………………………………………40图5—3三种属性相似度时间序列趋势线………………………………41图5—4结构相似度的分布拟合曲线……………………………………43表3一l程序的三种属性………………………………………………23表5一l TESTl和TEST2相似度统计……………………………………39表5—2 stackl2和TESTl相似度统计………………………………………39表5—3各属性相似度值最大的十个……………………………………42表5—4各属性相似度值最小的十个……………………………………43公式2一l…………………………………………………………………12公式2—2……………………………………………………………………12公式3—1……………………………………………………………………22公式3—2……………………………………………………………………24公式3—3……………………………………………………………………24公式3—4……………………………………………………………………24公式3—5……………………………………………………………………25公式3—6……………………………………………………………………28 内蒙古师范大学硕士学位
论文 第一章引言一、问题的提出 程序
代码相似度识别是一个模式匹配问题。
一种程序语言,对于同一逻辑的表达形式往往是多样的。
还有可能一些人为了节省时间和力气,将别人的程序采用编辑手段,作一些文本的改交(简单的改变如改变
代码注释或改变变量名,稍复杂一些如等价控制结构的替换(如用‘Ⅵ11ile”循环替换“for”循环))。
1987年Faidlli and Robillson提出了程序更改谱系图…,列出了可能采取的更改手段及档次划分。
谱系图如下: 图卜l程序更改谱系图(Faidhi and R。
binson) 2001年EdⅥ耐L.Jones将更改手段(在不影响结果的情况下)重新总结,分为如下十类Ⅲ: ①逐字拷贝 ②更改注释语句 ③更改空白区域 ④重新命名标识符 ⑤改变
代码块的顺序 ⑥改变
代码块中语句的顺序 ⑦改变表达式中操作符和操作数的顺序 ⑧更改数据类型 程序代玛相似度识别的研究 ⑨增加冗余的语句和变量 ⑩用等价的控制结构替换原有控制结构 可以肯定的说,这些更改都是表面的,是少量的,而程序中内含的属性和结构是没有改变的。
我们所说的程序的属性“1,就是根据程序的内在性质所定义的不随表达形式而变化的特性。
一般来说,这些属性不易被改变,即使改变也是少数的。
程序的结构代表了问题解决的逻辑和步骤,即使程序的属性可以做微弱的改动,但解决
问题的逻辑即程序的结构是不会发生改变的。
所以这样的程序具有内在的相似性。
我们可以统计程序的属性特征,获取程序属性相似度值;对结构特征进行分析,进而获取结构相似度值。
当需要判别若干个程序的相似度时,在它们之问进行两两组合计算相似度值。
二、研究的目的和意义 在高等院校里,程序设计实习类课程,与基础理论课不同,其实践性很强,培养的是学生的实际动手能力。
因此主要依靠期中、期末的笔试来考核学生学习情况和评定成绩,显然是不可取的。
平时上机作业的完成情况,应该在成绩评定中占50%甚至更高的比例。
这已经成为目前许多高校计算机类专业的共识“1。
c语言以其结构化、数据类型丰富等特点,被广泛用于教学中。
许多计算机专业
课程(如数据结构,操作系统,编译原理,
计算机网络)多采用C语言举例和描述算法。
学生在
学习这些课程时,也采用C语言编程。
而且有些高校把C语言作为各专业学生程序设计能力培养的入门语言。
因此,在本研究中主要关注C语言程序设计上机作业,对学生程序作业
代码相似度进行识别。
获取相似度值,供教师对学生程序设计的完成和内容的掌握情况进行分析,以促进教学的开展和评价的科学性。
也可以将其应用在相关研究领域,如:程序复制检测和检测合作学习的效果中,具有很好的教育教学效果。
基于此我定了该内容作为
毕业设计的题目。
三、本研究中的概念 相似度(sim钉a—t)r):本研究认为相似度是指,利用一定的检测方法度量两个对象间的相似程度。
主要有文本相似度和程序
代码相似度,一般情况下用一个数值 (O.O—1.O)或百分比值(O%一loo%)来表示。
用其来标识两个文本或程序间的相似程度,进而检测出相似文本或相似程序。
本研究是基于以上概念,根据程序
代码相似度识别的策略得出程序对的相似度 内蒙古师范大学顶士学位
论文 值,具体其在相关研究领域的应用,有待于实验的进一步验证。
四、开发工具的选择 (1)系统环境 基于现有的开发条件以及技术环境,本设计采用的是啪OwsⅪ·操作系统环 境。
(2)前台开发语言 Micms诅ⅥsI谢BaSic具有可视化的设计平台,面向对象的
设计方法,事件驱动 的编程机制,充分利用Windows资源,开放的数据库功能与网络支持等特点,是众 多wifldows软件开发工具中效率最高的一个。
此外,由于Ⅶ使用的是unicode字符集,汉字和字符所占存储空间相同,极大地方便了程序文件的访问。
因此我选择Ⅵsual B蠲ic作为开发语言。
(3)数据库 Microsoft Access 2003是完全面向对象、采用事件驱动机制的关系型桌面数据库系统,是面向数据库最终用户和数据库开发人员,典型的开放式数据库
管理系统。
它内置了大量的函数,提供了许多宏;支持多媒体的应用与开发,具有基于web的智能管理功能,符合个人
网络用户的需求;提供了删L的支持,具有很强的安全性。
因此我选择使用Access 2003作为后台数据库支持。
五、
论文主要内容概述 引言部分介绍了本研究问题的提出及研究的目的和意义,进而阐述了文中涉及的概念和开发工具的选择。
第二章首先介绍了程序可测量的属性,为属性计数的实施奠定了理论基础。
然后以时问为序详细列举了程序
代码相似度识别的工具和技术,并进行比较研究,确定本设计采取的技术
方案。
最后简单介绍了vB与数据库结合的操作技术,为程序的设计和理解作了铺垫。
第三章详细介绍了本设计的理论基础,包括C语言程序的特征分析及属性和结构相似度获取的理论依据。
第四章详细介绍了本设计的实旌过程,包括数据库的搭建及各功能模块的设计和实施。
第五章介绍了本设计的实验测试和数据分析。
第六章总结了本研究的主要成果,并提出了继续开发的几点建议及将来要继续完成的工作。
程序
代码相似度识别的研究 第二章程序可测量的属性及相关研究一、程序可测量的属性1.1程序的操作符和操作数 M.Halstead81认为,对于用任何语言所编写的程序,能够识别出所有的操作数,即编程时用到的变量或常量:同样也能够识别出所有的操作符,即影响操作数的值或顺序的符号或符号组合。
通过操作符和操作数的识别,可以定义任何语言所编程序中出现的许多可计数因此也可测量的实体。
这些属性是能够获得软件科学关系的最基本的度量值。
任何计算机程序能够被统计或测量的属性包括: n l:程序中唯一的操作符数 n 2;程序中唯一的操作数数 N,:程序中总的操作符数 N2:程序中总的操作数数 从基本的度量值很容易得到程序的词汇数:n=n l+n 2 以及程序的长度:N=Nl+N21.2程序的大小 程序的另一个重要特征是程序大小。
1。
任何时候将指定的程序由~种语言翻译成另一种语言,它的大小都会改变。
我们要以量化的方式研究这种改变,要求程序大小是一个可测量的量。
而且,程序大小的度量值在不失普遍性和客观性的情况下能够应用于任何语言。
因此,它应该独立于实现算法的字符集。
在任何情况下对于要表示的最长的操作符或操作数名,如果用二进制数或位表示的话有一个绝对的最小长度。
该长度依赖于词汇(H)中的元素数。
例如,~个由8个不同元素构成的词需要8个不同的字符,或者是由三个二进制位所构成的组合数。
更普遍来说,lo&n是一个程序中所用到的单个元素的最小位长。
任何程序大小的合适的度量值称为容量(V),定义如下:V=N lo盘n,其中N 内蒙古师范大学硕士学位
论文是
程序长度(或Nl+N2),n是程序词汇(或n I+n 2)。
这种解释给了程序容量以位的维度定义。
显然,如果一个程序由一种语言翻译成另一种语言,它的容量会改变。
例如,由Fortran翻译成一种特定机器的机器语言,容量会增加;另一方面,把一个程序算法用 另一种更高级的语言编写,容量将会减小。
利用程序的可测量的属性,可以度量程序间的相似程度。
二、相关研究 相似度的识别分为两大类,程序
代码相似度和文本相似度的识别。
文本相似度识别主要应用在文本挖掘、文本分类、文本复制检测、信息检索等方面,在这里不做具体介绍。
代码相似度主要应用在程序复制检测上,因此
代码相似度识别技术的发展是随着程序复制检铡技术的发展而发展的。
除了逐字拷贝的情况,我们使用直接比较两个程序文本文件字符串的方法来确定相似度的策略,效率非常低,目前学术界并没有标准的相似度计算策略。
最早在20世纪70年代初”3就有学者研究识别程序
代码相似度的技术和
软件。
O讹nsteill…在1976年首次提出了基于属性计数法(a仕曲u_te coumillg)获取相似度的方法。
但是,单纯的属性计数法抛弃了太多的程序结构信息,导致错误率太高。
verco和wise”1在1996年指出,对于仅仅使用属性计数法的检测算法,增加向量维数并不能改善错误率。
改进属性计数法的措施就是加入程序的结构信息,结合结构度量(stmcture metrics,也称为控制流(con缸D1.now))来识别相似度。
近来,程序
代码相似度的识别都是用各种方法综合属性计数和程序结构度量。
最近,出现了从程序设计的角度进行度量的方法。
此外,还有人提出用神经网络来检测程序的相似度“。
。
下面以时间为序,对国内外程序
代码相似度识别的技术介绍如下:2.1国外的研究情况2.1.1 An Algorithmic Approach to the Detection and PreventiOn of Plagia—sm—— 1976 首次使用HaI如ad的程序度量方法进行程序相似度识别的是Purdue大学的Otcellsteill,它开发一个用来检测Fortran程序相似度的系统”3。
该
系统直接统计M.Halstead提出的可以衡量程序长度的四个基本的软件科学参数:n I,n 2,Nl,N2。
程序
代码相似度识别的研究 Ottenstein认为两个程序具有相同的四个属性值的可能性是非常小的,如果两个程序 的四个属性都相同,就可以认为有相似的可能,使用者可以作进一步的调查。
然而, 实践证明,对于结构化程序设计语言所编制的程序来说,却不尽然。
2.1.2 Accuse‘——1 981 Accuse“”由uSAF学院的S锄GTier开发,采用七个参数来分析两个程序的相似度(设计者认为考察的参数越多,两个程序的区别越大),通过相似度分析值使用者可以对两个程序做进一步的判断。
七个参数为:①唯一的操作符数②唯一的操作数数③总的操作符数④总的操作数数⑤
代码行数⑥已经定义了的变量数(使用过 的)⑦总的控制语句数。
属性相似度的计算涉及增量的计算,公式为:incremenF”importancevalue”一(pco衄ta.pcotultb),其中pco硼l扭是第一个程序该属性的个数,pco硼曲是第二个程序该属性的个数。
如果pcolltl协pcolIntb小于或等于根据该参数确定的”、Ⅳindow”值(窗口大小,参数不同,取值不同,由使用者确定),接下来可以进行相似度计算。
im口ortallce value是该属性的重要度值,即权值(由使用者根据具体问题而定),增量得到后,可以由此计算相似度值(公式未公布)。
Accuse的输出为五个表:1)、需要统计的20个属性的名称和统计值;2)、与计算相似度有关的7个属性名称和统计值;3)、相似度值列表;4)、有同样相似度值的程序对的频率分布图;5)、所有相似度值大于或等于28的程序对名称。
属性计数的方法抛弃了太多的程序结构信息,导致错误率太高。
因此人们开始了由属性计数向控制流(结构度量)技术或两者结合技术的转变。
2.13 A PLAGIARISM DETECTIoN SYST口Ⅵ——1981 该系统。
”由BowliI培Green州立大学的John L.Do玎laldson,Ann_Marie LancaStcrand P肌1a H.sposato使用sNOBOL4程序设计语言联合开发,利用属性计数和结构度量方法结合,来检测FOR豫AN,cOBOL或BAsIc语言所编制的程序的相似度。
该系统以FORTRAN为例,将程序的分析分为两个阶段。
第一个阶段:数据收集阶段。
首先,源程序被逐行读进系统时,某些类型的语句(变量、子程序、输入语句、条件语句、循环语句、赋值语句、调用子程序的语句)在程序中出现的次数及第2.7类型的总数被统计并将其放进二维数组中供第二阶段使用。
其次,在上面的处理过程中,将源程序按其语句出现的顺序进行特征化。
程序中 6 内蒙古师范大学硕士学位
论文 某些语句类型对描述程序的结构非常重要,将这些类型中的每一种用一个字母代表。
按程序语句自顶向下和
代码行从左向右的顺序构造字母存放在一个一维数组中,供第 二阶段使用。
这些语句及字母对应如下:V_一声明语句,S一子程序或函数定义,C一调用或执行语句,R__喾语句,I—口删Do语句,Ⅺ一逻辑IF语句,H-WHmEDO语句,D—DO L00P语句,E~END IF,END wHILE或cONTrM鹰语句,=赋值语句。
第二阶段,数据分析阶段仍分两步完成。
首先,比较两个程序得到的二维数组对应的统计个数值(三种方法)来决定程序的相似或不同。
其中之一为:wEIGHTEDcOUNT OF sIMILA融TY。
使用者首先为程序中的语句确定权值,然后将两个程序中确定的语句的统计个数相减,如果相等,就将其权值累加,如果不等什么也不做。
如果最后得到的权值和很大,而其他较多数程序对的权值和都很小,就说明这两个程序有相似的可能。
其次,比较两个程序得到的一维数组的语句顺序是否相同。
在前一阶段,权值和很大的情况下,若语句顺序也相同,也就是说程序的基本结构相同,就可以认为这两个程序为相似程序。
2.1.4 Plague——1988 Plague(瘟疫)““,这样的名称警示人们抄袭的蔓延和危害。
它继续使用程序的结构度量的检测方法,且对更详细的结构信息进行比较。
Plaglle工作分为三个阶段: 第一个阶段:创建每一个文件的标识符序列和结构度量列表构成程序的结构特征。
结构度量包括程序中所使用的结构,如:循环,选择结构及语句块。
结构特征采用了归纳的规则表达式的形式。
‘第二阶段:比较结构特征(o(n2)次),使用语言细节距离函数的结合得到最邻近的程序对。
预期大多数程序都是不相邻的,如果有程序对是相邻的,将其留到下一个阶段进行处理。
第三阶段,使用最长公共子序列算法的变体对标识符序列进行比较。
Plague的缺陷包括: (1)Plague方法不适合其他语言(仅可以用于Pascal,Prolo舀Bourne SheH andu衄a程序),且耗费时间太多。
程序
代码相似度识别的研究 (2)Plague的结果是两列按H和HT索引排序的
列表,需要作进一步的解释,不能做到一目了然。
PIagLIe手册对如何解释提供了指南。
(3)Plague执行效率不高,又依赖于太多的uNⅨ工具,因此在可移植性方面存在问题。
2.1.5 YAPl、矾心2和YAP3—一i992,1996 Ⅵ谨(代表又一个Plague)系列工具是在P1ague的基础上开发的。
Michael wise在1992年开发YAP的第一个版本Ⅵ”1“”,之后推出改进版靴m1,最后在1996年推出最终版YAP3““。
Ⅵ垤1和Ⅵ婶2主要用于程序复制检测,而嘲P3即可以用于程序也可以用于文本
文档检测。
所有的YAP系统以同样的方式
工作,操作分为两个阶段: 第一阶段由每一源程序生成标识符文件; 第二阶段比较标识符文件对。
文件中的标识符具有重要的意义,代表了程序设计语言的语言结构或库函数,忽略常量和用户定义的标识符。
一个小的程序
作业通常可能有100—500个而一个大的程序可能有400—700个。
尽管对每一种语言是分别进行标识符化的,但它们的执行步骤相同: (1)程序作业预处理: ●删除注释和输出语句 ●删除用于自定义标识符中的非法字母 ●将大写字母转换为小写字母 ●形成原始标识符列表 这步工作是由uNⅨ工具订和sed来做的。
在tYAP中使用了c预处理程序cpp。
(2)转变某些同义词为
常用形式。
例如:在c—YAP中,将s咖cmp映射为s骶mp。
这样的操作类似于将词映射到它们的上位词中。
(3)找出函数/过程语句块。
在LISP YAP中这一步无需太多的精力,而在c YAP中结合使用了I矾Ⅸ工具ctags和awk。
(4)按调用顺序展开函数块。
重复的函数块仅被展开一次,随后对该函数的调用用一个有序的标识符替代,这样可以禁止标识符个数的无限膨胀。
(5)根据给定的词汇表,从程序作业中找出要标识符化的部分。
上面阶段己识别的函数调用映射为标识符FuN,用户自定义标识符被忽略。
在比较阶段,用IJNⅨ实用工具fmd收集前面准备好的标识符文件,用sdi嗣两比 内蒙古师范大学硕士.