cflow [-r] [-ix] [-i_] [-dnum] files
cflow 命令分析 C、yacc、lex、汇编程序和对象文件的集合,并生成一个图形表示外部函数引用。后缀为 .y、.l 和 .c 的文件视情况由 yacc、lex 和 C 编译器处理。然后,通过 lint 的首次传递运行预处理文件和后缀为 .i 的文件的结果。后缀为 .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: <>
如果嵌套级别变得太深,可使用 -e 选项将 cflow 的输出传送至 pr 命令,以将标签扩展压缩到小于每八个空格的间隔。
除 -D、-I 和 -U 选项(由 cc 按照本意解释)之外,以下选项将由 cflow 解释:
反转 "caller:callee" 关系将生成一个反向列表,显示各个函数的调用方。此列表还按被调用方以辞典编纂顺序排序。
包括外部和静态数据符号。缺省设置是仅包括流程图中的函数。
包括以下划线开头的名称。缺省设置是排除这些函数(如果使用 -ix,也会排除数据)。
num 十进制整数表示切断流程图的深度。缺省情况下,此数字非常大。尝试将切断深度设置为非正整数将被忽略。
as(1)、cc(1)、lex(1)、lint(1)、nm(1)、pr(1)、yacc(1)
报告存在多个定义,仅相信第一个。
lex 和 yacc 生成的文件会导致行号声明重新排序,这样可能会使 cflow 感到混乱。要获得正确的结果,请向 cflow 提供 yacc 或 lex 输入。