Найти заголовочный файл, который определяет функцию C - PullRequest
4 голосов
/ 03 мая 2009

Не должно быть трудно, верно? Правильно?

В настоящее время я трачу базу кода OpenAFS, чтобы найти определение заголовка pioctl. Я бросил все, что у меня есть: проверил ctags, нашел исходный код для pioctl и т. Д. Самое близкое, что я нашел, - это наличие файла pioctl_nt.h, который содержит определение, кроме на самом деле это не то, что я хочу, потому что ни один из кода пользовательского пространства не включает его напрямую, и это специфично для Windows.

Теперь я не ожидаю, что вы пойдете и загрузите кодовую базу OpenAFS и найдете для меня файл заголовка. Мне, однако, любопытно: какие ваши методы поиска заголовочного файла вам нужны, когда все остальное терпит неудачу? Каковы наихудшие сценарии, которые могут привести к тому, что grep для pioctl в кодовой базе не даст ничего похожего на определение функции?

Я также должен отметить, что у меня есть доступ к двум независимым программам пользовательского пространства, которые сделали это правильно, поэтому теоретически я мог бы выполнить O (n) поиск функции. Но ни один из заголовочных файлов мне не показывается, а n большое ...

Редактировать: Непосредственная проблема была решена: pioctl () определяется неявно, как показано следующим образом:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’

Ответы [ 6 ]

4 голосов
/ 03 мая 2009

Если grep -r и ctags терпят неудачу, то это, вероятно, определяется как результат некоторых неприятных макросов. Вы можете попробовать создать простейший файл, который вызывает pioctl() и успешно компилируется, а затем предварительно обработать его, чтобы посмотреть, что произойдет:

gcc -E test.c -o test.i
grep pioctl -C10 test.i
2 голосов
/ 03 мая 2009

Есть опции компилятора для отображения выходных данных препроцессора. Попробуйте это? В ужасной ситуации, когда моя голова была совершенно пуста от любого возможного определения, опция -E (в большинстве компиляторов c) ничего не делает, кроме как выкидывает предварительно обработанный код.

По запрашиваемой информации : Обычно я просто записываю компиляцию рассматриваемого файла, поскольку он выводится на экран, быстро копирует и вставляет и вставляет -E сразу после вызова компилятора. Результат будет выводить вывод препроцессора на экран, поэтому перенаправьте его в файл. Просмотрите этот файл, так как все макросы и глупости уже решены.

Наихудшие сценарии:

  • Прототипы в стиле K & R
  • Макросы скрывают определение
  • Скрытая декларация (за ваш ответ)
1 голос
/ 03 мая 2009

Рассматривали ли вы использование cscope (доступно из SourceForge )?

Я использую его для некоторых довольно значительных кодовых наборов (более 25 000 файлов, размером до 20 000 строк в файле) с хорошим успехом. Для создания перекрестной ссылки на древнем Sun E450 требуется некоторое время, чтобы вывести список файлов (5–10 минут) и больше (20–30 минут), но я считаю результаты полезными.


На почти одинаково древнем Mac (32-битные процессоры PPC с частотой 1 ГГц), запуск cscope на исходном коде OpenAFS (1.5.59) дает довольно много мест, где функция объявлена, иногда встроенная в код, иногда в заголовках. Для сканирования файлов 4949 потребовалось несколько минут, создав файл cscope.out размером 58 МБ.

  • OpenAFS-1.5.59 / SRC / SYS / sys_prototypes.h
  • openafs-1.5.59 / src / aklog / aklog_main.c (вместе с комментарием «Почему AFS не предоставляет эти прототипы?»)
  • OpenAFS-1.5.59 / SRC / SYS / pioctl_nt.h
  • openafs-1.5.59 / src / auth / ktc.c включает определение для PIOCTL
  • openafs-1.5.59 / src / sys / pioctl_nt.c обеспечивает реализацию этого
  • openafs-1.5.59 / src / sys / rmtsysc.c обеспечивает его реализацию (и иногда вместо этого afs_pioctl ())

Остальные из 184 найденных экземпляров, похоже, используют функцию, или ссылки на документацию, или заметки о выпуске, журналы изменений и т. П.

0 голосов
/ 10 мая 2014

Хотя на первоначальный общий вопрос был дан ответ, если кто-нибудь придет на эту страницу, задаваясь вопросом, где найти файл заголовка, который определяет pioctl:

В текущих выпусках OpenAFS (1.6.7) прототип pioctl определен в sys_prototypes.h. Но в то время, когда этот вопрос первоначально задавался, этот файл не существовал, и не было никакого прототипа для pioctl, видимого снаружи дерева кода OpenAFS.

Однако большинство пользователей pioctl, вероятно, хотят или, по крайней мере, согласны с использованием lpioctl ("local" pioctl), который всегда выдает системный вызов на локальном компьютере. Прототип для этого есть в afssyscalls.h (и в наши дни также sys_prototypes.h).

Однако в наши дни самым простым вариантом является просто использование libkopenafs. Для этого включите kopenafs.h, используйте функцию k_pioctl и создайте ссылку на -lkopenafs. Как правило, это гораздо более удобный интерфейс, чем попытка связать его с OpenAFS libsys и другими вещами.

0 голосов
/ 03 мая 2009

Текущая рабочая теория, которую мы определили, покинув препроцессор и ничего не найдя, заключается в том, что OpenAFS позволяет компилятору выводить прототип функции, поскольку он возвращает целое число и принимает указатель, целое число указатель, целое число в качестве его параметров. Я буду иметь дело с этим, просто определяя это сам.

Редактировать : Отлично! Я нашел дымящийся пистолет:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’
0 голосов
/ 03 мая 2009

Разве это обычно не говорится в кратком обзоре страницы руководства?

...