2009-12-15 63 views
4

我想自動將重複或類似的C代碼移動到函數中。我需要一個工具來查找單個文本文件或一組文本文件中的重複文本或類似文本塊

這必須在Linux下工作。

+0

我主張使用工具來簡單地識別代碼的類似部分。自動化這種重構需要問題。 – luke 2009-12-15 17:21:32

+0

可能的重複:http://stackoverflow.com/questions/546487/tools-to-identify-code-duplications – 2013-03-06 22:05:54

+0

相同的C + +:http://stackoverflow.com/questions/191614/how-to-detect-code-開發過程中的複製 – 2014-08-31 13:13:16

回答

4

你的問題的一個子集:檢測重複代碼:

嘗試:PMD

重複的代碼可以是很難找到,特別是在一個大型項目。但PMD的複製/粘貼檢測器(CPD)可以爲您找到它! CPD已經通過三個主要的化身:

  • 首先,我們寫的使用邁克爾·懷斯的貪婪字符串拼接算法的一個變種(我們的變種這裏描述)
  • 然後,它是由布萊恩Ewins使用Burrows-完全重寫Wheeler變換
  • 最後,它被Steve Hawkins改寫爲使用Karp-Rabin字符串匹配算法。

...

注意CPD工作與Java,JSP,C,C++,Fortran和PHP代碼。

+0

我已經在Java代碼中使用CPD進行類似的任務。輸出可以是xml,所以自動化很容易。 – vkraemer 2009-12-15 16:59:42

1

你會想看看Simian。它對於非商業項目是免費的。嘗試像這樣:

# Find all C source files and identify similarities/duplicate code. 
simian -includes=**/*.c -excludes=**/*_test.c 
+3

我很喜歡你的文章的代碼着色 – Joe 2009-12-15 15:27:19

+0

這篇文章中的鏈接現在被打破了。 :/ – 2013-03-06 20:40:47

1

猿猴(前面提到)是一個很好的工具。我在我的項目中一直使用CloneDetective,它效果很好。 CloneDetective是免費的,所以它不會受到傷害,試試看。

+0

CloneDetective是否適用於除C#之外的任何語言? – 2013-03-06 20:36:44

1

請注意,您不能只比較文本行。您將不得不解析代碼,通過這種方式,您還可以檢測語義上正確但可能具有不同命名標識符的段。

例如,給定兩個等價但使用不同標識符的函數,文本搜索不會將它們視爲相同,而是解析器可以。

另請注意,編寫C++解析器並不是一項簡單的任務,即使在給定語法的情況下也是如此。我建議其他人的建議,併爲此尋找工具。還搜索重構工具。

+0

托馬斯是正確的:你想要一個解析器,並且構建解析器對於真正的語言來說非常困難。請參閱CloneDR答案以獲取解析並處理C和C++的克隆檢測工具。 – 2010-02-19 10:00:03

1

請參閱CloneDR,該工具用於在源代碼中查找精確複製和接近未命中(複製粘貼編輯)克隆。它使用完整的語言解析器,使其能夠根據語言結構查找克隆,最大限度地減少誤報,並完全刻畫代碼的註釋或格式,從而最大限度地實現真正的檢測。當克隆塊更改變量,插入statemens或代碼塊時,CloneDR將查找克隆。它具有C,C++,COBOL,C#,Java,PHP和其他一些語言的語言前端。

您可以在網站上查看樣本克隆檢測報告。

相關問題