CFLOW(1) 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(), |2 f: int(), |3 h: <> |4 i: int, |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.