2009-01-26 65 views
4

我有一個遺留C代碼的集合,我正在重構從GUI分割C計算代碼。這種複雜的遞歸數學核心代碼是K & R樣式聲明。我已經放棄了由於嵌套使用函數參數而將這些轉換爲ANSI聲明的嘗試(只是無法獲得最後4個編譯器錯誤)。合併C Callergraphs與Doxygen或確定所有調用的聯合

我需要將某些文件移動到一個純粹的DLL中,並確定最小化的公開接口,這將要求封裝函數編寫來發佈一個類型化的接口。

我已經使用Doxygen @callergraph標記標記了關鍵源文件,因此爲各個函數生成了信息圖。除此之外,我想要做的是合併這些圖形,以便我可以確定暴露於外部世界的功能的最窄邊界。

原始的頭文件沒有用 - 它們將一切都暴露爲無類型的C函數。

有幾百個功能,如此簡單的檢查生成的調用者圖是痛苦的。

我正在考慮寫一些DOT合併工具 - 設置DOT_CLEANUP = NO使Doxygen離開中間DOT文件,而不是保留它們生成的PNG文件。

我並不迷戀這是一個圖形解決方案 - 如果有人可以建議使用Doxygen的XML輸出來實現相同目標的替代分析工具(免費或相對便宜)或技術,我會非常高興。

在文件級別合併一個callergraph確實有客戶端的文檔一定的吸引力,而不是一個簡單的列表:-)

+0

請問您可以粘貼一些輸入示例(我知道有DOT和XML格式)? – 2009-05-22 17:15:18

回答

5

在你的Doxyfile,設置

GENERATE_XML = YES 

,然後你可以找到在XML文件中的調用關係圖。對於標有調用者圖的每個函數,您可以在輸出中找到可供使用的<referencedby>元素。下面是從我的C文件中的一個樣本:

<memberdef kind="function" id="spfs_8c_1a3" 
      prot="public" static="yes" const="no" explicit="no" 
      inline="no" virt="non-virtual"> 
    <type>svn_error_t *</type> 
    <definition>svn_error_t * init_apr</definition> 
    <argsstring>(apr_pool_t **ppool, int *argc, char const *const **argv)</argsstring> 
    <name>init_apr</name> 
    <!-- param and description elements clipped for brevity ... --> 
    <location file="src/spfs.c" line="26" bodystart="101" bodyend="120"/> 
    <referencedby refid="spfs_8c_1a13" compoundref="spfs_8c" 
        startline="45" endline="94">main</referencedby> 
    </memberdef> 

因此,對於每一個memberdef/referencedby對,你有一個主叫 - 被叫關係,您可以通過XSLT搶:

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="//memberdef[@kind eq 'function']"/> 
    </xsl:template> 

    <xsl:template match="memberdef"> 
     <xsl:variable name="function-name" 
         select="concat(definition, argsstring)"/> 
     <xsl:for-each select="referencedby"> 
      <xsl:value-of select="concat(./text(), ' calls ', $function-name, '&#xA;')"/> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

,讓你每個主叫 - 被叫這樣一行:

main calls svn_error_t * init_apr(apr_pool_t **ppool, int *argc, char const *const **argv) 

你要調整,在跨邊最少的切割方式向圖XSLT,然後分區。嗚呼,NP完全問題!幸運的是,關於這個問題有很多論文,其中一些在這裏:http://www.sandia.gov/~bahendr/partitioning.html

0

你可以使用科學Toolworks看到你的整個系統的調用關係圖。

如果您想自動執行分析和裁剪,可以考慮使用DMS軟件重新設計工具包 。它可以計算C 的完整調用圖表(完成功能指針的點對點分析),並且已經爲具有3500萬行代碼的系統驗證了 。它會產生完整的系統DOT文件 ;他們相當大,但你可以挑選出子集來看。見flow analysis and call graphs

1

我有類似的要求。 寫了一個perl腳本,將一組點文件合併爲一個點文件。

https://github.com/bharanis/scripts/blob/master/doxygen_dot_merge.pl

合併多個doxygen的產生點文件。 這對於爲文件或一堆文件生成呼叫映射非常有用。

1)該命令將從doxygen放置所有html,dot和map文件的html目錄之外運行。

2)此命令假定在doxygen的使用扁平的目錄結構 CREATE_SUBDIRS = NO

3)的doxygen前綴源文件名到輸出點的文件的名稱。每個功能生成一個點文件

4)提供要合併的doxygen生成的點文件列表。 例如:

./doxydotmerge.pl `ls html/ssd_*_8c*_cgraph.dot | grep -v test | grep -v buf`