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