Основы программирования в Linux
function sort: sortAn unconstrained function is called in a function body wheremodifications are checked. Since the unconstrained function may modifyanything, there may be undetected modifications in the checked function.(Use -modunconnomods to inhibit warning)debug0.c:36:17: Return value (type int) ignored: sort(array, 5)Result returned by function call is not used. If this is intended, cancast result to (void) to eliminate message. (Use -retvalint to inhibitwarning)debug0.c:37:14: Path with no return in function declared to return intdebug0.c:6:18: Variable exported but not used outside debug0: arrayA declaration is exported, but not used outside this module. Declarationcan use static qualifier. (Use -exportlocal to inhibit warning)debug0.c:14:13: Function exported but not used outside debug0: sortdebug0.c:15:17: Definition of sortdebug0.c:6:18: Variable array exported but not declared in header fileA variable declaration is exported, but does not appear in a headerfile. (Used with exportheader.) (Use -exportheadervar to inhibit warning)debug0.c:14:13: Function sort exported but not declared in header fileA declaration is exported, but does not appear in a header file. (Use-exportheader to inhibit warning)debug0.c:15:17: Definition of sortFinished checking - 22 code warnings$Утилита выражает неудовольствие по поводу объявления функций в старом стиле (не ANSI) и несоответствия типов значений, возвращаемых функциями, и самими величинами, которые они возвращают (или нет) в действительности. Эти предупреждения не влияют на работу программы, но должны быть выведены.
Она также обнаружила две реальные ошибки в следующем фрагменте кода:
/* 18 */ int s;/* 19 *//* 20 */ for(; i < n & s != 0; i++) {/* 21 */ s = 0;Средство splint определило (выделенные цветом строки предыдущего вывода), что переменная
используется в строке 20, но не была при этом инициализирована, и что операторsстоит на месте более обычного оператора&В данном случае старшинство оператора изменяет значение условия и создает проблему в программе.&&.Обе эти ошибки были исправлены при чтении исходного текста программы до запуска процесса отладки. Несмотря на то, что пример мало изобретателен и служит только для демонстрации, подобные ошибки регулярно возникают в реальных программах."
Средства, отслеживающие вызовы функций
Три утилиты —
,ctagsиcxref— формируют часть стандарта X/Open и, следовательно, должны включаться в системы, представляемые как системы UNIX с программными средствами разработки.cflowПримечаниеЭти утилиты и другие, упоминаемые в этой главе, могут не входить в состав вашего дистрибутива Linux. Если они пропущены, можно поискать их реализации в Интернете. Хорошая отправная точка (для дистрибутивов Linux, поддерживающих формат RPM-пакетов) — Web-сайты http://rpmfind.net и http://rpm.pbone.net. Можно попытаться поискать в нескольких репозитариях для конкретных дистрибутивов, включая http://ftp.gwdg.de/pub/opensuse/ для openSUSE, http://rpm.livna.org для Fedora и http://packages.slackware.it/ для Slackware.
ctagsПрограмма
создает алфавитный указатель функций. Для каждой функции вы получаете перечень мест в программе, где она применяется, как алфавитный указатель к книге.ctags<b>ctags [-a] [-f <i>filename</i>] <i>sourcefile sourcefile ...</i></b><b>ctags -x <i>sourcefile sourcefile ...</i></b>По умолчанию
создает в текущем каталоге файл с именем tags, содержащий для каждой функции, объявленной в любом из входных файлов исходного кода, строки следующего вида:ctagsannounce app_ui.c /^static void announce(void) /Каждая строка файла содержит имя функции, файл, в котором она объявлена, и регулярное выражение, которое можно использовать для поиска описания функции в файле. Некоторые редакторы, например Emacs, могут применять файлы этого вида для навигации в исходном тексте программы.
Кроме того, с помощью опции
в программе-х(если она доступна в вашей версии программы) вы можете формировать строки аналогичного вида в стандартном файле вывода.ctagsfind_cat 403 appui.с static cdc_entry find_cat(Можно перенаправить вывод в другой файл с помощью опции
и добавить его в конец существующего файла, указав опцию-f filename.-аcxrefПрограмма
анализирует исходный текст на языке С и формирует перекрестные ссылки. Она показывает, где в программе упоминается каждое символическое имя (переменная, директиваcxrefи функция). Программа создает отсортированный список с указанием места определения каждого идентификатора, которое помечается звездочкой, как показано далее:#defineSYMBOL FILE FUNCTION LINEBASENID prog.с -- *12 *96 124 126 146 156 166BINSIZE prog.с -- *30 197 198 199. 206BUFMAX prog.с -- *44 45 90BUFSIZ /usr/include/stdio.h -- *4EOF /usr/include/stdio.h -- *27argc prog.с -- 36prog.с main *37 61 81argv prog.с -- 36prog.с main *38 61