程序代码相似度度量算法研究_邓爱萍
程序代码相似性检测在论文抄袭判定中的应用

根 据 O 年 年底 ,汤 森 路透 集 团发布 的报 告 《 9 全球 科研 报 告 : 中 国》 (lb lR sa c e ot h n )中称 ,近 年 来 ,中 国 G o a ee rh Rp r :C ia 的科 研 论文 数 量呈 爆炸 性 发 展 ,仅次 美 国 ,高 居 世界 第二 。而 与之 形 成鲜 明相 比的是 , 中国 论文 的 被 引用 率低 ,质量 不 高和 原 创性 内容不 多。这 一 矛盾 产 生 的主 要 原 因在 于 高校 论 文互 相抄 袭 的现 象 。 随着 网络 技 术 的 日益 普及 , 这股 学 术不 端 之 风更 深深 的 影 响 了在校 学 生 。学 术浮 夸 和 论文 抄 袭现 象 大量 的出 现在 应 届 学 生 的 毕业 论 文之 中 。现有 的学 术 不端 检测 系 统 主要 是 针对 文 字 的 检测 ,对纯 理 论 的论 文 的抄 袭 判 定 比较准 确 。但 是 与 文科 学 生不 同,理 工科 学 生 的 毕业 论文 中常会 引用 一定 数 量 的代 码 ,这 些代 码 的独 创 性 不被 判 断 。致 使 部 分 理工 科 毕业 生 在毕 业 论文 中大量 引用 代 码 , 以减 少文 字部 分 引用率 的百 分 比 。 了解 决这 个 问题 , 为 亟 需在 现 有 的学 生不 端 检测 系 统 中建 立针 对 理 工科 学 生 的程 序代 码相 似 性检 测模 块 。 研究 背景 程 序 代 码 相 似 性 的检 测 最 早 是 源 于 对 重 复 代 码 的检 测 和 对 代码 的优 化 。对 于程 序 代码 相 似 度 的度 量研 究 , 国外 起步 的 比较 早 , 相 关 的研 究 也 比较 多。 早 在 二 十 世 纪 七 十 年代 , 国外 就 有 学 者 开 始 研 究 检 测 代 码 相 似 性 的 理 论 ,和 基 于 理 论 构建 的检 测 系 统 。 目前 常 用 的 代码 检 测 技 术 有 两 类 : 一是 最 早 于 17 , 由 96 Pr u 大 学的 K J Ot nt i 提 出的基 于属 性计 数法 (t rb t u de . .t es en A t iu e Cu t n ) ;二 是 19 o n ig 96年 , 由 Vr o L和 W s J提 出的 基 e c K ie M 于 结构 度量 法 (tu tr er c ) J Sr cu eM t is 。
基于单词的源程序相似度度量方法

结合使用结构度量和属性计数技术 。 D o n a l d s o n
的抄袭 检测 系统[ 3 1 使用 了 8个属 性计 数法 中的属性 ,
同样是生成 了表示程序结构 的字符串 , 字符串中的 每个字母表示一个或多个程序的结构信息 , 如变量
声明、 赋值 语 句 和过 程 调用 等 。如果 生 成 的 字符 串
种算 法 比较这 些字 符 串 ,再 根据 比较 的结 果判 断两
和 Q完全相 同, 则相似性 s ( P , Q) = 1 。 程序代码的相似度与软件系统的相似度定义类
似。
个程序是否相似。 这种技术的难点有两个 , 一个是如
何 用 标 记字 符 串序列 表 示 程序 语 言 中的各 种 元 素 ,
符或操作数的数量、 所有操作符或操作数的总和 、 循 环 的数量 、 过程 的数量 、 代码行的数量 、 变量声 明和 使用的数量 、 控制语句的数量等 , 计算每两个 向量之 间的距离 ( 如欧几里德距离 ) , 若两个程序的特征 向 量之间的距离很小 , 就可 以认为这两个程序很相似。
1 . 2 程序代码 的相似度度量技术
另一个是选择一种合适 的字符串比较算法 。
K~
第1 步: 预处理。删除源程序中的注释语句 、 回 车、 多余 的空行和空格。
第 2步 : 单词 识 别 。 按 照 出现 的先后 顺序 识别 程 序 中的单词 , 包括 : 关 键字 、 变 量名 、 常量 名 、 运算 符 、 运算数 、 函数名 等 , 得到 构成 源程 序 的单词 序列 。 第 3步 : 计 算 编辑距 离 。 根据 两个 程序 的词 汇序 列, 基 于单 词 计算 编辑距 离 。 第 4步 : 求 最长 公 共子序 列 的长度 。 根 据两 个程
程序代码相似度度量研究的开题报告

程序代码相似度度量研究的开题报告一、研究背景和意义程序代码相似度度量是软件工程领域的一项重要问题,它可以用于代码重构、复杂度分析、代码复用等方面。
在软件开发过程中,代码相似度度量可以帮助程序员找到相似点和差异点,有助于更好地理解程序的结构和设计,还可以帮助学生和开发人员提高代码质量,从而提高软件开发效率和质量。
目前,市面上已经有很多代码相似度度量工具可供选择,但是这些工具大多基于字符、标记或者语法树的比较方法,往往不能很好地解决代码的语义相似度问题,而且时间复杂度高,处理大规模代码数据困难。
因此,研究如何快速、准确地衡量程序代码的语义相似度,具有很高的研究和应用价值。
二、研究目标和内容本课题的研究目标是:结合自然语言处理、机器学习等技术,设计一种能够准确、高效地度量程序代码相似度的方法,以提高程序开发效率和质量。
研究内容包括:1. 收集和预处理程序代码。
这一步包括获取开源代码、规范化和清理代码,以及将代码转换为可处理的格式。
2. 提取代码特征。
针对代码特有的语法结构和语义规则,设计合适的代码特征提取方法,将程序代码转换为特征向量。
3. 利用机器学习算法训练分类器。
根据分类问题的特点,选择合适的分类器进行训练和优化。
4. 应用训练好的分类器度量程序代码相似度。
对于给定的一对程序代码,用训练好的分类器计算它们之间的相似度得分。
5. 实验分析。
对比其他常见的代码相似度度量方法,分析新方法的优缺点,并针对不同应用场景进行实验测试,评估度量方法的准确性、效率和可拓展性。
三、研究方案和方法本课题借鉴了相关领域的研究方法和实践经验,主要采用以下方法和技术:1. 自然语言处理技术。
程序代码和自然语言都有类似的结构和规则,因此可以应用自然语言处理技术提取程序代码的语义特征。
例如通过词干提取、词向量化等方法将代码转换为向量表示,或通过句法分析、语义分析等方法提取更丰富的语义信息。
2. 机器学习算法。
基于特征向量的分类算法是程序代码相似度度量的常用方法,本课题将探究构建合适的特征向量和选择最优的分类器,例如支持向量机、随机森林、神经网络等。
程序代码相似度度量算法研究

常 用 的 属 性 计 数 法度 量 指 标
在属性计数技术中,有以下 6 个常用的代码相似度度量
1.2.1
点 阵 图 (dotplot) 法
点阵图 [5] 是一种视觉展示两个代码块 ( 或任意文本 ) 之间
指标, 被描述为一个 “6 元组” 向量。 (1)容量: 容量被认为是任何算法实现的大小的反映, 常使 用 Halstead 的软件科学度量方法来量化。该方法首先对程序 代码中的词元进行词频统计:1= 用到的操作符的种类数;2= 用到的操 作数的种 类数; 1= 出现 的所有操 作符总数 ; 2= 出 现的所有操作数总数。然后用如下公式计算程序容量 = 式中: = 汇量。 (2) 控制流:控制流常用 McCabe 提出的圈复杂度 (cyclomatic complexity) 来度量。圈复杂度是一种为程序逻辑复杂性 提供定量测度的软件度量方法,用于计算程序的基本的独立 路径数目。该方法首先将程序代码转换为一个带有惟一入口 和出口结点的控制流图。这种方法具有语言依赖性,这意味 着在创建控制流图前,必须理解编写代码的语言的语法和语 义。在程序控制流程图中,节点表示程序中一个顺序代码单 元,边表示程序中产生的分枝。一个有 条边和 个节点的控 制流图 G, 其圈复杂度定义为 = 其中: = 控制流图中的模块数。 (3) 结构: 这个度量标准考虑到使用一些指标去阐明模块 之间的耦合程度。 (4)数据依赖: 用与度量程序控制流相似的方法, 数据依赖 也能被度量。在流程图中,用结点来阐明谓词子句和变量定 义。Bieman 和 Debnath 建议用广义程序图 (generalised program graph, GPG) 的形式来表示。 (5)嵌套深度: 这是一个简单的度量标准, 通过赋给每个代 码行一个深度值,返回一个程序的平均嵌套深度。平均值是 由这些深度值的总和除以程序中语句的个数计算而来。 (6) 控制结构: 给出现在程序中的每一种类型的控制结构 赋予一个权值, 例如给一个 if...then 结构赋予权值 3, 所有权值 的总和常用来表示一个程序的复杂度。 +2 (2) log2 (1) 1+ 2——程序长度; = 1+ 2 ——程序所用的词
程序代码相似度检测技术的研究与实现

网络通讯及安全本栏目责任编辑:代影程序代码相似度检测技术的研究与实现卫军超,耿楠*(西北农林科技大学信息工程学院,陕西杨凌712100)摘要:针对传统相似度算法应用在程序设计课程作业检测中精度较低这一问题,通过研究最长公共子序列等算法,发现其优缺点,在分析的基础上,结合结构度量技术和属性技术两种技术,提出一种性能较好的程序相似度计算方法。
方法首先对源程序进行初步处理,将程序中的注释语句和空格删除,再次确定常用元素及常用结构,然后利用Lex 统计、抽取程序元素;利用开源代码ucc 生成语法树,之后抽取相应的语法结构;最后生成特征向量,并计算代码相似度。
实验结果表明该方法比最长公共子序列算法精度提高了10.6%。
关键词:属性计数法;结构度量技术;相似度度量中图分类号:TP311文献标志码:A 文章编号:1009-3044(2017)05-0039-02Research on and Application of Techniques of Test for Similarity of Program Codes WEI Jun-chao,GENG Nan *(College of Information Engineering Northwest A&F University,Yangling 712100,China)Abstract:To solve the problem of the low precision of testing for similarity of program codes in traditional ways,this thesis pro-poses an improved technique to make such a test on the combination of technology of attribute counting and that of structure cal-culation through studying and comparing several different methods of calculating the Longest Common Subsequence.Firstly,source program is processed primarily,annotation statements and spaces are deleted,and common elements and structures get confirmation;next,statistics are made by means of Lex,program elements are extracted,and abstract syntax trees get to be gen-erated using UCC;then,grammar structures are extracted;lastly,eigenvector is produced and the similarity can get calculated.The experimental result shows that the new method is 10.6percent more precise than those of calculating the Longest Common Subsequence.Key words:attribute counting;structure measurement;similarity measurement在程序设计课程教学中,尤其是在上机编程训练过程中,需要学生通过独立地编程练习来提高程序设计能力,然而实际的情况是部分学生存在不同程度地抄袭他人的作业。
一种C程序代码相似度检测方法

F福建电脑U J I A N C O M P U T E R福建电脑2018年第6期0 引言C 语言诞生于上世纪70年代,是嵌入式领域的主导语言,和汇编语言一起使用,功能强大,大型游戏软件也多是用C 语言开发,使用广泛。
在课程安排上,C 语言是作为入门的编程语言,辅助操作系统及其它相关课程的学习。
然而随着信息技术的发展,从互联网上获取程序代码资源越来越方便,有些同学直接在互联网上查找相关C 程序代码或者抄袭其他同学的程序代码,所以C 程序代码的相似度检测在编程语言教学中具有重大意义。
因为不同的编程语言的语法规则有许多差异,所以对于不同的编程语言的程序代码的相似度很难用一种统一的标准或方法来检测,本文提出了一种适用于C 程序代码的相似度检测方法。
1程序代码相似度检测的相关技术目前,国内外对于程序代码的相似度检测技术主要有结构度量和属性计数方法[1]。
结构度量技术主要是通过对程序代码的结构信息以及执行流程进行分析来检测两段程序代码的相似度,常选用的检测结构主要有分支结构、循环结构、条件结构和函数个数。
属性计数技术主要是通过处理程序代码的一些属性值,不考虑程序代码的语法结构,实现较为简单,常选用的属性主要有自定义变量个数、数组个数、运算符个数、关键字个数。
2 C 程序代码相似度检测方法设计本文提出的适用于C 程序代码的相度检测方法结合了结构度量和属性计数方法,利用正则表达式从一段C 程序代码中提取出特征向量,向量各元素就是C 程序代码中每一个特征词的个数,再用逆向文件频率方法对特征向量的每个元素进行加权处理,最后利用夹角余弦法对加权后的特征向量进行夹角计算,进而得出两段C 程序代码的相似度。
整个使用于C 程序的相似度检测方法的步骤如图所示。
3 C 程序代码特征向量的生成3.1C 程序代码的预处理对于一段C 程序代码,程序中的一些无关字符(如头文件、空格、空行、注释行等)会影响程序代码特征的提取,所以在程序代码特征提取之前,要先把这些与程序代码相似性无关的信息剔除,尽可能地屏蔽一些简单的抄袭手段对代码外观的影响。
程序代码相似度度量算法研究
c d l i i ii ot to ei e r ia t o s d ns poet rs T e oe i l i aue n e e cn lg oe a a s smp r n ry h i n ly ft et’ rjcwok. h d mi ry p g r m a tv ft o g i u c s a tme srme ts yt h oo y it k e h
程序代码相似度度量算法研究
邓爱 萍
( 南人 文科技 学院 计 算机 科 学技 术 系 ,湖 南 娄 底 4 7 0 ) 湖 10 0
摘 要 :代码 剽 窃是程序设 计课 程 中经常 出现 的一种 作弊行 为 ,检 测剽 窃的源代 码 、验证 学生程 序作 业的原创 性在教 学 中
很 重 要 。 序 代 码 的 相 似 度 度 量 是 剽 窃检 测 的 关 键 技 术 。 过 对 现 有 程 序 代 码 相 似 度 度 量 技 术 进 行 研 究后 , 于 K r— ai 程 通 基 a R bn p 和 最 长 公 共 子 串算 法 思 想 , 出 了一 种 改 进 的 源 代 码 相 似 度 度 量 算 法 , 串的 散 列 值 匹 配 算 法 。 提 即 关 键 词 : 代 码 ; 相 似 度 度 量 ; 剽 窃 检 测 ; 串 匹配 算 法 ; 散 使 用 属 性 计 数 法 的检 测 算 法 , 加 向量 96 对 增
维 数 并 不 能 改 善错 误 率 。改 进 属 性 计 数 法 的措 施 就 是 加 入 程 序 的 结 构 信 息 , 合 结 构 度 量 来 检 测 剽 窃 。Mc ae 出 的 圈 结 Cb 提
O 引 言
程 序 代 码 相 似 度 度 量 技 术 主 要 应 用 在 代 码 的剽 窃 检 测 上 。 判 断 一 个 程 序 是 否 是 从 另 一 个 程 序 复 制 而 米 ,实质 是 对这两个程序 的相似度进行度 量 , 根据 度 量 的结 果给 L 一 个 乜 相 似 度 的数 值 表 示 , 由这 个 数 值 判 断 这 两 个 程 序之 间 是 否 再
程序代码相似度检测技术的研究与实现
程序代码相似度检测技术的研究与实现作者:卫军超耿楠来源:《电脑知识与技术》2017年第05期摘要:针对传统相似度算法应用在程序设计课程作业检测中精度较低这一问题,通过研究最长公共子序列等算法,发现其优缺点,在分析的基础上,结合结构度量技术和属性技术两种技术,提出一种性能较好的程序相似度计算方法。
方法首先对源程序进行初步处理,将程序中的注释语句和空格删除,再次确定常用元素及常用结构,然后利用Lex统计、抽取程序元素;利用开源代码ucc生成语法树,之后抽取相应的语法结构;最后生成特征向量,并计算代码相似度。
实验结果表明该方法比最长公共子序列算法精度提高了10.6%。
关键词:属性计数法;结构度量技术;相似度度量中图分类号: TP311 文献标志码: A 文章编号:1009-3044(2017)05-0039-02Abstract: To solve the problem of the low precision of testing for similarity of program codes in traditional ways, this thesis proposes an improved technique to make such a test on the combination of technology of attribute counting and that of structure calculation through studying and comparing several different methods of calculating the Longest Common Subsequence. Firstly,source program is processed primarily, annotation statements and spaces are deleted, and common elements and structures get confirmation; next, statistics are made by means of Lex, program elements are extracted, and abstract syntax trees get to be generated using UCC; then, grammar structures are extracted; lastly, eigenvector is produced and the similarity can get calculated. The experimental result shows that the new method is 10.6 percent more precise than those of calculating the Longest Common Subsequence.Key words: attribute counting; structure measurement; similarity measurement在程序设计课程教学中,尤其是在上机编程训练过程中,需要学生通过独立地编程练习来提高程序设计能力,然而实际的情况是部分学生存在不同程度地抄袭他人的作业。
程序代码相似度检测方法的设计与实现
程序代码相似度检测方法的设计与实现计算机程序代码相似度检测是指利用计算机技术,对两段程序代码进行比较,以从中提取其中的相似性,从而对源程序时间消耗、运行结果做统计把握,用来编写更加高效的程序,有助于加快程序的开发周期,也可以检测两程序是否怀疑“抄袭”或者根据其标准检测出程序代码质量的好坏。
本文讨论的是程序代码相似度检测方法的设计与实现。
程序代码相似度检测的核心思想时对比比较,既然需要比较,那么就要从把程序代码变形为其他形式开始分析。
一般程序语言都具有反汇编的功能,可以将源代码转换为汇编代码。
然后在汇编代码的基础上,再将其转化为由标记组成的字符串。
经过这个变形,我们就可以通过对比比较,寻求两个程序代码之间的相似性,比如比较共同出现的标记,出现次数以及位置等等。
在介绍如何实现程序代码相似度检测之前,先介绍一下两个程序代码之间相似度检测时,必须考虑的要素:(1)选择一种合适的比较方式,有时采用字符串比较,有时采用词语比较,有时采用句子比较。
(2)考虑判断标准,一般有按照比较粒度的大小、相似度的分数(一般使用0-1浮点数来标识),评分越高,说明相似度越大。
(3)考虑比较程序的耗时,一般性的比较会消耗的时间较长。
根据上面的要素,我们可以将程序代码相似度检测实现的思路总结如下:(1)先将源代码转换为机器语句,从而形成一段机器语句包括标记。
(2)在机器语句上,采用一定的比较方式,如字符串比较,词汇比较等,进行比较,并根据不同比较粒度和标准,得出两个比较程序的相似度分数,该分数可以参考拟定出程序的质量,或者用于进行嫌疑程序的抄袭检测。
(3)记录比较过程所耗费的时间,以及相似度检测得分,并将比较结果反馈给用户。
以上是程序代码相似度检测方法设计及实现方面的一些讨论。
通过从获取源程序,到变形比较,再到考虑检测用时,不断根据细致设计,可以有效的检测出两程序之间的相似度,同时也可以作为代码质量的参考依据,从而减少源程序的时间消耗,同时也可以加快程序的开发周期,有助于提升软件的品质。
一种程序源代码相似度度量方法
知识 产权保护 】 、软件复 用 等方面的 目的 。
程序相似度度量 的主要难 点在于 C程序语言 的结构性特
点 以及逻辑表达形 式的多样性 。文献[】 5指出 ,在不影响程序
结果 的前提下 ,程序 更改手段可 分为 :() 1逐字拷贝 ;() 2更改 注释语 ;() 3更改 空白区域 ;() 4重新命 名标识符 ;() 5改变代 码块 的顺序 ;() 6改变代 码块中语句 的顺序 ; 7改变表达式 中 () 操作符和操作数 的顺序 ;() 8更改数据 类型 ; 9增加冗余 的语 () 句和变量 ;(o 用等价 的控制结构 替换原有控制结 构。可以 1) 看出 ,这些更改手段都是表 面且 少量 的 ,程序 内含 的属性和 结构其实没有 发生变化 。在 大多数程 序代码相似程度度量的 研究 中,都存在 度量精 度不高或时间开销大等 问题 。为此 , 本 文 提 出一 种 程 序 源 代 码 相 似 度 度 量 方法 。
lng a e s u c o e b sn e di ii f f n t n s o e t e r l s n r a ie s u c o e Th e e a e o e e u n e i c lult d Ha h a u g o r e c d , y u i g t v son o u c i c p , h e o m lz o r e c d . e g n r td T k n s q e c s a c ae s h o u
v l e I s s t e Ha h v l e m ac i g ag rt m o me s r e p o r m o c o e smia i .E pe i n a e u t h w ha h c ur c f a u . tu e s a u t h n l o i h h t a u e t r g a s ur e c d i l t h r y x rme t lr s ls s o t tt e a c a y o
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4)数据依赖:用与度量程序控制流相似的方法,数据依赖 也 能 被 度 量 。 在 流 程 图 中 ,用 结 点 来 阐 明 谓 词 子 句 和 变 量 定
义。Bieman 和 Debnath 建议用广义程序图(generalised program graph,GPG) 的 形 式 来 表 示 。
1 程序代码相似度度量技术
早在 20 世纪 70 年代初,就有学者研究阻止大规模拷贝程 序 的 技 术 和 软 件 ,出 现 了 一 批 比 较 典 型 的 程 序 源 代 码 剽 窃 检 测系统[1-4]。Halstead 提出的软件科学度量方法是最早和最典型 的属性计数法。Halstead 度量方法以程序中出现的操作符和操 作 数 为 计 数 对 象 ,以 它 们 的 出 现 次 数 作 为 计 数 目 标 来 计 算 程 序容量和工作量。Rottenstone 在 1976 年首次将 Halstead 的软 件科学度量方法投入应用,实现了第一个针对于 Fortran 代码 的 剽 窃 检 测 系 统 。 但 是 ,单 纯 的 属 性 计 数 法 抛 弃 了 太 多 的 程 序结构信息,导致检测结果的错误率太高。Verso 和 Wise 在
×
1, 2 = 1
2
=1
(3)
2
2
1.2 结 构 度 量 技 术
=1
=1
采 用 结 构 度 量 技 术 的 剽 窃 检 测 系 统 中 ,通 过 对 程 序 的 内
部 结 构 进 行 分 析 比 较 来 判 断 两 段 程 序 代 码 的 相 似 性 。结 构 度
量 技 术 中 使 用 的 相 似 度 度 量 方 法 主 要 有 :点 阵 图 法 、Levensh-
路 径 数 目 。该 方 法 首 先 将 程 序 代 码 转 换 为 一 个 带 有 惟 一 入 口
和 出 口 结 点 的 控 制 流 图 。 这 种 方 法 具 有 语 言 依 赖 性 ,这 意 味
着 在 创 建 控 制 流 图 前 ,必 须 理 解 编 写 代 码 的 语 言 的 语 法 和 语
Study on similarity measurement of program code
DENG Ai-ping (Department of Computer Science, Hunan Institute of Humanitles, Science and Technology, Loudi 417000, China)
tein 距离、最长公共子序列法、最长公共子串法。
1.2.1 点 阵 图 (dotplot)法 点阵图 [5] 是一种视觉展示两个代码块 (或任意文本) 之间
字 符 串 匹 配 模 式 的 技 术 。 重 要 的 是 ,点 阵 图 不 是 一 种 特 定 的
语 言 ,因 此 它 不 要 求 了 解 被 比 较 的 代 码 的 语 法 和 语 义 。 这 一
1996 年指出,对于仅仅使用属性计数法的检测算法,增加向量 维数并不能改善错误率。改进属性计数法的措施就是加入程 序的结构信息,结合结构度量来检测剽窃。McCabe 提出的圈 复杂度方法是一种典型的结构度量法。它通过计算执行路径 的数量来衡量一个程序中的控制流。圈复杂度只给出了程序 的 一 个 结 构 特 征 即 控 制 流 ,往 往 需 要 与 其 它 特 征 结 合 使 用 ,因 此常作为属性计数法中的一个度量指标。其它的结构度量法 还有分析控制结构、计算代码嵌套深度、分析数据依赖关系等。 在实际应用中,很多代码剽窃检测系统将两种度量方法相结 合。Donaldson et al.开发的 ACCUSE 系统结合属性计数法和结 构度量法来实现对 Fortran 程序代码的剽窃检测。最近提出的 系统大都是通过对表达源程序结构的字符串进行比较来达到 剽窃检测的目的,如:Plague, JPlag, SIM, MOSS,YAP 系列等。
程 是 :首 先 ,选 择 两 个 程 序 并 将 其 处 理 为 标 记 序 列 ;然 后 连 接
这 两 个 序 列 ;最 后 对 生 成 的 序 列 进 行 自 我 比 较 。
第 29 卷 第 17 期 Vol. 29 No. 17
计算机工程与设计
Computer Engineering and Design
2008 年 9 月 Sept. 2008
程序代码相似度度量算法研究
邓爱萍 (湖南人文科技学院 计算机科学技术系,湖南 娄底 417000)
摘 要:代 码剽窃是程序设 计课程中经常 出现的一种作弊 行为,检测剽窃的源代 码、验 证学生程序作业 的原创性在教 学中 很重 要。程序代码的 相似度度量是 剽窃检测的关键 技术。通过对 现有程序代码相 似度度量技术进 行研究后,基于 Karp-Rabin 和最 长公共子串算法 思想,提出了一 种改进的源代码 相似度度量算 法,即串的散列值 匹配算法。 关键 词:源代码; 相 似度度量; 剽窃 检测; 串匹配算 法; 散列值匹 配 中图 法分类号:TP311.52 文献标 识码:A 文 章编号:1000-7024 (2008) 17-4636-04
收稿日期:2007-09-16 E-mail:ld_dengaiping@ 作者简介:邓爱萍 (1977-),女,湖南涟源人,硕士,讲师,研究方向为计算机辅助教育技术。
- 4636 -
的软件度量指标,以便于将程序映射到一个 n 维的笛卡尔空 间 ,然 后 利 用 向 量 空 间 模 型 来 度 量 程 序 代 码 相 似 性 。
(5)嵌套深度:这是一个简单的度量标准,通过赋给每个代 码 行 一 个 深 度 值 ,返 回 一 个 程 序 的 平 均 嵌 套 深 度 。 平 均 值 是
由这些深度值的总和除以程序中语句的个数计算而来。
(6) 控 制 结 构 :给 出 现 在 程 序 中 的 每 一 种 类 型 的 控 制 结 构 赋予一个权值,例如给一个 if...then 结构赋予权值 3,所有权值 的总和常用来表示一个程序的复杂度。
式中: = 汇量。
= log2 1+ 2——程序长度; =
(1) 1+ 2 ——程序所用的词
(2) 控制流:控制流常用 McCabe 提出的圈复杂度 (cyclomatic complexity)来度量。圈复杂度是一种为程序逻辑复杂性 提 供 定 量 测 度 的 软 件 度 量 方 法 ,用 于 计 算 程 序 的 基 本 的 独 立
综 上 所 述 ,应 用 于 程 序 代 码 剽 窃 检 测 系 统 中 的 代 码 相 似 度 度 量 方 法 可 分 成 两 类 :属 性 计 数 技 术 和 结 构 度 量 技 术 。 1.1 属 性 计 数 技 术
在剽窃检测算法的发展过程中,大多数工作集中在 Halstead 的软件科学理论。这些基于软件科学度量的算法是从程 序中提取出数个软件度量特征,计算每一个程序的 n 个不同
义 。 在 程 序 控 制 流 程 图 中 ,节 点 表 示 程 序 中 一 个 顺 序 代 码 单
元,边表示程序中产生的分枝。一个有 条边和 个节点的控
制流图 G,其圈复杂度定义为
= +2
(2)
其中: = 控制流图中的模块数。 (3) 结 构 :这 个 度 量 标 准 考 虑 到 使 用 一 些 指 标 去 阐 明 模 块
另外,Faith 和 Robinson 提出使用 24 个分量来评估代码的 相似程度,前 10 个是主要针对初学者的低级的剽窃,其它的 用于有经验的剽窃;Jankowitz 方法通过对代码中的主程序和 方 法 进 行 语 法 分 析 ,得 到 静 态 执 行 树 ,用 于 对 代 码 的 分 析 等 。
点使得点阵图法具有很大的灵活性。
点阵图的主要优势是它依赖于人的视觉系统去检测相似
模 式 。然 而 ,简 单 的 用 人 眼 去 揭 露 剽 窃 ,如 何 量 化 每 个 比 较 结
果 的 问 题 成 为 了 点 阵 图 的 主 要 缺 点 。它 意 味 着 解 释 一 个 人 复
制 了 多 少 别 人 的 代 码 将 不 能 由 值 来 表 示 。点 阵 图 法 的 操 作 过
Abstract:Code plagiarism is one kind of cheat behavior, which appears frequently in the programming curriculum. Detection of source code plagiarism is important to verify the originality of students’ project works. The code similarity measurement is the key technology in the plagiarizing detection. The similarity measurement of program code is studied first, then the string’s hash value matching arithmetic which based on Karp-Rabin and longest common substring algorithm is provided, and the results show the improved arithmetic is effective. Key words:source code; similarity measure; plagiarism detection; string matching arithmetic; hash value matching
1.1.1 常 用 的 属 性 计 数 法度 量 指 标 在属性计数技术中,有以下 6 个常用的代码相似度度量
指标,被描述为一个“6 元组”向量。 (1)容量:容量被认为是任何算法实现的大小的反映,常使