2012-07-30 9 views
5

我們的項目真的很大。一個模塊中的源代碼大小約爲620KLOC。所以我想檢查哪個功能是目錄/模塊中最大的功能?有沒有任何工具可以支持它?哪個工具可以在C++中顯示Method或函數的最大語句?

SourceMonitor只有「每個方法的平均語句數」,而不是每個方法的最大語句數。 CCCC也不支持它。

示例。此功能長度爲1.

unsigned short get() 
{ 
    return 1; 
} 

謝謝。

+0

我懷疑目前的工具是否可行。 – iammilind 2012-07-30 06:26:41

+0

Clang提供用於編寫​​各種源代碼級工具的整潔基礎架構。您可以使用它來開發自己的工具。 – arrowd 2012-07-30 06:31:09

+0

如果您使用優化,它會有所不同 – Zaffy 2012-07-30 06:38:24

回答

2

The 最簡單我能想到的是通過腳本編寫腳本。

  • 使用如ctags獲取文件中的函數列表
  • 使用Perl/Python的/的awk/grep來你的源文件拆分成獨立的文件,每個功能 一個文件
  • 簡單地計算行每個文件的最大長度。 如果您需要更多詳細信息,請將每個文件提供給loc計數器,例如sloccount
    獲得更多精煉信息。再次使用grep來得到輸出你 興趣

另一種工具,可能會有所幫助:

懶C++:是是,拆分是非常類似於C++文件爲標題代碼生成和資源。如果您編寫代碼將代碼轉換爲lzz文件,則生成的代碼包含每個函數的行計數器標記。這些數字的差異會告訴你函數有多大

+1

而不是分裂成不同的文件,我會建議使用ctags與-x,在人類可讀的輸出行號給出。按照他們排序,並且它很容易計算線條(該數字只是大約,但應該足以找到最大的)每個功能 – flolo 2012-07-30 09:24:33

+0

我之前沒有使用ctags。我會看看介紹並嘗試理解它。 – liuzw 2012-07-31 01:27:54

+0

ctage接縫真的很強大。弗洛洛和馬丁,你是否熟悉它?你可以給命令來支持我的要求嗎?非常感謝 – liuzw 2012-07-31 01:42:09

0

我認爲很多靜態分析工具可能不會給你你需要的東西,因爲它們不一定會考慮像模板實例化,頭文件包含(包括那些由預編譯頭文件引入)和編譯器的代碼生成特性。

以前我遇到過類似的問題,一個大型的可執行文件,其大小由一個特定的庫支配。我深入到底部的方法只是查看每個.cpp的對象文件的大小。由於鏈接器會優化未使用的部分,所以這不會給你提供完整的故事(儘管值得檢查你已經設置了這個選項 - 針對Visual Studio的/OPT:REF)。它雖然會讓你專注於搜索。找到兩個或三個最大的對象文件,然後查看相應的.cpp文件。然後,您有兩個選擇 - 編寫一個腳本,輸出objdump(VisualStudio)或nm -C(gcc),您可以在其中提取模塊中每個函數的偏移量,以便您可以與之前的每個函數進行比較以獲得想法每個功能的大小。

或者最簡單的方法就是在cpp文件上使用二進制搜索。在#include的結尾處#ifdef所有代碼並編譯它。這會給你一個關於包含的開銷的想法(如果它本身很大,那麼你可以深入到包頭來找出哪個貢獻最大)。接下來,用#ifdef禁用每一半的代碼,並找出哪一半更大。使用這種方法,您可以快速找到對庫的大小貢獻最大的功能。

在庫的情況下,我有這個相同的問題,事業原來是一個非常大的模板化功能,每次保存成員變量時實例化。這種情況下的解決方案是使該函數具體化,以便所有不需要特定類型行爲的代碼僅實例化一次,並且模板函數針對類型特定的邏輯位進行本地化。

+0

靜態分析工具對我來說已經足夠了。我們可以忽略模板代碼,因爲我們的模板代碼很小。我們的一些「常規」C++方法有600多個代碼行。我不認爲目標文件大小可以得到方法代碼行,除了一個文件有一個方法。但對我們來說並非如此。 – liuzw 2012-07-31 01:26:09

0

CppDepend爲您提供此信息,它基於Clang和CQLinq,您可以根據需要請求您的代碼。

1

您可以使用我們的SourceMeter工具掃描您的項目,並根據您的需要提供包含帶有指標(包括您正在查找的其他尺寸指標)的函數/方法的CSV文件以及包含模塊(例如庫,共享對象,可執行文件)。使用電子表格編輯器,您可以輕鬆找到每個模塊的最大功能/方法。

相關問題