Инструмент для составления списка вызывающих функцию в C?

#c #doxygen #cscope

#c #doxygen #cscope

Вопрос:

Предыстория:
В конкретном проекте имеется около пары тысяч функций в более чем сотне файлов. Функции разделены для размещения в двух банках памяти кода — fast_mem и slow_mem. Но теперь, поскольку область fast_mem ограничена, в ней не хватает места для размещения любых новых изменений кода.

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

Вопрос:
Итак, возвращаясь к вопросу, существует ли инструмент, который может составлять список вызывающих всех функций в проекте? С помощью этого я могу продолжить и удалить функции в fast_mem, у которых нет вызывающих.

Я использую cscope для просмотра кода вместе с ctags. Но для этого требуется ввести имя функции вручную. Можно ли как-то автоматизировать это, чтобы получить полный список?
Я также попробовал Doxygen с его функцией построения графика вызывающих. Однако результат не так удобен в использовании.

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

1. Ну, всегда есть способ «бедняка»: удалите все функции fast_mem, скомпилируйте, посмотрите на список неразрешенных символов в ошибке ссылки, верните эти функции обратно, повторите.

Ответ №1:

Я использую Scientific Toolworks, понимаю

Ответ №2:

Если ваш компилятор является недавним GCC (или если вы можете переключиться на GCC 4.6, возможно, в качестве кросс-компилятора), вы могли бы разработать плагин GCC или расширение MELT, чтобы выяснить это.

Конечно, если вы, например, выполняете трюки с указателями на функции (например, арифметику непереносимого указателя на указателях на функции), исходный вопрос неразрешим.

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

И, возможно, проект настолько важен, что стоит настроить компилятор для достижения лучшего (автоматического или полуавтоматического) компромисса между fast_mem amp; slow_mem . Обычно это отличный вариант для плагинов GCC или расширений MELT (но это занимает некоторое количество рабочих дней или недель, а не часов, потому что вам нужно понимать внутренние представления GCC для настройки GCC), и вы, вероятно, единственный, кто мог бы это сделать (потому что ваш вопрос очень специфичен для некоторых странных систем).

Ответ №3:

Давайте предположим, что не происходит никаких странных игр с указателями функций. Затем вы можете отключить малоиспользуемый cflow:

http://www.gnu.org/software/cflow/

Создайте «обратный индекс» с флагом -r. вы получите список каждой функции, за которым следует место ее вызова. Вы можете передать ему несколько файлов.

Ответ №4:

Вы можете использовать инструмент статического анализа кода, такой как cppcheck. Если вы вызовете его с --enable=unusedFunction параметром, он предупредит о неиспользуемой функции.