精华内容
下载资源
问答
  • QQ空间代码克隆工具ASP极速版 可以快速查询任意QQ空间里面的模块 输入QQ号即可查询 程序使用ASP代码无数据库,应重多网友的要求特发出此代码,适合新手学习 程序为简单版本,一般无权限限制空间可复制。复制的...
  • 1-前言代码克隆(Code clone),是指存在于代码库中两个及两个以上相同或者相似的源代码片段,是软件开发中的常见现象。代码克隆能够提高效率,但也可能意外引入外部漏洞。下文是对代码克隆检测技术的简单整理。2-...

    fab8ea6dcabfd34eec3653c6246d34c9.png

    1-前言

    代码克隆(Code clone),是指存在于代码库中两个及两个以上相同或者相似的源代码片段,是软件开发中的常见现象。代码克隆能够提高效率,但也可能意外引入外部漏洞。下文是对代码克隆检测技术的简单整理。

    2-克隆的类型

    代码克隆的类型主要分为两大类,句法克隆(syntactic clones)和语义克隆(semantic clones)。句法克隆指文本相似的代码片段, 语义克隆则是指功能相似的代码片段。基于这两大类,代码克隆可以被划分为四小类,其中前三种为句法克隆,第四种为语义克隆。

    7dba13fce91be34f91315b54167f837b.png

    当前,学术界对Type1,2,3类克隆的检测已颇为成熟,尤其是对Java和C++语言的克隆检测; 而对Type4类克隆的检测准确率仍不高,无法达到工业界应用标准。

    四类的代码示例可参照下图——

    6daab6e68111a389ecea12e461a59350.png
    其中s1,s2,s3,s4 分别对照Type-1,2,3,4类的代码形式,加粗部分为修改部分。

    3-克隆检测的通用流程

    通览代码克隆检测领域的相关论文,可以发现代码克隆检测通常分三步走。

    6101446ccb3529d6d81e361048c55e92.png
    1. 将源码拆分为对比单元(comparison units, 如class,function,block,statement)
    2. 将对比单元转化为中间表达(IR, Intermediate Representation,如token,AST, PDG)
    3. 再对这些对比单元的IR进行match detection(对比),通常是将对比单元组成clone pair的形式:一次对比两个(c1, c2)或是多个(c1, c2, c3)

    4-克隆检测算法的分类

    代码克隆检测发展至今,主要分为五大类检测思想: Textual, Token, Syntactic, Semantic, Learning.其具体分类见下图。

    e5a5a957caee17722522a1bae7115504.png
    • Textual:代码片段以文本/字符串/词法的形式相互比较,并且只有在两个代码片段在文本内容方面确实相同时才被发现被克隆。
    • Token:在编译器的词法分析阶段,所有源代码行都被划分为一系列Token。 然后将所有Token转换回Token序列。
    • Syntactic(句法分析):
      • 基于树: 提取的AST用于子树比较以识别相似区域。
      • 基于度量:通过源代码收集度量,然后使用这些度量为每个代码片段生成向量。然后使用向量对代码的相似度进行对比。
    • Semantic:主要检测代码片段不同,但功能相同的函数(Type4)
    • Learning : 通过机器学习和统计分析的方式来进行克隆检测

    这几类对应的具体算法见下——

    4.1. Textual

    图中的oss指open source software

    9a203d9781022291b75b43f17ba79bdc.png

    4.2. Token

    c5fcfdc4f15792e0838308cda0301bf2.png

    4.3. Syntactic

    4.3.1 Tree

    49f96a25e913f0d0b6a3c6060af9d7bc.png

    4.3.2 Metric

    fc6e88c32bafb2dc2d70d8928dcbc7b0.png

    4.4. Semantic

    4.4.1 PDG

    0031423cde9c84ee02a192c9adb0c534.png

    4.4.2 Other

    475eee54b14413246e5ab4141530d34e.png

    4.5. Learning

    4.5.1 ML

    97867d06f557a6c943ad0050d61295a7.png

    4.5.2 Other Learning

    4aea291cdf18d504594820e6b11cb7da.png

    5-克隆检测的历史趋势

    有关代码克隆检测的最早和最开创性的工作是在1990年代初期完成的,如下表所示。可以看出除了近年兴起的ML方法以外,代码克隆检测的开创性工作均在90年代和00年代就已完成,这也是笔者说该领域已颇为成熟的原因。

    0fa95ab8fb2cce8173121aca324d50b1.png

    6-Benchmarks 基准

    除了工具本身之外,在代码克隆检测工具的基准测试和有效性测试领域也有许多发展。其中比较有名的是Bellon’s benchmark(2007)和 BigCloneBench(2015)

    4d502fb39a288fba413e7be5e02d356d.png

    7-开源工具

    笔者整理了部分已开源的学术成果,地址见下。

    P.S. 知乎不支持表格,需要复制粘贴请移步博客:

    梳理 | 代码克隆检测技术 - 薇拉航线www.zuozuovera.com
    b83e0de14a55a0f4d42b97b18c845fa2.png

    eedd26292109adf4344d49ff70b4c142.png

    References

    [1] Walker A, Cerny T, Song E. Open-source tools and benchmarks for code-clone detection: past, present, and future trends[J]. ACM SIGAPP Applied Computing Review, 2020, 19(4): 28-39.

    [2] Roy C K, Cordy J R, Koschke R. Comparison and evaluation of code clone detection techniques and tools: A qualitative approach[J]. Science of computer programming, 2009, 74(7): 470-495.

    展开全文
  • 代码克隆是非常相似的独立代码片段。 在已开发一段时间的应用程序中,常会出现这种现象。 克隆提高了更改应用程序的难度,因为你必须找到并更新多个片段。 Visual Studio Ultimate 或 Visual Studio Premium ...

    代码克隆是非常相似的独立代码片段。 在已开发一段时间的应用程序中,常会出现这种现象。 克隆提高了更改应用程序的难度,因为你必须找到并更新多个片段。

    Visual Studio Ultimate 或 Visual Studio Premium 可帮助你查找代码克隆,以便你进行重构。

    你可以查找特定片段的克隆,也可以查找解决方案中的所有克隆。 除了发现直接复制的片段外,克隆分析工具还可以找到变量和参数名称不同的片段,以及某些语句重新排列的片段。

    代码克隆分析器可用于在整个 Visual Studio 解决方案中搜索 Visual C# 和 Visual Basic 项目中的重复代码。

    高度匹配的代码克隆分析结果

    查找特定代码片段的克隆

    1. 突出显示方法或 get/set 定义中的代码片段。

      说明 说明

      你可以查找语句克隆,但不能查找字段、方法或属性签名等声明。

    2. 在片段的快捷菜单上,选择“在解决方案中查找匹配的克隆”

    当你想知道解决方案中是否已存在相似的方法或片段时,请使用此方法。

    查找解决方案中的所有克隆

    • “分析”菜单上,选择“分析解决方案是否有代码克隆”

    当你审查代码时,此方法尤其有用。

    说明 说明

    此命令不会扫描长度少于 10 个语句的方法。

    结果按相似性顺序呈现。 展开每个项可查看代码片段。

    请注意,即使相似片段所使用的局部变量具有不同的名称,并且插入或删除了几个语句,也会被检测到。

    比较克隆

    1. “代码克隆结果”窗口中,选择两个文件或包含两个文件的克隆组。

    2. 从快捷菜单中选择“比较”

    此功能使用的比较工具与比较源代码管理下的版本所使用的工具相同。 如果要更改它,请从“工具”菜单中选择“选项” 展开“源代码管理”“Visual Studio Team Foundation Server” 选择“配置用户工具”,然后选择“添加”

    从分析中排除特定文件或方法

    1. 向定义了要排除的方法的 Visual Studio 项目中添加新 XML 文件。

      该文件是否属于该项目并不重要。 它必须位于项目的顶层目录中。

    2. 将文件扩展名更改为 .codeclonesettings

    3. 编辑文件的内容,使其类似于以下示例。

      <CodeCloneSettings>
        <Exclusions>
          <!-- Add any combination of the following node types. -->
          <!-- Absolute or relative path names: -->
          <File>MyFile.cs</File>
          <!-- Filepaths may contain wildcards: -->
          <File>GeneratedFiles\*.cs</File>
          <!-- Namespace, Type, and FunctionName must be fully qualified: -->
          <Namespace>MyCompany.MyProject</Namespace>
          <Type>MyCompany.MyProject.MyClass1</Type>
          <FunctionName>MyCompany.MyProject.MyClass2.MyMethod</FunctionName>
          <!-- Names may contain wildcards: -->
          <Namespace>*.AnotherProject</Namespace>
          <Type>*.AnotherClass*</Type>
          <FunctionName>MyProject.*.AnotherMethod</FunctionName>
        </Exclusions>
      </CodeCloneSettings>      
      

    代码克隆分析器将查找“在一定限制范围内”的克隆。

    代码克隆通常是由于开发人员复制代码后又根据新位置进行改写而产生的。 因此,最简单的做法是,考虑对克隆的更改达到何种程度以后分析器才会找不到克隆。 在进行下列修改后,克隆仍可被识别。 在每种情况下,此类修改的数量都有一定的限制:

    • 重命名标识符。

    • 插入和删除语句。

    • 重新排列语句。

    • 系统不会比较类型声明。 例如,你有两个字段声明组非常相似的类,系统不会将其报告为克隆。

      系统只会比较方法和属性定义中的语句。

    • “分析解决方案是否有代码克隆”不会在长度少于 10 个语句的方法中查找克隆。

      但是,你可以对较短的片段应用“在解决方案中查找匹配的克隆”

    • 已更改标记超过 40% 的片段。

    • 如果项目包含 .codeclonesettings 文件,并且 .codeclonesettings 文件的 Exclusions 部分中指定了代码元素,则系统不会搜索该项目中定义的这些代码元素。

    • 生成的某些种类的代码:

      1. *.designer.cs*.designer.vb

      2. InitializeComponent 方法

      但是,此方法不会自动应用于所有生成的代码。 例如,使用文本模板时,你可能希望通过在 .codeclonesettings 文件中指定生成的文件来排除它们。

    在以下情况中查找克隆通常有用:

    • 更新现有代码时。修复 bug 或响应需求的变化时,一般首先会在需要更改的代码中查找位置。 在进行更改之前,搜索该代码片段的克隆。 如果发现克隆:

      1. 考虑是否需要对每个克隆进行相同的更改。

      2. 考虑这是否也是一个重构克隆代码的好机会,以便添加到共享方法或类中。

    • 体系结构清理。在每次迭代结束时,请使用“分析”菜单上的“分析解决方案是否有代码克隆”

    • 创建编码时。编写新代码后,请使用该工具查找已存在的相似代码。

    大型项目的完全独立的部分之间经常复制代码,而且经常复制到组织的不同部分。 因此,你应当在尽可能大的代码库中查找克隆,而不是仅在你处理的当前解决方案中查找。

    若要在源树间应用代码克隆分析器,请创建一个包含存储库中所有项目的解决方案。

    提示 提示

    请记住,一个项目可包含在多个解决方案中。 若要分析大量项目中是否有代码克隆,可以创建一个包含所有项目的解决方案。 无需从通常借以访问项目的解决方案中移除项目。

    代码克隆分析不适合与生成的代码一起使用。 例如:

    • 由 T4 模板生成的代码。

      有关 T4 的更多信息,请参见 代码生成和 T4 文本模板

    • 从设计器生成的代码,例如 Silverlight 或 WPF 用户界面设计器。

    从代码克隆分析中排除由 T4 模板生成的文件

    1. 将模板放在 Visual Studio 项目的一个子目录下。 为其命名,例如 GeneratedFiles

    2. 向项目中添加新的文本文件,将其名称和扩展名更改为 t4Exclusions.codeclonesettings

    3. 如下更改文件内容:

      <CodeCloneSettings>
        <Exclusions>
          <File>GeneratedFiles\*.cs</File>
        </Exclusions>
      </CodeCloneSettings>

    文章出处:https://msdn.microsoft.com/zh-cn/library/hh205279(v=vs.120).aspx
    展开全文
  • 本文提出了一种基于树和基于令牌的方法相结合的高速,高精度代码克隆检测方法。 重复的程序代码(称为代码克隆)的存在是降低软件质量和可维护性的主要因素之一。 如果一个代码片段包含错误(错误),并且将它们复制...
  • QQ空间代码克隆工具ASP极速版 可以快速查询任意QQ空间里面的模块 输入QQ号即可查询 程序使用ASP代码无数据库,应重多网友的要求特发出此代码,适合新手学习 程序为简单版本,一般无权限限制空间可复制。复制的...
  • 代码克隆(Code Clone)

    2020-06-09 21:04:35
    代码克隆类型 Four Clone Types. Type I Identical fragments except for variations in comments and layout. Type II Identical fragments except for variations in identifier names and literal values in ...

    代码克隆类型

    Four Clone Types

    Type I

    In Type I clones, a copied code fragment is the same as the original. These code clones are identical code clones with some modification in white space and comments.
    在这里插入图片描述

    Type II

    A Type II clone is a code fragment that is the same as the original except for some possible variations about the corresponding names of user-defined identifiers (name of variables, constants, class, methods and so on), types, layout and comments.
    在这里插入图片描述

    Type III

    Syntactically similar fragments that differ at the statement level. The fragments have statements added, modified, or removed with respect to each other.
    在这里插入图片描述

    Type IV

    Syntactically dissimilar fragments that implement the same functionality. Type I, II, and III clones indicate textual similarity whereas Type IV clones indicate functional similarity.
    在这里插入图片描述

    1. Type-1: Identical code fragments differing by whitespace, comments
    2. Type-2: Identical code fragments differing by identifier names or literal values
    3. Type-3: Code fragments that have statements added, modified, or removed
    4. Type-4: Code fragments that semantically perform the same computation with little syntactic similarity.

    展开全文
  • 读研期间在实验室做的软件维护软件演化方向,同组人有做代码克隆方向,我觉得代码克隆对于在实际使用中更普遍一些,一方面浅显易懂,一方面很多人容易忽略,我就从自己对代码克隆的理解说说。 什么是代码克隆?...
      读研期间在实验室做的软件维护软件演化方向,同组人有做代码克隆方向,我觉得代码克隆对于在实际使用中更普遍一些,一方面浅显易懂,一方面很多人容易忽略,我就从自己对代码克隆的理解说说。

    什么是代码克隆?代码克隆对代码质量和可维护性有什么影响?
      先说一下代码克隆在实际项目中,不管大项目还是小项目都是有意义的,微软近几年已经从各方面加强对软件工程理论在实际中的应用做研究,下面
    http://msdn.microsoft.com/en-us/library/hh205279.aspx 是微软在visualstudio中的代码克隆相关功能。
      那么什么是代码克隆呢,这个链接已经解释了,“Code clones are separate fragments of code that are very similar.”,克隆是类似复制拷贝的意思,说白了,代码克隆是一种在代码中存在的现象,最简单的说法就是存在两段代码长的很像,very similar,有多像,就是很像,看起来很像,有时读起来也很像,有时读起来发现没那么像。

    代码克隆怎么产生的呢?
      克隆么,最简单复制粘贴,很多人写代码都会有很多的复制粘贴吧,参考既有代码,复制粘贴过来改改,有的时候改改就改出问题了:(,复制粘贴是产生代码克隆主要途径。当然还有了,也许程序猿A为了完成某项功能写了一段代码,程序猿B为了完成同样的子功能也写了一段代码,结果两段代码长的挺像,(有的时候长的不像,长的不像的但是功能一样的代码其实也是一种克隆,也会影响一些可维护性)。

    代码克隆对代码质量和可维护性有什么影响呢?
      上面微软的链接又给了“ Clones make it hard to change your application because you have to find and update more than one fragment”,关键字:hard,change,find,update,more than。什么意思呢,说白了,假如有两段代码长的很像甚至一模一样,有一天你发现其中一段代码出bug了,当你要修改这段代码时,那另一段代码是否要修改呢,你是不是要找到那段代码并且也要做同样的修改呢,如果有第三段甚至第一百段克隆代码呢,如果说可以拿这些工作量来跟项目经理和产品经理谈,且不嫌烦的做重复劳动,或者代码是按照行数来卖钱的,那另当别论了。
      在学术领域,如果N个代码片段长的很像,那么就把这N个代码片段的集合叫一个克隆类,其中每个代码片段叫做克隆实例,实际上和编程语言中的类和实例(对象)是一样的意思。
      如果代码中形成了这样的克隆类,那么其中某个克隆实例不管由于需求变更还是bugfix而需要修改时,寻找其他的克隆实例并衡量是否需要修改都是需要做的事情,若需要修改则重复修改,若不需要修改,唉,还要担心是否衡量错了。算我多嘴。
      我记得学术领域中有这样的结论,90%的bug存在于10%的代码中?或者从28原则看,80%的bug存在于20%的代码中。还有如果一个类或者方法出了bug,进行修改之后,可能还存在其他bug,就是在软件演化历史中经常修改的代码往往存在更多的bug,有人一定觉得这是废话么?我觉得不是,这是告诉程序猿警醒对代码的修改吧。

    怎样消除代码克隆呢?
      重构。通常来讲将克隆代码抽象重构成公共方法或者抽象到基类等都是常用的方法,当然有时更复杂的代码克隆情况可能就需要更复杂的解决方案,或者别解决了,因为不是所有的代码克隆都一定要被消除的。

    代码克隆究竟是否是有害的?
      这个学术界也在争论,有人说代码克隆不是好东西啊,这货是个祸水,有人说不是所有的代码克隆都是有害的,这个我导师也总挂在嘴边。我觉得呢,软件开发是个包含人的主观能动性的活动,这么复杂的东西不太容易被对与错这样两个极端来限制住,所以呢,我比较赞成不是所有的代码克隆都是有害的这种说法,我觉得现阶段对代码克隆的研究是可以帮助人扩展视野,从更多的角度关注人的活动、代码开发与代码质量的关联,而不是要形成个规则一棒子打死。

    好,结论,哦不,我体会后的想法。  
    • 在开发中要警惕代码的复制粘贴,有时复制粘贴只是为了图省事,可能与代码克隆关系不大的,但是要有警惕的心理。
    • 写好一段代码或一个类时可以使用代码克隆工具检查下是否存在克隆,也许你所完成的功能别人已经做了,当然如果项目组有很好的知识库就更好了。
    • 由于需求变更或者bugfix时修改一段代码的时候最好可以检查下是否有其他的克隆片段,如果存在那么需要检查下是否也需要修改。
    • 如果两段或更多的克隆片段在一次提交中被修改了,请衡量下是否需要重构或者如果不容易重构的话,请做标注警醒以后的修改。在学术领域中,无数人做了各种各样的eclipse插件或者其他工具来做代码克隆识别、关联、标注等,然而大部分可能还不足以在实际中使用或者不受重视而已。

    展开全文
  • git helper工具可使用单行代码克隆/打开/自动安装/编辑git项目。 > gito cesarferreira / dryrun -e 产品特点 快速克隆任何git项目并更改目录。 可以自动在finder打开文件夹。 可以在任何编辑器中自动打开项目...
  • 请问:是否所有的代码克隆检测技术本质上都是使用了信息检索技术?代码克隆检测技术与信息检测技术是等同的,是一码事?
  • 运营码云平台5年时间,对国内开源发展之迅猛非常的欣慰,但同时也存在很多问题是我们难以...为了在抵制开源软件抄袭的问题上尽一分力,我们正式推出了 CopyCat 代码克隆检测服务。CopyCat 是我们在NiCad Clone Det...
  • 如果远程代码克隆到本地时 用户名和密码输错,导致无法重新输入。可以在控制版面中找到凭据管理器-windows凭据-普通凭据中删除自己输错的用户名和密码。 转载于:...
  • 运营码云平台 5 年时间,对国内开源发展之迅猛非常的欣慰,但同时也存在很多问题是我们...为了在抵制开源软件抄袭的问题上尽一分力,我们正式推出了 CopyCat 代码克隆检测服务。CopyCat 是我们在 NiCad Clone D...
  • 文章连接: ...amp;arnumber=6494937 ...代码克隆检测的方法有很多,比如说 textual-based, token-based, tree-based, graph-based, metric-based,hybird based 使用的标准不同,代码克隆的检测分类...
  • github仓库代码克隆或git pull不到本地,怎么办?仔细一看原来是没有把服务器上的公钥加入到github仓库中,下面一起来看看! 首先登录到服务器,没有秘钥的,先生成密钥对 ssh-keygen -t dsa 可得到两个文件,id_...
  • 代码克隆的类别总结

    千次阅读 2016-08-31 19:24:54
    写在前面的话这篇文章是翻译了 A Survey on Software Clone Detection Research这篇文章的第7小节,作者是:Chanchal Kumar Roy and James R. Cordy 在语言上我做了一些修改,让它...对于两个相似的代码段,要么是它
  • 1、首先需要下载并安装好git for window。 下载地址: ... 2、进入git bash,使用如下命令,按三次回车,即可完成秘钥生成。...6、进入要克隆的本地目录下,git clone +你想要克隆的项目地址。
  • 1、安装GitLab客户端 2、去GitLab服务端找项目路径 ...3、去GitLab客户端去克隆代码 右键-->git Clone 4、最后结果 转载于:https://www.cnblogs.com/yybrhr/p/9732267.html...
  • git官网下载 查看版本 git... Git 全局设置: git config --global user.name "jixinwei" git config --global user.email "5432453+cute_cute@user.noreply.gitee.com" 查看配置 git config --list 1复制仓库克隆地址 2
  • 克隆到 ‘/Users/xxx/.oh-my-zsh’… fatal: 无法访问 ‘https://github.com/ohmyzsh/ohmyzsh.git/’:Failed to connect to 127.0.0.1 port 1080: Connection refused Error: git clone of oh-my-zsh repo failed...
  • 写在前面的话这篇文章,是上面一章 基于K-gram的winnowing特征提取剽窃查重检测技术(概念篇)的延续版,本章为代码篇。那就是说明我们要开始写代码了。明天双十一,大家都在玩淘宝天猫,抢红包,我一个码农苦逼的对...
  • 1- 克隆远程项目代码 终端中进入想要放项目代码的位置 点此链接,进入我们要克隆代码地址,复制克隆链接 终端中执行克隆操作: git clone 刚刚复制的地址 2- Pycharm中对...
  • 1、从git仓库克隆git地址 2、在所在的项目文件夹下 往git仓库里添加文件 git add . 提交仓库里的文件 git commit -m ‘初始化’ 3、git push origin master 推送到主分支master 4、检出另一个新的分支...
  • 每个工程下面有一个 .git 配置文件,通过配置该文件夹下的config文件,可以得到 代码的url更新地址,所以,如果我们copy 或者git clone 别人的代码,需要更改 此处的url,这个url 用于今后 git pull的命令的目的链接...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,373
精华内容 4,949
关键字:

代码克隆