首发于我的gitpages博客 https://helenawang.github.io/2018/10/10/代码相似度计算框架调研

代码相似度计算框架调研

研究现状

代码相似度计算是一个已有40年研究历史的问题了。它的应用范围广泛,主要包括代码抄袭检测[3]、软件维护中的相似代码查找等。
Whale[1]于1988年首次提出一个代码相似性检测的通用框架和步骤,将检测过程分为以下两个阶段:

代码格式转换 + 相似度确定

后来很多检测方法都参考这一框架,并将检测过程细分为四个部分:

预处理 -> 中间代码转换 -> 比较单元生成 -> 匹配算法

参考以上算法,我把代码相似度计算的技术按照如下三个指标分类

中间表示 + 比较单元 + 匹配算法

综述中[2][3]对中间表示的总结常常把这个中间表示的内容(承载了代码的什么信息)和形式(用了什么样的数据结构)混在一起。对此,我想做一个把内容与形式分离的总结。

先总结代码中有哪些信息可以被提取出来用于相似度计算,包括:

  • 词法信息
  • 语法信息
  • 统计属性信息
  • 控制流信息
  • 数据流信息

这些信息在被具体定义并准确提取后,可以构成中间表示的内容。其中有些信息是具有一些天然的数据结构的。如下表所示:

信息 数据结构 具体表示实例
词法信息 线性结构 Token流
语法信息 树形结构 抽象语法树(AST)
统计属性信息 数值向量结构 保留字计数向量
控制流信息 有向图结构 控制流图(CFG)
数据流信息 有向图结构 数据流图(DFG)

学过数据结构的同学应该记得,课本[4]将数据结构的逻辑结构分为三类:线性结构(如向量、列表)、半线性结构(树)与非线性结构(图)。

以上三类结构并不是相互独立的关系,而是有层次的关系。我认为,它们按照复杂程度和转换层次,可以表示为如下的递进关系:

线性结构 -> 树结构 -> 图结构

其中,高层次的结构可以通过分解为若干低层次的结构,而低层次的结构也可以通过组合得到高层次的结构。具体来说,树结构可以通过遍历序列化为线性结构,而线性结构也可以通过合并节点转化为树结构或图结构。

基于这个不同结构之间可转化的特性,无论我们的中间表示多么复杂,都可以转化为低层次的结构来做匹配。我认为这也是论文[2]中提出的把“中间表示”与“比较单元”区分开来的原因。而对于不同结构的匹配算法,这其实是数据结构与算法领域研究的内容了。

除了计算复杂度上的差异,我认为,不同的中间表示对源代码结构的反映程度也是不同的。

更高层次的结构承载的代码结构信息更多,也更接近源程序的结构,但这些结构比较复杂,不利于计算机处理;相反,较低层次的结构更便于计算机处理,但包含的信息过于抽象笼统,不能反映代码结构的全貌。

针对我的特定业务场景找到最适配的中间表示与比较单位,是我近期的目标。

未来研究展望

代码相似度计算的一个主要应用是软件抄袭检测[3]。
综述[3]给出了软件抄袭检测领域的几个挑战和未来研究方向,包括:

  1. 部分抄袭问题
  2. 抄袭定位及证据生成

对于这两个方向,我认为可以尝试引入其他领域的方法论,比如信息检索和知识工程。具体怎样融合我会在后续的博客文章中介绍。

参考文献

[1] Whale, Geoff and University of New South Wales. Department of Computer Science Plague : plagiarism detection using program structure. School of Electrical Engineering and Computer Science, University of New South Wales, [Sydney], 1988.
[2] 熊浩,晏海华,郭涛,等. 代码相似性检测技术:研究综述[J]. 计算机科学, 2010, 37(8): 9-14, 76.
[3] 田振洲,刘烃,郑庆华,等. 软件抄袭检测研究综述[J]. 信息安全学报, 2016, 1(3): 52-76.
[4] 邓俊辉. 数据结构(C++语言语言版 第3版). 2013

第一次在博客园发布markdown格式的随笔,效果还不错。以后的博客会同步在gitpages和博客园上发布,欢迎关注。

【codenet】代码相似度计算框架调研 -- 把内容与形式分开的更多相关文章

  1. C#和SQL实现的字符串相似度计算代码分享

    http://www.jb51.net/article/55941.htm C#实现: 复制代码 代码如下: #region 计算字符串相似度        /// <summary>   ...

  2. 大数据计算框架Hadoop, Spark和MPI

    转自:https://www.cnblogs.com/reed/p/7730338.html 今天做题,其中一道是 请简要描述一下Hadoop, Spark, MPI三种计算框架的特点以及分别适用于什 ...

  3. 海量数据相似度计算之simhash和海明距离

    通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析.分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法.欧式距离.Jaccard相 ...

  4. Storm分布式实时流计算框架相关技术总结

    Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...

  5. 开源图计算框架GraphLab介绍

    GraphLab介绍 GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架.框架使用C++语言开发实现. 该框架是面向机器学习( ...

  6. 图像相似度计算之哈希值方法OpenCV实现

    http://blog.csdn.net/fengbingchun/article/details/42153261 图像相似度计算之哈希值方法OpenCV实现 2014-12-25 21:27 29 ...

  7. LSF-SCNN:一种基于 CNN 的短文本表达模型及相似度计算的全新优化模型

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本篇文章是我在读期间,对自然语言处理中的文本相似度问题研究取得的一点小成果.如果你对自然语言处理 (natural language proc ...

  8. OpenCV:Mat元素访问方法、性能、代码复杂度以及安全性分析

    欢迎转载,尊重原创,所以转载请注明出处: http://blog.csdn.net/bendanban/article/details/30527785 本文讲述了OpenCV中几种访问矩阵元素的方法 ...

  9. java算法(1)---余弦相似度计算字符串相似率

    余弦相似度计算字符串相似率 功能需求:最近在做通过爬虫技术去爬取各大相关网站的新闻,储存到公司数据中.这里面就有一个技术点,就是如何保证你已爬取的新闻,再有相似的新闻 或者一样的新闻,那就不存储到数据 ...

随机推荐

  1. CSS属性绘制图形(一)

    div部分: <div class="react-logo"> <div class="reactive"></div> & ...

  2. cheerio ==> node中的jquery

    三.cheerio ==> node中的jquery  https://www.npmjs.com/package/cheerio $ npm install cheerio -- save 1 ...

  3. 【JSP】JSP的介绍和基本原理

    JSP简介 JSP的核心实质是Servlet技术.JSP是后来添加的基于Servlet的一种扩展技术.但二者在使用上有不同的方向. 由于Servlet实质是一个Java类,因此非常适合用来处理业务逻辑 ...

  4. State Server实现多机器多站点 Session 共享 全手记

    网络环境有2台windows 2008 (192.168.1.71,192.168.1.72) 需要部署成 WebFarm,提高容错性. 网站部署在2台机器上的2个站点,如何才能做到Session的共 ...

  5. "will you marry me" vs "would you marry me"

    will you marry me 表示我现在问你,能不能嫁给我,我现在就需要答案. 如果回答是yes,那么对方就算是同意嫁给你了. would you marry me 表示你能不能考虑嫁给我. w ...

  6. 【Win】使用L2TP出现809错误

    1.环境:win7/10 2.解决: a.修改注册表(新建一个文本文件,复制以下内容,保存后文件扩展名改为.reg,双击运行文件.) Windows Registry Editor Version 5 ...

  7. java.exe和javaw.exe有什么区别

  8. opencv学习笔记——时间计算函数getTickCount()和getTickFrequency()

    cv::getTickCount()可以用来测量一段代码的运行时间,这个函数返回从上次开机算起的时钟周期数. 由于我们需要的是某个代码段运行的毫秒数,因此还需要另一个函数cv::getTickFreq ...

  9. 安装ubuntu16.04系统后没有无线网络选项的解决方法

    ubuntu系统是自带有无线网络驱动的,因此最好的解决办法是安装是把联网更新选项勾选上,这样在安装是就能自动把无线网络驱动配置好 这是一个比较有效的解决没有无线网络驱动的方法,比后续按网络上的教程自己 ...

  10. HiveQL之Database相关操作

    1.Create Database(创建数据库语法) CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name [COMMENT database_ ...