我们正在使用 CPD 工具进行代码重复检测。CPD 工具包括空格和注释。您能否告诉我们如何避免空格、注释,以便出现正确的重复案例?假设我们有 4 行重复代码和 4 行注释,那么它返回 8 行而不是 4 行。
1 回答
哪个特定(复制粘贴检测器)CPD 工具?有许多。
CPD 如何检测重复取决于它比较的原始实体。(我已经建立了克隆检测器)。
有些只在源代码行上运行;这些几乎无法将空格和注释与您认为您提供该工具的编程语言区分开来。对它来说,您的代码只是原始文本。这些工具也不能发现“代码块 A 是代码 B 的重复,并带有定期更改(例如,参数)”,而这正是您真正想知道的。(我认为这种 CPD 给出的答案很糟糕,因此是你的问题,但他们的优势是他们可以处理所有事情)。
有些人对语言标记进行操作,因为他们碰巧知道的语言。这些工具在忽略空格方面往往非常好。由于他们知道评论是某种标记,他们通常也可以通过某种命令行开关忽略评论。(因此,“哪个 CPD 工具?”)。但他们不懂语言结构,因此认为序列
} {
是所有其他此类序列的克隆。坦率地说,这是一个愚蠢的克隆。其次,这种基于令牌的检测器只能检测一个令牌范围内的参数(克隆系统变化的地方),通常仅用另一个常量或标识符替换标识符或常量。这仍然是面向行的 CPD 工具在可用性方面的一大进步。
很少有人对语言结构进行操作,例如,使用语言的语法来控制匹配(我碰巧做了其中之一,CloneDR,请参阅我的简历)。这些不会犯基于令牌的 CPD 工具的错误,因此您可以更好地检测到克隆此外,它们可以检测由(结构化)令牌序列组成的参数,例如,当表达式替换标识符时等。恕我直言(哎呀,意见!)这些可以更好地检测到克隆(这就是我构建 CloneDR 的原因)。