Найдите заголовочный файл, определяющий функцию C.

StackOverflow https://stackoverflow.com/questions/816366

  •  03-07-2019
  •  | 
  •  

Вопрос

Не должно быть сложно, правда?Верно?

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

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

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

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

AFS.xs:2796: error: implicit declaration of function ‘pioctl’
Это было полезно?

Решение

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

gcc -E test.c -o test.i
grep pioctl -C10 test.i

Другие советы

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

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

Худшие сценарии развития событий:

  • Прототипы в стиле K&R
  • Макросы скрывают определение
  • Неявное объявление (согласно вашему ответу)

Рассматривали ли вы возможность использования cscope (Доступна с ИсточникForge)?

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


На почти столь же древнем 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 найденных экземпляров, похоже, представляют собой использование функции, ссылки на документацию, примечания к выпуску, журналы изменений и тому подобное.

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

Изменить . Отлично! Я нашел дымящийся пистолет:

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

Хотя на первоначальный общий вопрос был дан ответ, если кто-нибудь придет на эту страницу, задаваясь вопросом, где найти заголовочный файл, определяющий 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 и другими материалами.

Разве в резюме на справочной странице обычно не говорится?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top