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