11

我正在尋找一種自動化方法來檢測代碼是否作爲開發的一部分複製和粘貼到大型代碼庫上。我們主要使用C++。其目的是以自動化的方式以高概率和少量誤報來檢測這種情況,從而可以拒絕這樣做的變化。如何在大型代碼庫中自動檢測複製的代碼?

這是所有容易爲開發商擔心的一些代碼未知,而是複製他們的使用率,並取代上,對於所有工作的方式的主副本工作一個小的調整。我想檢測並停止這樣的捷徑,這會使代碼難以維護。

任何人都可以提出一種自動化的方式來嘗試和檢測這種情況?這可以在事實之後應用,以找到在引入此自動化解決方案之前已經溜過的領域。

回答

10

只需使用PMD包。它支持C++和可配置的CPD(複製粘貼檢測)...

這也使更大量的檢測:

  • 未使用的代碼
  • 編碼風格侵犯
  • 方法/功能/常規尺寸
  • 緊耦合

多(儘管很多文檔都是特定於Java,所以我不知道確切w ^帽子其他適用於C++)...

4

斯坦福大學的Alex Aiken教授開發了一個名爲MOSS(衡量軟件相似性)的工具,用於檢測多所大學本科課程的剽竊行爲。該工具非常擅長檢測結構相似的代碼段。我不知道你的情況可能會如何適用,但可能值得研究。

1

我用猿猴的Groovy和Java,它被證明是非常有效的。它支持廣泛的配置和多種語言。看看http://www.harukizaemon.com/simian/features.html。它是免費的非商業用途,我建議您使用評估許可證進行探索。

2

退房我們CloneDR,被設計成自動化克隆的檢測在各種各樣的語言。 - >不通過佈局上當,而相比之下,純文本匹配器等

  • 使用的語言結構/語法作爲指導(忽略語言空白和註釋:

    CloneDR從其它克隆探測器通過區分本身作爲拉賓-卡普樣式重複的探測器

  • 用由不只是變量或常量,而且整個語句或塊的參數變化(與令牌式檢測器)
  • demonstrably提供最高的精度(「少數假檢測克隆積極「)根據數字報告f研究論文比較克隆檢測器

有C++版本(Java,C#,...),您可以在網站上看到示例報告。您也可以下載評估版。

我是作者。

1

通過使用我們的SourceMeter工具,您將獲得關於重複源代碼(克隆)的文本報告。它檢測到所謂的Type-2克隆,它們在結構上非常相似,但詞法上可能不同。檢測到的克隆是完整的句法實體(例如函數,塊),因此它們可以很容易地重構,克隆不會發生在函數結束時開始,並在另一個結尾開始結束。

您正在尋找的另一個重要功能是能夠及時跟蹤分析版本中的單個重複。這樣,它會報告何時創建新的複製或刪除或更改現有的複製。