6

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

这必须在 Linux 下工作。

4

6 回答 6

4

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

尝试:PMD

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

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

...

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

于 2009-12-15T15:25:48.720 回答
1

你会想看看Simian。它对非商业项目是免费的。尝试类似:

# Find all C source files and identify similarities/duplicate code.
simian -includes=**/*.c -excludes=**/*_test.c
于 2009-12-15T15:26:25.117 回答
1

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

于 2009-12-15T15:34:24.337 回答
1

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

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

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

于 2009-12-15T19:28:54.613 回答
1

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

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

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

于 2010-02-19T09:59:05.887 回答
0

https://github.com/hudayou/fib

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

于 2013-01-19T14:01:46.460 回答