2012-06-06 94 views
14

我正在尋找一種可以比較源代碼的相似性的工具。類似代碼檢測器

現在我們有一個非常微不足道的系統,它有大量的誤報,真正的積極因素可以很容易地被埋入其中。

我的要求是:

  • 相當少量的誤報
  • 良好的檢出率(是的,這些都是違背對方)
  • 的不僅僅是單個值一個更加複雜的輸出
  • 理想
  • 可用於C(C99)和C++(C++ 03和最佳C++ 11)
  • 仍然保持
  • 可用於共mparing在非交互式模式相對於彼此
  • 可用兩個源文件

編輯:

爲了避免混淆,以下兩個代碼段是相同的,並應被檢測爲這樣:

for (int i = 0; i < 10; i++) { bla; }

int i; while (i < 10) { bla; i++; }

同樣在這裏:

int x = 10; y = x + 5;

int a = 10; y = a + 5;

+1

差異是否滿足您的一些需求? –

+1

@HighPerformanceMark大聲笑,不,它不。 –

+2

它看起來好像您需要一種工具來比較2個代碼的語義相似性,而不是語法。我懷疑這是一個未解決的問題,因此將很難爲您找到滿意的解決方案。我認爲,正如你所寫的,你原來的問題會誤導很多讀者,就像它誤導了我。我也認爲你應該完全重寫,以清楚地說明你對哪種比較感興趣。 –

回答

15

我用MOSS過去:http://theory.stanford.edu/~aiken/moss/檢測抄襲代碼。由於它在語義層面上工作,因此它將檢測您在上面顯示的情況。該工具是語言感知的,所以在分析中不考慮註釋,並且在通過簡單的搜索和替換變量和/或函數名稱來檢測已被修改的代碼方面有很長的路要走。

注意:幾年前,當我在研究生院教授計算機科學時,我使用了該工具,它在檢測從互聯網上跳出的代碼時非常有效。這是一個證據充分的考慮類似的應用:http://fie2012.org/sites/fie2012.org/history/fie99/papers/1110.pdf

如果谷歌「測量軟件相似性」,你應該多找幾個有用的結果: http://www.ics.heacademy.ac.uk/resources/assessment/plagiarism/detectiontools_sourcecode.html

+0

看來,鏈接到fie1012.org不再有效。你能提供一個替代的鏈接嗎? – Eric

+1

試試這個:http://www3.nd.edu/~kwb/nsf-ufe/1110.pdf – Throwback1986

3

可能是複製粘貼探測器從PMD

6

您在計算機科學術語中的問題可能被稱爲源代碼抄襲檢測。一個好的開始是閱讀Dobbs博士的這篇文章:Detecting Source-Code Plagiarism。它列出了在源代碼中檢測剽竊的算法。

注意:你問什麼確實是一個艱難的計算問題:)

1

你可以嘗試duplo。它會找到共同的線。它有一些能夠忽略空白變化的能力,但是不會檢測帶有重命名變量的代碼,所以它在檢測抄襲時更像是一種幫助。

1

我開始使用JPLAG(https://github.com/jplag/jplag)來檢查代碼相似性,並比較學生在Java和文本文件中的作品。 它可以很好地檢查相同的代碼結構和變量替換。