Как реализовать стандартное извлечение функции C? - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть задача «боль в $$», чтобы извлечь / проанализировать все стандартные функции C, которые были вызваны в функции main ().Пример: printf, fseek и т.д ...

В настоящее время мой единственный план - прочитать каждую строку внутри main () и найти, существуют ли стандартные функции C, проверив список стандартных функций C, которые я будутакже определяйте (#define CFUNCTIONS "printf ...")

Как вы знаете, существует очень много стандартных функций C, поэтому определение их всех будет таким раздражающим.

Есть идеи, как проверить, является ли строка стандартной функцией C?

Ответы [ 4 ]

1 голос
/ 19 ноября 2010

Синтаксический анализ исходного кода на первый взгляд кажется простым, но, как уже отмечали другие, возможность программиста далеко уйти с поводка с помощью #define s и #include s довольно распространена.Если не известно, что конкретная программа, которая должна быть проанализирована, является легкой в ​​отношении подстановки текста, сложность синтаксического анализа произвольного исходного кода на языке Си является значительной.объектный модуль.Скомпилируйте исходный модуль, но не связывайте его.Чтобы еще больше упростить, обработайте файл, содержащий main, чтобы удалить все другие функции, но оставьте объявления на своих местах.

В зависимости от требований, есть два способа выполнить задачу:

  1. Напишите программу, которая открывает объектный модуль и выполняет итерацию по таблице внешних ссылок.Если символ соответствует одному из интересных имен функций, перечислите его.Многие платформы имеют библиотечные функции для анализа объектного модуля.
  2. Написать командный файл или скрипт, который использует инструменты разработчика для проверки объектных модулей.Например, в Linux команда nm перечисляет внешние ссылки с U.
1 голос
/ 19 ноября 2010

Если вы слышали о cscope, попробуйте просмотреть базу данных, которую он генерирует. В интерфейсе cscope доступны инструкции для перечисления всех функций, которые вызвала данная функция.

Если вы посмотрите список вызовов из main (), вы сможете значительно сузить свою работу.

Если вам нужно разобрать вручную, я предлагаю начать с включенных стандартных заголовков. Они должны дать вам хорошее представление о том, какие функции вы можете ожидать увидеть в main ().

В любом случае, работа звучит нетривиально и интересно.

0 голосов
/ 19 ноября 2010

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

#define OUTPUT(foo) printf("%s\n",foo)

main()
{
   OUTPUT("Ha ha!\n");
}

Так что вы, вероятно, захотите прогнать свой код через препроцессор, прежде чем проверять, какие функции вызываются из main ().Тогда у вас могут быть такие случаи:

some_func("This might look like a call to fclose(fp), but surprise!\n");

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

Я выиграл 'не поднимать триграфы ... это был бы просто бессмысленный садизм.:-) В любом случае, удачи и удачного кодирования!

0 голосов
/ 19 ноября 2010

Поначалу задача может показаться простой, но для того, чтобы быть на 100% уверенным, вам нужно будет проанализировать C-файл. Недостаточно просто искать имя, нужно также знать контекст, т.е. когда проверять идентификатор, сначала, когда вы определили, что идентификатор является функцией, вы можете проверить, является ли она стандартной функцией c-runtime.

(плюс, я думаю, это делает задачу более интересной: -)

...