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 より少なくすることができます。
cflow は、-D、-I、-U の各オプションを cc と同様に解釈するほか、次のオプションを解釈します。
「呼び出し元 : 呼び出し先」の関係を逆にし、各関数の呼び出し元を示す反転リストを作成します。このリストはまた、呼び出し先に従って辞書式順序でソートされます。
外部データシンボルと静的データシンボルを含めます。デフォルトでは、関数だけがフローグラフに含まれます。
下線で始まる名前を含めます。デフォルトでは、このような関数は (-ix を使用した場合はデータも) 除外されます。
num は、フローグラフを打ち切る深さを指定する 10 進整数です。デフォルトでは、この数は非常に大きくなっています。打ち切る深さを正でない整数に設定しようとすると無視されます。
as(1), cc(1) lex(1), lint(1), nm(1), pr(1), yacc(1)
複数の定義が存在する場合は報告し、最初のものだけを採用します。
lex および yacc で作成されたファイルでは、行番号宣言の順序が変更されているため、cflow が混乱する可能性があります。正しい結果を得るには、cflow に yacc または lex の入力を供給してください。