НАЗВАНИЕ
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 присваивается код ошибки.