精华内容
下载资源
问答
  • 基于深度学习的代码克隆检测技术研究.pdf
  • dupl dupl是用Go语言编写的用于查找代码克隆的工具。 到目前为止,它只能在Go源文件中找到克隆。 该方法将后缀树用于序列化的AST。 它忽略AST节点的值。 它只是与它们的类型一起使用dupl dupl是用Go语言编写的用于...
  • 奥利奥(Oreo)是一种用于源代码克隆检测的新颖方法,它不仅可以准确地检测类型1到类型3的克隆,而且还能够检测暮光区中难于检测的克隆。 Oreo是结合机器学习,信息检索和软件指标而构建的。 我们评估BigCloneBench...
  • 本文提出了一种基于树和基于令牌的方法相结合的高速,高精度代码克隆检测方法。 重复的程序代码(称为代码克隆)的存在是降低软件质量和可维护性的主要因素之一。 如果一个代码片段包含错误(错误),并且将它们复制...
  • 一种基于特征矩阵的软件脆弱性代码克隆检测方法?
  • 遍历目录树java源码
  • ReSharper 的代码克隆检测和修复插件。 拉尔夫探员是什么? Agent Ralph 主要是 C# 的代码克隆检测和修复工具,作为插件提供。 它还具有一些其他与代码克隆无关的零碎功能,但它们本身就是有用的 ReSharper 扩展。 ...
  • 代码克隆是非常相似的独立代码片段。 在已开发一段时间的应用程序中,常会出现这种现象。 克隆提高了更改应用程序的难度,因为你必须找到并更新多个片段。 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. 编辑文件的内容,使其类似于以下示例。

      XML
      <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. 如下更改文件内容:

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

    文章出处:https://msdn.microsoft.com/zh-cn/library/hh205279(v=vs.120).aspx
    展开全文
  • 代码克隆检测(Code Clone Detection)是软件工程领域的一个重要方向,每年都有很多论文,其中很多论文都用到了BigCloneBench,这里简单总结一下这个数据集的使用,不得不吐槽一点:学术界的数据集和工具,易用性都...

    代码克隆检测(Code Clone Detection)是软件工程领域的一个重要方向,每年都有很多论文,其中很多论文都用到了BigCloneBench,这里简单总结一下这个数据集的使用,不得不吐槽一点:学术界的数据集和工具,易用性都太差了,发再多paper有啥用呢?只是在自己小圈子里自娱自乐,完全没有实际的impact和意义。

    如果我们在google搜索bigclonebench,可以看到排名第一的就是一个GitHub上的repo:https://github.com/clonebench/BigCloneBench

    这里:https://github.com/clonebench/BigCloneBench#bigclonebench-version-2-use-this-version

    写得很清楚,建议大家使用Version 2,并且告诉我们说:

    The latest BigCloneBench is distributed with BigCloneEval here. It is significantly larger than the ERA version, and is distributed as a h2database file with a much simpler schema. If you need the full BigCloneBench, with all the validation artifacts, please contact us and we can arrange to send you a copy (it is quite large).

    IJaDataset with the expanded files is available here: IJaDataset 2.0 + BigCloneBench Samples.

    BigCloneBench full database (postgresql) is available here: BigCloneBench_Postgresql.

    吐槽一下啊,到底是使用BigCloneEval呢,还是使用下面这个postgresql的文件呢,后面我们会看到,这两者也是不一样的。不得不说,很多Repo的ReadME的可读性都太差了。不过既然说了最新版的是连同BigCloneEval发布的,所以我们暂时下这个版本:

    https://github.com/jeffsvajlenko/BigCloneEval

    我刚看到这个项目也是一脸懵逼,一上来介绍:

    BigCloneEval is a framework for performing clone detection tool evaluation experiments with the BigCloneBench clone benchmark.

    然后就开始讲怎么安装了。呵呵呵,如果不了解的人看到这里会莫名其妙,为啥我要用一个framework来做evaluation呢?相信很多朋友和我的目的一样,都是需要把BigCloneBench下载下来训练及评价自己的模型,仅此而已,你不是应该先讲数据集怎么用,然后如果别人关心的话,再介绍自己的工具吗?况且也没介绍清楚。耐着性子往下看,看到Step 2,Step 3分别需要下载最新的BigCloneBench和IJaDataset,后面这个又是什么鬼?

    https://www.dropbox.com/s/z2k8r78l63r68os/BigCloneBench_BCEvalVersion.tar.gz?dl=0

    https://www.dropbox.com/s/xdio16u396imz29/IJaDataset_BCEvalVersion.tar.gz?dl=0

    耐着性子把这些步骤做完,看到后面:

    To evaluate the recall of a clone detection tool you must complete the following steps:

    1. Register the clone detection tool with BigCloneEval.
    2. Detect clones in IJaDataset using the clone detection tool.
    3. Import the detected clones into BigCloneEval.
    4. Configure and execution the evaluation experiment.

    These steps are performed using BigCloneEval's commands, which are located in the command/ directory as scripts. These scripts must be executed from within the command directory (the command directory must be the working directory).

    大概明白了,这个BigCloneEval是一个evaluation的framework,我们如果想使用这个framework评价自己的工具或者模型,需要注册(Register)自己的clone detection tool,但是这里完全不讲怎么注册自己的工具,当然,你可以认为这里给出了例子:

    ./registerTool -n "NiCad" -d "Default configuration"

    但是,如果对这个不了解,鬼知道怎么注册自己的工具,鬼知道这个NiCad是什么东西?

    呵呵呵,还是那句话,这些ReadME写得都太垃圾了。但是我们需要使用人家的数据集,只好从自己的角度来猜猜是怎么回事了。按照前面说的,Step 2中下载的压缩包BigCloneBench_BCEvalVersion.tar.gz,解压以后是bcb.h2.db和bcb.trace.db,按照Step 2中的提示,

    Extract the contents of BigCloneBench (BigCloneBench_BCEvalVersion.tar.gz) into the 'bigclonebenchdb' directory of the BigCloneEval distribution.

    可以预期,这两个(bcb.h2.db和bcb.trace.db)是这个版本的BigCloneBench的h2数据库文件。另外Step 3中,IJaDataset_BCEvalVersion.tar.gz解压以后是一个名为“bcb_reduced”的文件夹,需要:

    Extract the contents of IJaDataset (IJaDataset_BCEvalVersion.tar.gz) into the 'ijadataset' directory of the BigCloneEval distribution.

    所以这两步就是把相关的数据放到BigCloneEval的对应文件夹下,可以猜想这两部分就是主要的数据了。那么我们要使用BigCloneBench,只要关注这两步中的文件即可。

    所以,第一步先用h2把这个数据库文件打开来看看,在这个页面:https://www.h2database.com/html/main.html

    中下载All Platforms (zip, 8 MB)

    发现解压之后是传统的Java软件目录,在bin目录下有JAR包,我们运行:

    java -jar h2-1.4.200.jar

    即可以通过浏览器打开数据库页面了。那么问题又来了,我们怎么把bcb.h2.db这样的文件导入数据库呢,搜索了一下,看到这里有人介绍:

    https://stackoverflow.com/questions/46000726/tool-to-view-test-h2-db-h2-database

    需要指定一下db文件相对于主文件夹的位置,ubuntu系统中就是/home/%用户名%/,简单起见,我就把上面的bcb.h2.db放到主文件夹下了,然后启动h2,在启动后的web界面中的JDBC URL填写:

    jdbc:h2:~/bcb

    点击connect后就可以看到这个数据库中的表了。例如我们执行:

    SELECT * FROM CLONES;

    就可以看到类似下面的数据记录:

    这个嘛,应该就是表示clone关系了吧,但具体哪一列表示clone呢,尝试一下:

    SELECT count(*) FROM CLONES where functionality_id=4;

    结果是:4664949,如果我们执行:

    SELECT count(*) FROM CLONES where functionality_id=3;

    结果是:891777,如果执行:

    SELECT count(*) FROM CLONES where functionality_id=2;

    结果是:409962,而id=1的时候呢,结果是0,感觉这个比例和我看过的论文里的比例差不多,所以盲猜这个functionality_id表示的就是Type-1到Type-4的Clone。

    (2021年1月28日更新:简单分析了之后,发现这个functionality_id并不是表示Type 1到4的Clone,而是SYNTACTIC_TYPE表示Clone类型,例如我们运行:

    SELECT count(*) FROM CLONES where SYNTACTIC_TYPE=1

    得到结果是48116,

    SYNTACTIC_TYPE=2的时候是4234,SYNTACTIC_TYPE=3的时候是8531803,SYNTACTIC_TYPE=4的时候是0,所有的clone pair是8584153,sigh,看来之前的盲猜果然猜错了啊)

    姑且这么认为吧(使用大部分数据集的时候基本靠猜,我也是醉了,学术界就是这么的低效)。相信function_id这些对应的就是表FUNCTION里的内容了。我们运行:

    SELECT * FROM FUNCTIONS;

    得到下面这张表:

    这个很明显就是function信息了,如果我们先运行:

    SELECT count(*) FROM FUNCTIONS;

    得到的结果是:22285855,有两千多万个function?我表示很怀疑啊。那怎么将这些function和源码对应起来呢,就想到了bcb_reduced,在ubuntu中查看其属性,发现有:55,671 项,共 607.3 MB,我就说这个数据集肯定没有那么多function啊。简单浏览了一下这个文件夹,我们以/bcb_reduced/2/selected/145.java(这个目录下的第一个文件为例):

    SELECT * FROM FUNCTIONS where name='145.java';

    可以得到下面的结果:

    而我们看一下145.java的内容:

    package edu.harvard.iq.safe.saasystem.util;
    
    import java.util.*;
    import java.util.logging.*;
    import java.io.*;
    import javax.xml.stream.*;
    import javax.xml.stream.events.XMLEvent;
    import java.net.*;
    import java.util.concurrent.*;
    
    /**
     *
     * @author asone
     */
    public class PLNConfigurationFileReader {
    
        static final Logger logger = Logger.getLogger(PLNConfigurationFileReader.class.getName());
    
        /**
         *
         * @param url
         * @param propertyName
         * @return
         */
        public static CopyOnWriteArraySet<String> read(URL url, String propertyName) {
            if ((propertyName == null) || (propertyName.equals(""))) {
                return null;
            }
            CopyOnWriteArraySet<String> peers = new CopyOnWriteArraySet<String>();
            XMLInputFactory xmlif = XMLInputFactory.newInstance();
            xmlif.setProperty("javax.xml.stream.isCoalescing", java.lang.Boolean.TRUE);
            xmlif.setProperty("javax.xml.stream.isNamespaceAware", java.lang.Boolean.TRUE);
            XMLStreamReader xmlr = null;
            BufferedInputStream stream = null;
            long starttime = System.currentTimeMillis();
            logger.info("Starting to parse the remote config xml[" + url + "]");
            int elementCount = 0;
            int topPropertyCounter = 0;
            int propertyTagLevel = 0;
            try {
                stream = new BufferedInputStream(url.openStream());
                xmlr = xmlif.createXMLStreamReader(stream, "utf8");
                int eventType = xmlr.getEventType();
                String curElement = "";
                String targetTagName = "property";
                String peerListAttrName = propertyName;
                boolean sentinel = false;
                boolean valueline = false;
                while (xmlr.hasNext()) {
                    eventType = xmlr.next();
                    switch(eventType) {
                        case XMLEvent.START_ELEMENT:
                            curElement = xmlr.getLocalName();
                            if (curElement.equals("property")) {
                                topPropertyCounter++;
                                propertyTagLevel++;
                                int count = xmlr.getAttributeCount();
                                if (count > 0) {
                                    for (int i = 0; i < count; i++) {
                                        if (xmlr.getAttributeValue(i).equals(peerListAttrName)) {
                                            sentinel = true;
                                        }
                                    }
                                }
                            }
                            if (sentinel && curElement.equals("value")) {
                                valueline = true;
                                String ipAd = xmlr.getElementText();
                                peers.add(ipAd);
                            }
                            break;
                        case XMLEvent.CHARACTERS:
                            break;
                        case XMLEvent.ATTRIBUTE:
                            if (curElement.equals(targetTagName)) {
                            }
                            break;
                        case XMLEvent.END_ELEMENT:
                            if (xmlr.getLocalName().equals("property")) {
                                if (sentinel) {
                                    sentinel = false;
                                    valueline = false;
                                }
                                elementCount++;
                                propertyTagLevel--;
                            } else {
                            }
                            break;
                        case XMLEvent.END_DOCUMENT:
                    }
                }
            } catch (MalformedURLException ue) {
                logger.log(Level.WARNING, "specified url was not correct", ue);
            } catch (IOException ex) {
                logger.log(Level.WARNING, "remote config file cannot be read due IO problems", ex);
            } catch (XMLStreamException ex) {
                logger.log(Level.WARNING, "remote config file (" + url + ") cannot be read due to unexpected processing conditions", ex);
            } finally {
                if (xmlr != null) {
                    logger.info("closing the xml stream reader");
                    try {
                        xmlr.close();
                    } catch (XMLStreamException ex) {
                    }
                }
                if (stream != null) {
                    logger.info("closing the stream");
                    try {
                        stream.close();
                    } catch (IOException ex) {
                    }
                }
            }
            return peers;
        }
    }

    明显只能和最后一个记录对应起来啊(StartLine和EndLine分别是25和115),所以FUNCTION这个表里面,我们只需要关心Type为Selected这些记录即可。剩下的工作就是,需要把bcb_reduced这个文件夹中的源码都处理一下,提取出function,我记得之前也看到一篇博客说这个事情:https://www.cnblogs.com/xiaojieshisilang/p/10219344.html

    呵呵呵呵呵,从恢复数据,到理解/处理数据,都得靠猜和自己摸索,再吐槽一遍:学术界的大部分工具和数据集都太垃圾了!!!

    另外,由于我有Uderstand,所以从Java代码中提取function并确定其起始行号,是非常简单的事情,需要写一些代码,就能使用这个所谓的数据集了。相信绝对不是我一个人有这些感想,真的很无语。也希望我这个探索过程能帮助到一些有需求的朋友。

    最后发两个链接,说明并不是我一个人有这样的疑问:

    https://bbs.csdn.net/topics/396147037

    https://github.com/jeffsvajlenko/BigCloneEval/issues/26

    展开全文
  • 运营码云平台 5 年时间,对国内开源发展之迅猛非常的欣慰,但同时也存在很多问题是我们...为了在抵制开源软件抄袭的问题上尽一分力,我们正式推出了 CopyCat 代码克隆检测服务。CopyCat 是我们在 NiCad Clone D...

    运营码云平台 5 年时间,对国内开源发展之迅猛非常的欣慰,但同时也存在很多问题是我们难以忽视的。其中一个对开源生态发展杀伤力最强的就是 —— 抄袭问题!当我们辛辛苦苦开发的软件被改头换面以另外一个名字出现在开源世界里,这种坏心情是所有开发者都感同身受的。

    为了在抵制开源软件抄袭的问题上尽一分力,我们正式推出了 CopyCat 代码克隆检测服务。CopyCat 是我们在 NiCad Clone Detector 项目的基础上对性能进行优化和调整而推出的代码克隆检测服务,是基于 NiCad 技术的代码克隆检测技术。

    我们以这两天收到的用户举报的一个项目为例:https://gitee.com/old-peanut/wechat_applet__open_source ,该项目与原项目 https://gitee.com/fuyang_lipengjun/platform (该项目为码云 GVP 项目)进行比对,下图是详细的比对结果,二者的相似度高达 97.94% 。 

    备注:我们已经跟该项目作者沟通,作者已在项目介绍中写清楚实际情况。

    目前 CopyCat 服务刚刚推出,还处于公测阶段,欢迎广大开源作者们能使用这个工具捍卫自己的权利。我们也会不断的努力来提升工具检测的力度,支持更多的编程语言(当前支持 Java、C/C++ 和 C# 语言)。

    你可以通过 https://copycat.gitee.com 使用该服务。

    号外!只此一天,1024 程序员节新客户使用优惠码 gitee1024 购买 码云企业版 全线 6 折优惠,过期不候哦。

    往期精彩:

    深受程序员喜爱的C++开源项目 | 码云周刊第 86 期

    七个实用的分布式开源框架 | 码云周刊第 85 期

    码云新增GVP(最有价值)和 1000Stars 项目 | 码云周刊第 84 期

    码云 Gitee IDE 全新上线

    展开全文
  • 1 短版 ...中文译名:基于语法语义融合学习的功能代码克隆检测 关键词:Code clone detection, functional clone detection, code representa- tion, syntax and semantics fusion learning ...

            文章名:

            Functional Code Clone Detection with Syntax and Semantics
    Fusion Learning

            中文译名:

            基于语法语义融合学习的功能代码克隆检测

            关键词:

            Code clone detection, functional clone detection, code representa-
    tion, syntax and semantics fusion learning

            怎么做的:

            1.使用调用图确定功能:为啥确定功能?因为功能是我们识别代码克隆的重要依据,是一种重要的粒度。

            2.使用语法语义融合。怎么做?使用AST&CFG表示语法语义,使用Word2vec和Graph2vec提取特证。

            3.训练模型。结合以上特征使用DNN训练即可.

            实验过程略。

            总结:在本文中,作者基于已有的代码克隆检测知识,提出功能代码检测粒度,基于该定义和AST&CFG提出一种新的代码表示方法,联合语法语义融合嵌入技术,训练模型去完成代码克隆检测。该方法在检测源代码中的语法语义拥有更高的效率,可以较好地应用到功能代码克隆检测中去。

            本人对科研论文了解尚浅,如有错误,还请指正!

             

    展开全文
  • 基于索引的分布式代码克隆检测 Write
  • 代码克隆检测技术的Android应用重打包检测.pdf
  • 代码克隆是主要问题。 为了解决代码克隆检测的目的,正在上传检测词法和句法特征的代码,我们需要输入相似的代码,看看匹配句法和匹配词法值是否相同。
  • 行业分类-物理装置-一种高效的多版本跨项目软件代码克隆检测方法.zip
  • 行业分类-设备装置-云环境下基于Java字节码的多粒度代码克隆检测方法.zip
  • SourcererCC是基于令牌的代码克隆检测器,用于超大型代码库和Internet规模的项目存储库。 SourcererCC可以在许多粒度级别上工作,例如以任何语言检测文件,方法,语句或块之间的克隆。 本教程适用于Java上的文件级...
  • 克隆代码检测技术的并行运行进行了可能性研究,使用基于程序依赖图的克隆代码检测技术,这种技术不仅可以检测出语法上的克隆,也可以检测出语义上的克隆,提出了一个并行子图同构检测方法并使用MapReduce并行实现...
  • 1_study-objects-我们测试过的克隆检测工具分析的源代码 2_detection-parameter-我们使用的克隆检测工具的参数 3_cloning-reports-克隆检测工具生成的报告 4_toolchain-我们的帮助工具“ CloneListCruncher”,用于...
  • 文章连接: ...amp;arnumber=6494937 ...代码克隆检测的方法有很多,比如说 textual-based, token-based, tree-based, graph-based, metric-based,hybird based 使用的标准不同,代码克隆的检测分类...
  • 首先提取软件系统中具有漏洞的代码,并使用克隆检测工具检测出软件的克隆代码;其次分别提取能够产生“漏洞”的克隆和非克隆代码,并分别计算不同克隆类型和非克隆的BOC漏洞密度和LOC漏洞密度;最后对type-1、pure ...
  • 克隆代码分析方法研究,王甜甜,王克朝,针对已有克隆代码检测工具只输出克隆组形式的检测结果,而无法分析克隆代码对软件质量的影响问题,提出危害软件质量的关键克隆
  • ntation)是搭载Elasticsearch与代码克隆检测接近,包括代码正常化,正-grams和查询降低技术,构建在顶部的代码克隆搜索系统。 它可以在几秒钟内从大量 Java 源代码库中可扩展地搜索 Type-1 到 Type-3/Type-4 的克隆...
  • CLIONE是一个代码克隆修改支持bot。 CLIONE执行是由“拉取请求”触发的,它会在拉取请求之间通知不一致修改或新添加的克隆集。 用作GitHub机器人 单击注册您要应用CLIONE的GitHub帐户和存储库。 在您的项目中创建....
  • javaclone:在Java项目中检测克隆的工具
  • 目 录 摘 要 i ABSTRACT ii 第一章 绪论 1 1.1 课题研究背景 1 1.1.1 开源软件复用 1 1.1.2 代码克隆 2 1.1.3 代码克隆影响 6 1.2 课题面临的挑战 7 1.2.1 代码克隆种类日趋多样 7 1.2.2 代码克隆检测规模海量增长 8...
  • 综述了软件克隆的定义与分类, 对软件克隆的检测过程进行了划分和讨论, 介绍了软件克隆检测领域最为活跃的代码克隆检测技术和模型克隆检测技术。最后对软件克隆检测的研究现状和急需解决的问题进行了分析, 展望了该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,323
精华内容 31,329
关键字:

代码克隆检测

友情链接: harry-using-cPP.zip