【发布时间】:2010-12-26 20:38:37
【问题描述】:
我想自动将重复或类似的 C 代码移动到函数中。
这必须在 Linux 下工作。
【问题讨论】:
-
我提倡使用一种工具来简单地识别相似的代码部分。自动化这种重构是自找麻烦。
标签: c text automation code-duplication
我想自动将重复或类似的 C 代码移动到函数中。
这必须在 Linux 下工作。
【问题讨论】:
标签: c text automation code-duplication
您的问题的一个子集:检测重复代码:
试试:PMD
很难找到重复的代码,尤其是在大型项目中。但是 PMD 的复制/粘贴检测器 (CPD) 可以为您找到它! CPD经历了三个主要的化身:
- 首先我们使用 Michael Wise 的 Greedy String Tiling 算法的变体编写它(此处描述了我们的变体)
...
请注意,CPD 适用于 Java、JSP、C、C++、Fortran 和 PHP 代码。
【讨论】:
Simian(前面提到过)是一个很好的工具。我一直在我的项目中使用CloneDetective,效果很好。 CloneDetective 是免费的,所以不妨一试。
【讨论】:
请注意,您不能只比较文本行。您将不得不解析代码,以这种方式,您还可以检测语义正确但可能具有不同命名标识符的段。
例如,给定两个等效但使用不同标识符的函数,文本搜索将不会将它们视为相同,但解析器可以。
还要注意,编写 C++ 解析器并非易事,即使在给出语法的情况下也是如此。我建议其他人的建议并为此寻找工具。同时搜索重构工具。
【讨论】:
请参阅CloneDR,这是一种用于在源代码中查找精确复制和未命中(复制粘贴编辑)克隆的工具。它使用完整的语言解析器,使其能够根据语言结构找到克隆,最大限度地减少误报,并完全独立于代码的注释或格式,从而最大限度地提高真实检测。 CloneDR 会在被克隆的块改变变量、插入语句或代码块时找到克隆。
它具有 C、C++、COBOL、C#、Java、PHP 和许多其他语言的语言前端。
您可以在网站上查看样本克隆检测报告。
【讨论】:
您需要查看 Simian。它对非商业项目是免费的。尝试类似:
# Find all C source files and identify similarities/duplicate code.
simian -includes=**/*.c -excludes=**/*_test.c
【讨论】:
https://github.com/hudayou/fib
用于在文件或目录中查找相同代码块的工具。
【讨论】: