cflow(1)

名前
cflow - C フローグラフの作成

形式
cflow [-r] [-ix] [-i_] [-dnum] files

機能説明
cflow コマンドは、 C 、 yacc 、 lex アセンブラのソースファイル、 中間ファイル、オブジェクトファイルをまとめて解析し、 そこから外部関数参照のグラフを作成します。 .y、.l、.c のいずれかの接尾辞が付いたファイルは、 それぞれ yacc 、 lex 、C のコンパイラによって処理します。 前処理された結果、接尾辞 .i が付いたファイルは、 lint の第 1 段階までの処理を行います。 接尾辞 .s が付いたファイルはアセンブルします。 アセンブルされたファイル、接尾辞 .o が付いたファイルは、 それぞれのシンボルテーブルから抽出された情報を持っています。 これらの結果を収集して外部参照のグラフを作成し、それを標準出力に書き込みます。

出力の各行には先頭から順に、参照番号、レベルを示す適切な数のタブ、 大域シンボルの名前、コロン、大域シンボルの定義が 示されます。通常、出力の対象となるのは 下線で始まらない関数名だけです (下記の -i オプションを参照)。 C のソースから抽出した場合、 定義の部分には抽象型宣言 (char * など) と、その後ろに ソースファイルの名前とその定義が存在する行番号とが 山括弧 <> で囲んで示されます。 オブジェクトファイルから抽出された定義は、 ファイル名とシンボルが現れた場所のロケーション・カウンタ ( text など) を示します。 C 形式の外部名における先頭の下線は削除されます。 ある名前の定義が一度出力されると、それ以降で同じ名前を参照している場所は、 その定義が存在する行の参照番号だけが示されます。 未定義のシンボルを参照している場所では、<> だけが出力されます。

たとえば、file.c に次のコードが含まれているとします。

    int	i;
    main()
    {
    	f();
    	g();
    	f();
    }
    f()
    {
    	i = h();
    }
コマンド

    cflow -ix file.c

を実行すると、次の出力が得られます。

    1	main: int(), <file.c 4>
    2		f: int(), <file.c 11>
    3			h: <>
    4			i: int, <file.c 1>
    5		g: <>

入れ子のレベルがあまりにも深くなるときは、 パイプを使って cflow の出力を pr コマンドに渡し、 その -e オプションでタブのカラム数を 8 より少なくすれば、 各行を短くすることができます。

cc で指定したときと同じように解釈される -D 、 -I 、 -U の各オプションのほか、 cflow は次のオプションを解釈します。

-r  「呼び出し元 : 呼び出し先」の関係を逆にし、 各関数の呼び出し元を示す反転リストを作成します。 このリストはまた、 呼び出し先に従って辞書式順序でソートされます。

-ix 外部データ・シンボルと静的データ・シンボルを含みます。 デフォルトでは、関数だけがフローグラフに含まれます。

-i_ 下線で始まる名前も含みます。 デフォルトでは、これらの関数が除外されます ( -ix を使用したときには、データも除外の対象になります)。

-dnum
    num は、フローグラフの深さを指定する 10 進整数です。 デフォルトでは、この数値が非常に大きくなっています。 num がゼロ以下のときは無視されます。

関連項目
as(1)、 cc(1)、 lex(1)、 lint(1)、 nm(1)、 pr(1)、 yacc(1)

診断
同じ名前に対して複数の定義が行われていた場合は、 最初に見つけた定義だけを採用します。

注意事項

lex や yacc で作成されたファイルでは、 行番号宣言の順序が変更されているため、 cflow が混乱する可能性があります。正しい結果を得るために、 yacc および lex の入力ファイルを指定してください。