cflow(1)
NAME
cflow − generate C flow graph
SYNOPSIS
cflow [-r] [-ix] [-i_] [-d num] [-Y_] files
DESCRIPTION
cflow analyzes a collection of C, YACC, LEX, assembler, and object files, and attempts to build a graph charting the external references. Files suffixed in .y, .l, .c, and .i are processed by yacc(1), lex(1), and cpp(1) as appropriate (.i files are bypassed), then run through the first pass of lint(1). (The -I, -D, and -U options of cpp(1) are also understood.) Files suffixed with .s are assembled, and information is extracted (as in .o files) from the symbol table. The output of all this non-trivial processing is collected and turned into a graph of external references which is displayed upon the standard output.
Each line of output begins with a reference (i.e., line) number, followed by a suitable number of tabs indicating the level. Next comes the name of the global (normally only a function not defined as an external or beginning with an underscore — see below for the -i inclusion option), a colon, and its definition. For information extracted from C source, the definition consists of an abstract type declaration (such as char *), and, delimited by angle brackets, the name of the source file and the line number where the definition was found. Definitions extracted from object files indicate the file name and location counter under which the symbol appeared (e.g., text). Leading underscores in C-style external names are deleted.
Once a definition of a name has been printed, subsequent references to that name contain only the reference number of the line where the definition can be found. For undefined references, only <> is printed.
As an example, given the following in file.c:
int i;
main()
{
f();
g();
f();
}
f()
{
i = h();
}
the command
cflow -ix file.c
produces the output
1 main: int(), <file.c 4>
2 f: int(), <file.c 11>
3 h: <>
4 i: int, <file.c 1>
5 g: <>
When the nesting level becomes too deep, the -e option of pr(1) can be used to compress the tab expansion to something less than every eight spaces.
The following options are interpreted by cflow:
-r Reverse the caller:callee relationship producing an inverted listing showing the callers of each function. The listing is sorted in ascending collation order by callee (see Environment Variables below).
-ix Include external and static data symbols. The default is to include only functions in the flowgraph.
-i_ Include names that begin with an underscore. The default is to exclude these functions (and data if -ix is used).
-dnum The num decimal integer indicates the depth at which the flowgraph is cut off. By default this is a very large number. Attempts to set the cutoff depth to a non-positive integer are rejected.
-Y Enable support of multi-byte characters inside string literals and comments. Note that 8-bit parsing is always supported. See hpnls(5) for more details on international code set support.
EXTERNAL INFLUENCES
Environment Variables
LC_COLLATE determines the collating order output by the -r option.
If LC_COLLATE is not specified in the environment or is set to the empty string, the value of LANG is used as a default. If LANG is not specified or is set to the empty string, a default of “C” (see lang(5)) is used instead of LANG. If any internationalization variable contains an invalid setting, cflow behaves as if all internationalization variables are set to “C”. See environ(5).
DIAGNOSTICS
Complains about bad options. Complains about multiple definitions and only believes the first. Other messages may come from the various programs used (such as cpp).
WARNINGS
Files produced by lex and yacc cause reordering of line number declarations which can confuse cflow. To get proper results, feed cflow the yacc or lex input.
SEE ALSO
as(1), cc(1), cpp(1), lex(1), lint(1), nm(1), pr(1), yacc(1).
STANDARDS CONFORMANCE
cflow: SVID2, XPG2, XPG3
Hewlett-Packard Company — HP-UX Release 10.01: May 1995