我们有一个相当大的代码库,400K LOC的C++,代码重复是一个问题.有没有可以有效检测重复代码块的工具?
理想情况下,这将是开发人员在开发过程中可以使用的东西,而不是偶尔运行以查看问题所在.如果我们可以将这样的工具与CruiseControl集成在每次签入后提供报告,那也很好.
我前段时间看过Duploc,它显示了一个漂亮的图形,但需要一个小型的环境来使用它,这使得自动运行它相当困难.
免费工具会很好,但如果有一些好的商业工具我也会感兴趣.
Simian在C++项目中检测到重复的代码.
更新:还适用于Java,C#,C,COBOL,Ruby,JSP,ASP,HTML,XML,Visual Basic,Groovy源代码甚至纯文本文件
我使用了PMD的Copy-and-Paste-Detector,并使用以下包装脚本将其集成到CruiseControl中(确保在类路径中有pmd jar).
我们的检查每晚运行.如果您希望将输出限制为仅列出当前更改集中的文件,则可能需要一些自定义编程(想法:检查所有并仅列出其中包含其中一个已更改文件的重复项.您必须检查所有文件,因为更改可能会使用来自未更改文件的一些代码).应该可以通过使用XML输出和解析结果来实现.不要忘记在完成后发布该脚本;)
对于初学者来说,"文本"输出应该没问题,但是你需要以用户友好的方式显示结果,为此我使用perl脚本从CPD的"xml"输出生成HTML文件.可以通过将它们发布到巡航报告jsp所在的tomcat来访问它们.开发人员可以从那里查看它们并查看他们的脏黑客的结果:)
它在150个KLoc代码上运行得非常快,不到2秒(空行和注释不计入该数字).
duplicatecheck.xml:
duplo似乎是Duploc中使用的算法的C实现.编译和安装很简单,虽然选项有限,但它似乎或多或少都是开箱即用的.