Как извлечь имя функции из функции Main () из источника C - PullRequest
2 голосов
/ 24 октября 2010

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

Пример исходного кода:

int main()
{
    int a = functionA(); // functionA must be extracted
    int b = functionB(); // functionB must be extracted
}

Как вы знаете, единственное, что я могу использовать в качестве маркера / знака для идентификации этих вызовов функций, это скобка "()". Я уже рассмотрел несколько факторов в реализации этого извлечения имени функции. Это:
1. функции могут иметь параметры. Пример: функция A (100)
2. Операторы цикла. Пример: while () 3. Другие операторы. Пример: if (), иначе if () 4. Другой оператор между вызовами функций без пробелов. Пример: functionA () + functionB ()

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

Примечание: это на языке C ++ ...

Ответы [ 3 ]

3 голосов
/ 24 октября 2010

Вы можете написать анализатор Small C ++, комбинируя FLEX (или LEX) и BISON (или YACC).

  1. Взять грамматику C ++
  2. Создать синтаксический анализатор программы C ++ с указаннымtools
  3. Заставьте эту программу подсчитать количество вызовов функций, которые вы упоминаете

Возможно, это слишком сложно для того, что вам нужно сделать, но это, безусловно, должно сработать.А LEX / YACC - потрясающие инструменты!

2 голосов
/ 24 октября 2010

GNU cflow может быть полезным

2 голосов
/ 24 октября 2010

Один из вариантов - написать свой собственный токенайзер C (просто: будьте осторожны, чтобы пропустить строки, символьные константы и комментарии), и написать простой парсер, который считает количество открытых { и находитэкземпляры идентификатора + ( внутри.Однако это не будет на 100% правильно.Недостатком этой опции является громоздкость реализации директив препроцессора (например, #include и #define): может быть функция, вызываемая из макроса (например, getchar), определенного в файле #include.

Опция, которая работает на 100%, - это компиляция файла .c в файл сборки, например, gcc -S file.c, и поиск инструкций call в file.S.Аналогичным вариантом является компиляция файла .c в объектный файл, например, gcc -c file.c, создание дампа дизассемблирования с помощью objdump -d file.o и поиск инструкций call.

Другой вариант - поиск анализатораиспользуя Clang / LLVM.

...