2010-11-19 34 views
11

是否有任何工具可以確定是否使用了函數/過程/方法/整個類?我見過的工具可以幫助知識豐富的開發人員追蹤未使用的代碼片段(大部分都是針對Delphi以外的語言),但大多數工具有陡峭的學習曲線和/或需要大量的挖掘以確定代碼片段是否用過與否。在Delphi中查找未使用的(又名「死」)代碼

德爾福的智能鏈接器據稱這是爲了減少最終可執行文件的大小。不幸的是,在智能鏈接器上提供的信息很少,並不表示一種方法來檢索從喧鬧中剔除的內容。

不可否認,即使有可能找出智能連接器正在消除什麼,它可能會非常保守。

回答

5

雖然笨拙而不是全局,但您可以檢查邊距中點的源代碼,如下所示。這些是可以設置斷點的行,因爲代碼沒有被刪除死碼。

我相信這發生在程序層面。我不知道一種方式來確定這一點在一個不太粗糙的水平。

alt text

+0

確實笨拙。這需要以可視方式掃描每個源文件以找出缺失的點。儘管在測試了幾個編譯器選項之後,它顯示了該功能是否可用,無論調試信息是打開還是關閉。我想知道這些信息是否由IDE從IDE中提取出來? – 2010-11-19 17:03:58

+0

笨拙,但試圖理解或重構大型單位時非常有用。 – 2015-06-08 13:38:34

4

這個線程討論刪除未使用的單位,大約像伊卡洛斯帕斯卡爾分析工具會談。該工具可以滿足您的所有需求。 How to "automatically" remove unused units from uses clause?

+0

剛剛使用2天前,從我的代碼剝下一層厚厚的廢話。 – 2010-11-19 17:04:45

+1

是的,它的*代碼減少*和*使用*報告是非常有用的,但它沒有報告列出從未調用過的函數或聲明但從未使用過的類。 – 2010-11-19 17:22:00

0

查看http://www.peganza.com/上的工具來幫助您完成某些任務。

伊卡洛斯是免費的,它分析你的'使用'條款,讓您刪除未使用的引用。

帕斯卡分析儀是完整版本,其中包括伊卡洛斯功能和大量的其他工具。

+0

這些已被提及。 – 2010-11-19 17:58:11

+0

哎呀......不知道我是怎麼錯過的!無論祝你好運! – 2010-11-19 19:01:25

0

也許CodeHealer可以幫助你用不用代碼

CodeHealer執行的源代碼進行了深入 分析,尋找 問題在以下幾個方面:

審計:質量控制規則如未使用或無法訪問的代碼,使用 德爾福指令名稱和關鍵字作爲 標識符,標識符隱藏在相同名稱的其他 在更高的範圍, 以及更多。 檢查:潛在錯誤,例如未初始化的或未被引用 標識符,危險型鑄造, 自動類型轉換,未定義 函數的返回值,未使用的 分配的值,等等。 度量:代碼特性,例如圈 複雜性,對象 (數據抽象耦合)之間的耦合定量,評論 比,類數目, 代碼行,等等。

2

您可以使用Code Coverage工具來查找未使用的代碼。只需運行應用程序並手動執行所有部件。代碼覆蓋率報告將顯示哪些部件未被觸摸。 (在單元測試中運行該工具是沒有用的,因爲未使用的代碼仍然可以進行單元測試)。

德爾福的免費(開源)代碼覆蓋工具可用here。運行後,檢查報告中是否有紅線,這些是尚未到達的行。

德爾福代碼覆蓋率是德爾福一個簡單的代碼覆蓋率 工具,基於 詳細的地圖文件創建 代碼覆蓋率報告。

對於每個單位將有一個 unit.html與 覆蓋率的摘要,其次是源 標記。綠線覆蓋。 紅線沒有被遮蓋的線條。 其他行沒有爲其生成代碼 。還有一個 CodeCoverage_summary.html文件, 總結了覆蓋範圍,並將 鏈接到生成的單元報告。

也許作者可以在將來的版本中添加「搜索死代碼」功能。

+5

好方法,但很難完全鍛鍊許多大型/成熟/意大利麪條/傳統/蹩腳的應用程序,例如維護項目中常見的那些應用程序(通常是懷疑有死代碼的應用程序)。當然,A..Z全自動迴歸測試將會有所幫助。你知道,那種模擬數據集並記錄每種怪異屬性組合,模擬年終,季度關閉,閏年,日食,假期處理,作爲(應用程序級別)管理員,普通用戶,客人,作爲(OS)管理員,普通用戶,超級用戶,有限帳戶。 XP,95,Vista,7 ... – 2010-11-19 21:30:07

+0

繼續...然後,作爲開發人員,我甚至在程序中都沒有IDEA。聽起來很瘋狂,如果你不在那裏。 +1,儘管我咆哮...... ;-) – 2010-11-19 21:31:03

0

爲單位,使用Pascal Analyzer。您可能需要多次使用它。

對於在類工廠(等)中註冊的對象/類,您需要手動進行雙重檢查,因爲它們將被完全編譯。原因是編譯器不知道您是否實際使用它們或不。

對於方法,你需要檢查藍點。不太實際,所以還有另外一種方法(從我調查同一主題時得知的)。您需要啓用詳細的地圖文件進行完整的構建。一旦完成,您需要比較來源以查看地圖文件中是否有條目。如果沒有,那麼代碼不會被編譯 - 可能是死代碼(可能是因爲如果它是組件,那麼它可能是你不使用該功能)。

+0

使用地圖文件是一個有趣的想法。如果我可以找到一種方法來生成代碼庫中的所有方法和第一類子例程的列表,請從地圖文件中的* Publics by Name *部分提取段的列表,然後比較兩個我可以創建的列表被接頭排除。 – 2010-11-19 20:38:49

0

在過去,我使用「生成彙編程序」功能編譯了Free Pascal源代碼,然後製作了一些簡單的在源代碼上運行的過濾程序。 (該位是非常有用的知道,智能鏈接完成使用鏈接「部分」粒度)

它有時會給你,爲什麼某些事情不smartlinked出來的見解(例如,因爲有一些表的引用可能是訪問的東西在初始化)

當然,德爾福是不是FPC,但是當你有提示要尋找什麼,這是一個問題在Delphi編譯後查看邊緣的點,看看它是否smartlinked或不。同樣,如果您想知道爲什麼某些代碼沒有被智能鏈接出來,分析一個編譯成FPC的彙編程序的小例子程序可以使原因很明顯。 (例如。您可以參考RTTI表找到它)

FPC路線允許使用系統化的路線來搜索這些測試的候選者。