5

GUIからC計算コードを分割するためにリファクタリングしているレガシーCコードのコレクションがあります。これは、K&R スタイルの宣言である非常に再帰的な数学的コア コードによって複雑になります。関数パラメーターのネストされた使用のために、これらをANSI宣言に変換する試みをすでに放棄しました(最後の4つのコンパイラエラーを取得できませんでした)。

いくつかのファイルを純粋な DLL に移動し、公開する最小限のインターフェイスを決定する必要があります。これには、型付きインターフェイスを公開するためのラッパー関数の書き込みが必要になります。

重要なソース ファイルを Doxygen @callergraph マークアップでマークアップしたので、個々の関数について有益なグラフが生成されます。それを超えてやりたいことは、これらのグラフを統合して、外の世界に公開される関数の最も狭い境界を決定できるようにすることです。

元のヘッダー ファイルは役に立ちません。すべてが型指定されていない C 関数として公開されます。

何百もの関数があるため、生成されたコーラーグラフを簡単に検査するのは大変です。

ある種の DOT マージ ツールを作成することを検討しています。

これがグラフィカルなソリューションであることに執着しているわけではありません。誰かが別の分析ツール (無料または比較的安価) または Doxygen の XML 出力を使用して同じ目標を達成する手法を提案できれば、非常に嬉しく思います。

ファイル レベルで融合された callergraph は、単純なリストよりもクライアントのドキュメントに一定の魅力があります :-)

4

3 に答える 3

6

Doxyfile で、次のように設定します。

GENERATE_XML = YES

その後、XML ファイルでコール グラフを見つけることができます。callergraph でマークされた関数ごとに、<referencedby>使用できる要素が出力に表示されます。これは、私の C ファイルの 1 つからのサンプルです。

  <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

于 2009-08-28T21:08:53.980 に答える
1

同様の要件がありました。一連のドット ファイルを 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 は、ソース ファイル名の前に出力ドット ファイルの名前を付けます。関数ごとに 1 つのドット ファイルが生成されます

4) マージする doxygen で生成されたドット ファイルのリストを提供します。例えば:

./doxydotmerge.pl  `ls html/ssd_*_8c*_cgraph.dot  | grep -v test | grep -v buf`
于 2013-02-19T23:38:50.930 に答える
0

Scientific Toolworks を使用して、システム全体のコール グラフを確認できます。

分析とカットを自動化したい場合は、DMS Software Reengineering Toolkit を検討してください。C の完全なコール グラフを計算でき (関数ポインターのポイント ツー分析を備えています)、3,500 万行のコードのシステムで証明されています。検査する完全なシステム DOT ファイルを生成します。それらはかなり大きいですが、サブセットを選択して見ることができます。フロー分析とコール グラフを参照してください。

于 2009-08-16T19:23:40.350 に答える