如何在开发过程中检测代码重复? 我们有相当大的代码库,C++的4K LOC,代码复制是个问题。是否有任何工具可以有效地检测重复的代码块

如何在开发过程中检测代码重复? 我们有相当大的代码库,C++的4K LOC,代码复制是个问题。是否有任何工具可以有效地检测重复的代码块,c++,code-duplication,C++,Code Duplication,理想情况下,这将是开发人员在开发过程中可以使用的东西,而不仅仅是偶尔运行以查看问题所在。如果我们能够将这样一个工具与CruiseControl集成在一起,在每次签入后提供一个报告,那将是一件好事 前一段时间我看了一下,它显示了一个很好的图形,但是需要一个smalltalk环境来使用它,这使得自动运行它相当困难 自由工具会很好,但是如果有一些好的商业工具,我也会感兴趣。检测C++项目中的重复代码。 更新:也适用于Java、C#、C、COBOL、Ruby、JSP、ASP、HTML、XML、Visua

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

前一段时间我看了一下,它显示了一个很好的图形,但是需要一个smalltalk环境来使用它,这使得自动运行它相当困难

自由工具会很好,但是如果有一些好的商业工具,我也会感兴趣。

检测C++项目中的重复代码。 更新:也适用于Java、C#、C、COBOL、Ruby、JSP、ASP、HTML、XML、Visual Basic、Groovy源代码甚至纯文本文件查看

C++,是一个免费的(内部使用)克隆代码检测器,支持多种编程语言(java,C++,COBOL,VB,C语言)。它可以轻松地作为构建系统的一部分运行。

我使用了以下包装器脚本,并将其集成到CruiseControl中(确保类路径中有pmd jar)

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

对于初学者来说,“文本”输出应该是可以的,但是您希望以用户友好的方式显示结果,为此,我使用perl脚本从CPD的“xml”输出生成HTML文件。可以通过将它们发布到cruise的报告jsp所在的tomcat来访问它们。开发人员可以从那里查看它们,并查看他们的恶意黑客攻击的结果:)

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

duplicatecheck.xml


查找“相同”的代码片段相对容易,现有的工具已经做到了这一点(请参阅其他答案)

有时是好事,有时不是;如果在一个太精细的“水平”上进行,它可能会使开发时间陷入停滞;i、 试图重构这么多代码,你失去了你的目标(可能会破坏你的里程碑和时间表)


更难的是,在没有适当文档的情况下,找到多个函数/方法来完成相同的事情,但具有不同(但相似)的输入和/或算法


如果您必须使用两种或不同的方法来执行相同的操作,而程序员试图修复一个实例,但忘记(或不知道它们存在)修复其他实例,则会增加软件的风险。

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

好的,您可以在源代码上运行克隆检测器 每晚都有代码库

许多克隆检测器通过比较源线来工作, 并且只能找到精确的重复代码

上面的CCFinder通过比较语言来工作 标记,因此它对空格不敏感 变化。它可以检测变异的克隆 如果只有一个令牌,则为原始代码的 更改(例如,将中的变量X更改为Y 克隆人)

理想情况下,你想要的是上述能力,但是 在哪里找到克隆人 允许相对任意的变化, e、 例如,用表达式、语句替换变量 靠街区等

<我们的克隆克隆检测器是针对java、C++、COBOL、VB.NET、VB6、FORTRAN和各种类型的 其他语言。可在以下网址查看:

除了能够处理多种语言外,CloneDR engine还能够处理各种输入编码样式,包括ASCII、ISO-8859-1、UTF8、UTF16、EBCDIC、许多Microsoft编码和(日语)Shift JIS

<>网站有几个克隆检测运行示例报告,包括一个C++,

<编辑> 2014:现在处理所有C++ 14。

同()是非常简单的,但是它在文本行上而不是令牌上工作,如果你使用一个不喜欢的克隆查找器支持的语言,这是有用的。

< P>还有java、C++、C++、C、Objto-C、JavaScript……/P>支持的Java语言。 它得到了哈德逊公司(如CPD)的支持


除非您是一个开源项目,否则您必须为Simian付费。

这些Debian软件包似乎在做以下事情:

  • (也称为)

另外,所有与查找[接近]重复相关的工具都应该有一个标签。(但是,它是什么?)

< P>是支持C++代码分析的一个很好的工具。可以忽略空白查找重复项。具有非常方便的gui和控制台界面。
由于它的灵活性,安装起来并不容易。我找到了

您可以使用我们的工具检测代码重复。它是一个命令行工具(非常类似于编译器),所以你可以很容易地集成到连续的集成工具中,就像你提到的,或者./P>我认为PMD只是java,但是现在我看到CPD(它也是PMD的一部分)也可以用于C++。谢谢这个链接。我一定会看的。更好的是,每当有人使用粘贴按钮:-}Relate时,都会有一个日文版本(项目中除我之外的所有其他开发人员都是日文)