Найти количество вызовов функций / макросов во время компиляции макроса

#c #function #macros

#c #функция #макросы

Вопрос:

У меня такая проблема, что я должен определить, сколько раз конкретный макрос / функция вызывается в моем коде? Я знаю, вы можете подумать, почему я не запускаю find / grep. Но моя проблема в том, что вызываемая функция / макрос выполняется в рамках определенного макроса времени компиляции. Поэтому я хотел бы найти количество вызовов только тогда, когда включен этот конкретный макрос во время компиляции. И я хочу найти количество вызовов во всем коде (статический анализ, а не время выполнения). Кодовая база довольно огромна (миллионы строк кода) и полностью написана на C в Linux. Я пытался использовать readelf, но на самом деле не смог извлечь необходимую информацию. Любая помощь была бы высоко оценена.

Заранее спасибо. ~N

Ответ №1:

Многие компиляторы C имеют флаг для вывода промежуточных выходных данных этапа предварительного процессора (с определенными соответствующими условными символами компиляции). Затем вы могли бы запустить find / grep для этого вывода.

Ответ №2:

Как насчет встраивания некоторого уникального слова (как MARKER в следующем) в указанный макрос и подсчета количества раз, когда это слово появляется?
Например, предполагая, что код a.c выглядит следующим образом:

 #define A f() MARKER
#define B A; A;
B
  

Количество, отображаемое маркером, будет получено с помощью команд типа
следующее:

 gcc -E a.c | sed -r 's/[^A-Za-z0-9_] /xa/g' | grep MARKER | wc -l
  

После измерения MARKER в макрокоманде необходимо будет удалить
или #define d очистить как:

 #define MARKER
  

Редактировать:
Если ваша система сборки make , вам может потребоваться добавить новое правило, подобное
перейдите к вашим текущим make-файлам, чтобы создать предварительно обработанный файл:

 SRCS = a.c

preprocessed: $(SRCS:.c=.i)

%.i: %.c
    $(CC) -E $(CPPFLAGS) -o $@ $<
  

Если все настройки были выполнены правильно,
с помощью make preprocessed и find -type f -name '*.i' или аналогичных
при выполнении команды будут получены все предварительно обработанные файлы.
Вероятно, это непростая работа.
Если вы столкнулись с трудностями,
Я бы предложил опубликовать это как новый вопрос.

Комментарии:

1. Большое спасибо Ise, я тоже думал об этом подходе, но не смог его использовать, поскольку не смог запустить «gcc -E test.c -o test.i» для файлов.. Когда я это делаю, это выдает некоторую катастрофическую ошибку, в которой говорится, что не удалось найти некоторые включаемые файлы и т.д. В моем проекте довольно много каталогов, и включаемые файлы разбросаны по нескольким местам.. Итак, я не совсем уверен, есть ли какие-либо параметры, которые мне нужно включить для запуска.. Извините, я знаю, что задаю довольно тривиальный вопрос..