CFLOW(1)

НАЗВАНИЕ
cflow - построение графа вызовов C-программ

СИНТАКСИС


  cflow  [-r] [-ix] [-i_] [-dчисло] файл ...

ОПИСАНИЕ
Команда cflow анализирует набор C-, YACC-, LEX-, а также ассемблерных и об ектных файлов и пытается построить граф внешних ссылок. Файлы с расширениями .y (для YACC), .l (для LEX), .c (для C) и .i (для промежуточного кода) соответствующим образом препроцессируются (файлы .i игнорируются), а затем подвергаются первому проходу программы lint(1). (Допускается использование опций -I, -D и -U препроцессора C.) Файлы с расширением .s ассемблируются, и информация извлекается (как и в случае .o-файлов) из таблицы имен. Результат всей этой нетривиальной обработки накапливается и преобразуется в граф внешних ссылок, который направляется на стандартный вывод.

Строки выходной информации пронумерованы, начиная с 1. За номером следует несколько символов табуляции, указывающих уровень вложенности. Затем идет имя глобального об екта (обычно выдаются только функции, не определенные как внешние, и с именами, не начинающимися с подчеркивания; см. ниже описание опции включения -i), двоеточие и определение глобального об екта. Если определение извлечено из C-текста, оно состоит из описания типа (например, char *), а также из заключенных в угловые скобки имени исходного файла и номера строки, в которой найдено данное определение. В определениях, взятых из об ектных файлов, информативным является только имя файла. Начальные подчеркивания из C-подобных внешних имен удаляются.

После того, как определение имени напечатано, ссылки на него содержат только номер соответствующей выходной строки. Для неопределенных ссылок печатается <>.

В качестве примера рассмотрим следующий файл f1.c:


   int  i;



   main()

   {

      f();

      g();

      f();

   }



   f()

   {

      i = h();

   }

Команда

   cflow  -ix f1.c

сформирует результат:

   1       main: int(), <file.c 4>

   2               f: int(), <file.c 11>

   3                       h: <>

   4                       i: int, <file.c 1>

   5               g: <>

Если уровень вложенности слишком большой, можно использовать опцию -e команды pr(1), чтобы табуляция вызывала сдвиг менее чем на восемь позиций.

В дополнение к опциям -D, -I и -U, которые интерпретируются так же, как в командах cc(1) и cpp(1), команда cflow имеет следующие опции:

-rЗаменить отношение "вызывающий-вызываемый" на обратное, чтобы получить инвертированный граф, показывающий, кто вызывает каждую из функций. Вызываемые функции упорядочиваются по алфавиту.
-ixУчитывать внешние и статические ссылки на данные. По умолчанию в граф вызовов включаются только функции.
-i_Учитывать имена, начинающиеся с подчеркивания. По умолчанию такие функции (и данные, если используется опция -ix) в граф не включаются.
-dчисло Отсекать граф вызовов на уровне, который определяется целым десятичным числом. По умолчанию это очень большое число. Уровень отсечения может быть только положительным.

СМ. ТАКЖЕ
as(1), cc(1), lex(1), lint(1), nm(1), pr(1), yacc(1).

ДИАГНОСТИКА
Команда сообщает о некорректных опциях и о множественных определениях, из которых учитывается только первое. Другие сообщения могут исходить от различных используемых программ (например от C-препроцессора).

СЮРПРИЗЫ
В файлах, сформированных программами lex(1) и yacc(1), используются операторы изменения нумерации строк, что может ввести в заблуждение cflow. Чтобы получить правильный результат, натравите cflow на входные файлы yacc'а или lex'а.

Если нет опции -i_, но есть имена, начинающиеся с подчеркивания, результат может получиться неверным.

При наличии косвенной рекурсии программа cflow работает неправильно, если только не указана опция -r. даленным компьютерам.

СМ. ТАКЖЕ
chroot(2).

ДИАГНОСТИКА
При успешном завершении результат равен 0; в случае ошибки возвращается -1, а переменной errno присваивается код ошибки.