Как правильно настроить функции при предварительной обработке кода C / C ++ с помощью sed или awk?

Я хочу использовать свой код напрямую, предварительно обработав исходные файлы с помощью sed / awk. Я не могу использовать другие методы, такие как трассировка отладчика или опция gcc -finstrument-functions, В этом последнем случае адреса перебазируются некоторым образом, которым я не могу управлять, и я пропускаю соответствие с таблицей символов. Другие методы представлены Вот (ptrace, etrace, callgraph и т. д.) или Вот хорошо работать на простом примере, но не в моем реальном проекте.

Проблема заключается в том, что при обработке больших проектов с открытым исходным кодом стандарты написания функций различаются не только для файлов C и C ++, но часто в одном и том же файле. { может находиться в конце списка аргументов или в другой строке, структуры или присваивания могут использовать начальный {, делая простой разбор функции ложным.

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

sed 's/^{/{ENTRY/'

Итак, как надежно нацелить определения функций в коде C / C ++ с помощью регулярных выражений, используемых в sed или awk? Возможно, используя часть кода прекомпилятора gcc? Я ищу что-то, возможно, с полки, пожалуйста.

3

Решение

sed или же awk (или любой чисто текстовый подход) являются неправильными инструментами для обработки надежно C-код (и вы, вероятно, должны работать с предварительно обработанной формой).

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

Если использовать недавний НКУ Вы можете настроить его, используя ПЛАВИТЬСЯ (и добавьте свои проходы в GCC) — или с вашим собственным плагином в C ++.

При использовании Clang / LLVM Вы также можете настроить его, добавив свои проходы.

Coccinelle Инструмент также может быть актуальным.

Любой такой подход требует значительного объема работы (вероятно, недель), так как вам нужно будет подробно понять внутренние представления конкретного компилятора, который вы используете. И C достаточно сложен, чтобы сделать это нетривиальным.

7

Другие решения

Вы не можете сделать это с помощью любого инструмента, который не понимает конкретную версию C, на которой написан ваш код (например, C ++ или ANSI-C или C-99). В качестве тривиального примера — что означает «//» в «функции C»? Хорошо, если он находится внутри строки, это буквальная пара косых черт, и если он находится вне строки, это может быть начало комментария, если код C ++ или C-99, но это не начало комментария в ANSI-C. Что если он внутри /* ... // ... */? Если то, что выглядит как определение функции, следует за «//», это действительно функция?

Вы не говорите, что вы хотите сделать («предварительная обработка кода» нам ничего не говорит), но вы должны использовать что-то вроде того, что я написал на Удалить многострочные комментарии использовать gcc для удаления кода комментариев, а затем элемент красоты C, такой как «indent» или «cb», чтобы последовательно переформатировать код и / или взглянуть на «cscope» или «ccalls», если вы просто ищете инструмент для список функций.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector