21

有没有人有一些工具或一些推荐的做法如何找到一段与其他代码相似的代码?

我经常写一个函数或一个代码片段,我记得我之前已经写过类似的东西,我想重用以前的实现,但是使用纯文本搜索不会显示任何内容,因为我没有使用变量名完全一样。

拥有相似的代码片段会导致不必要的代码重复,但是对于大型代码库,不可能将所有代码都保存在内存中。是否有任何工具可以对功能上“相似”的代码和标记的片段或功能进行一些分析?

考虑以下示例:

  float xDistance = 0, zDistance = 0;
  if (camPos.X()<xgMin) xDistance = xgMin-camPos.X();
  if (camPos.X()>xgMax) xDistance = camPos.X()-xgMax;
  if (camPos.Z()<zgMin) zDistance = zgMin-camPos.Z();
  if (camPos.Z()>zgMax) zDistance = camPos.Z()-zgMax;
  float dist = sqrt(xDistance*xDistance+zDistance*zDistance);

  float distX = 0, distZ = 0;
  if (cPos.X()<xgMin) distX = xgMin-cPos.X();
  if (cPos.X()>xgMax) distX = cPos.X()-xgMax;
  if (cPos.Z()<zgMin) distZ = zgMin-cPos.Z();
  if (cPos.Z()>zgMax) distZ = cPos.Z()-zgMax;
  float dist = sqrt(distX*distX +distZ*distZ);

在我看来,这已经被问了好几次了:

https://stackoverflow.com/questions/204177/what-tool-to-find-code-duplicates-in-c-projects

如何在开发过程中检测代码重复?

我建议在这里关闭重复。


其实我认为这是一个更普遍的搜索问题,比如:如果问题已经在 StackOverflow 上被问过,我该如何搜索?

4

3 回答 3

11

您可以使用Simian。它是一种检测 Java、C#、C++、XML 等(甚至是纯 txt 文件)中重复代码的工具。它甚至可以很好地集成到像 CruiseControl 这样的工具中。

于 2009-04-02T13:43:57.037 回答
3

我们的CloneDR在大型源系统中查找重复代码,包括精确副本和接近未命中,并由语言语法参数化。它支持 Java、C#、COBOL、C++、PHP、Python 和许多其他语言。

它接受许多参数来定义“什么是克隆?”,包括:a)相似度阈值,控制两个代码块必须有多相似才能被声明为克隆(通常 95% 是好的)b)最少行数克隆大小(3 往往是一个不错的选择) c)参数的数量(对文本的明显更改;5 往往是一个不错的选择)使用这些设置,它往往会在它处理的几乎所有内容中找到 10-15% 的冗余代码.

Simian 等面向行的克隆检测工具无法找到已重新格式化的克隆代码,但 CloneDR 会。他们可能会告诉您两个代码块匹配,但通常不会向您显示它们的确切匹配方式或差异所在;CloneDR 会。他们没有建议如何抽象克隆代码;CloneDR 会。

由于具有较弱的匹配算法,它们往往会产生更多的误报;当您报告超过 100 万行的 5000 个克隆时,误报的数量非常重要。

根据您的示例,我希望它能够找到这两个片段(您没有指向任何一个片段)并注意,如果您抽象出变量名称,它们是相似的。

于 2009-08-23T05:57:21.880 回答
-1

这是我见过的关于代码克隆检测的最佳集合:

https://web.archive.org/web/20120502162147/http://students.cis.uab.edu/tairasr/clones/literature

有很多程序,但似乎没有一个是最好的或最受欢迎的。您可以思考什么对您来说最重要,并找到适合您需求的内容。

于 2012-12-15T21:05:26.493 回答