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 присваивается код ошибки.