【问题标题】:I need a tool to find duplicates or similar blocks of text in a singular text file or set of text files我需要一个工具来在单个文本文件或一组文本文件中查找重复或相似的文本块
【发布时间】:2010-12-26 20:38:37
【问题描述】:

我想自动将重复或类似的 C 代码移动到函数中。

这必须在 Linux 下工作。

【问题讨论】:

标签: c text automation code-duplication


【解决方案1】:

您的问题的一个子集:检测重复代码:

试试:PMD

很难找到重复的代码,尤其是在大型项目中。但是 PMD 的复制/粘贴检测器 (CPD) 可以为您找到它! CPD经历了三个主要的化身:

  • 首先我们使用 Michael Wise 的 Greedy String Tiling 算法的变体编写它(此处描述了我们的变体)
  • 然后由 Brian Ewins 使用 Burrows-Wheeler 变换完全重写
  • 最后,它被 Steve Hawkins 重写为使用 Karp-Rabin 字符串匹配算法。

...

请注意,CPD 适用于 Java、JSP、C、C++、Fortran 和 PHP 代码。

【讨论】:

  • 我在 Java 代码中使用过 CPD 来完成类似的任务。输出可以是 xml,因此很容易实现自动化。
【解决方案2】:

Simian(前面提到过)是一个很好的工具。我一直在我的项目中使用CloneDetective,效果很好。 CloneDetective 是免费的,所以不妨一试。

【讨论】:

    【解决方案3】:

    请注意,您不能只比较文本行。您将不得不解析代码,以这种方式,您还可以检测语义正确但可能具有不同命名标识符的段。

    例如,给定两个等效但使用不同标识符的函数,文本搜索将不会将它们视为相同,但解析器可以。

    还要注意,编写 C++ 解析器并非易事,即使在给出语法的情况下也是如此。我建议其他人的建议并为此寻找工具。同时搜索重构工具。

    【讨论】:

    • Thomas 是正确的:你需要一个解析器,而构建解析器对于真正的语言来说是相当困难的。有关解析和处理 C 和 C++ 的克隆检测工具,请参阅 CloneDR 答案。
    【解决方案4】:

    请参阅CloneDR,这是一种用于在源代码中查找精确复制和未命中(复制粘贴编辑)克隆的工具。它使用完整的语言解析器,使其能够根据语言结构找到克隆,最大限度地减少误报,并完全独立于代码的注释或格式,从而最大限度地提高真实检测。 CloneDR 会在被克隆的块改变变量、插入语句或代码块时找到克隆。

    它具有 C、C++、COBOL、C#、Java、PHP 和许多其他语言的语言前端。

    您可以在网站上查看样本克隆检测报告。

    【讨论】:

      【解决方案5】:

      您需要查看 Simian。它对非商业项目是免费的。尝试类似:

      # Find all C source files and identify similarities/duplicate code.
      simian -includes=**/*.c -excludes=**/*_test.c
      

      【讨论】:

      • 这篇文章的链接现在已经失效了。 ://
      • 修复了链接。
      【解决方案6】:

      https://github.com/hudayou/fib

      用于在文件或目录中查找相同代码块的工具。

      【讨论】:

        猜你喜欢
        • 2021-08-23
        • 2023-01-23
        • 1970-01-01
        • 2011-12-25
        • 2012-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        相关资源
        最近更新 更多