如何在开发过程中检测代码重复?

Dav*_*ben 75 c++ code-duplication

我们有一个相当大的代码库,400K LOC的C++,代码重复是一个问题.有没有可以有效检测重复代码块的工具?

理想情况下,这将是开发人员在开发过程中可以使用的东西,而不是偶尔运行以查看问题所在.如果我们可以将这样的工具与CruiseControl集成在每次签入后提供报告,那也很好.

我前段时间看过Duploc,它显示了一个漂亮的图形,但需要一个小型的环境来使用它,这使得自动运行它相当困难.

免费工具会很好,但如果有一些好的商业工具我也会感兴趣.

Sim*_*ele 35

Simian在C++项目中检测到重复的代码.

更新:还适用于Java,C#,C,COBOL,Ruby,JSP,ASP,HTML,XML,Visual Basic,Groovy源代码甚至纯文本文件

  • 请注意,它不是免费的商业用途. (2认同)

use*_*039 19

我使用了PMD的Copy-and-Paste-Detector,并使用以下包装脚本将其集成到CruiseControl中(确保在类路径中有pmd jar).

我们的检查每晚运行.如果您希望将输出限制为仅列出当前更改集中的文件,则可能需要一些自定义编程(想法:检查所有并仅列出其中包含其中一个已更改文件的重复项.您必须检查所有文件,因为更改可能会使用来自未更改文件的一些代码).应该可以通过使用XML输出和解析结果来实现.不要忘记在完成后发布该脚本;)

对于初学者来说,"文本"输出应该没问题,但是你需要以用户友好的方式显示结果,为此我使用perl脚本从CPD的"xml"输出生成HTML文件.可以通过将它们发布到巡航报告jsp所在的tomcat来访问它们.开发人员可以从那里查看它们并查看他们的脏黑客的结果:)

它在150个KLoc代码上运行得非常快,不到2秒(空行和注释不计入该数字).

duplicatecheck.xml:

<project name="duplicatecheck" default="cpd">

<property name="files.dir" value="dir containing your sources"/>
<property name="output.dir" value="dir containing results for publishing"/>

<target name="cpd">
    <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask"/>
    <cpd minimumTokenCount="100" 
         language="cpp" 
         outputFile="${output.dir}/duplicates.txt"
         ignoreLiterals="false"
         ignoreIdentifiers="false"
         format="text">
        <fileset dir="${files.dir}/">
            <include name="**/*.h"/>
            <include name="**/*.cpp"/>
                <!-- exclude third-party stuff -->
            <exclude name="boost/"/>
            <exclude name="cppunit/"/>
        </fileset>
    </cpd>
</target>
Run Code Online (Sandbox Code Playgroud)


ben*_*nno 6

duplo似乎是Duploc中使用的算法的C实现.编译和安装很简单,虽然选项有限,但它似乎或多或少都是开箱即用的.


And*_*ter 5

看看PMD 项目

我从来没有用过它,但一直想用。


Sam*_*amB 5

这些 Debian 软件包似乎按照以下方式做一些事情

PS 应该有所有与查找 [near] 重复相关的工具的Debtags标签。(但它会叫什么?)