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

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

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

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

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


person Shrinidhi    schedule 10.11.2011    source источник
comment
Что ж, всегда есть путь бедняка: удалить все функции fast_mem, скомпилировать, посмотреть список неразрешенных символов в ошибке ссылки, вернуть эти функции обратно, повторить.   -  person Nemo    schedule 10.11.2011


Ответы (4)


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

person jacknad    schedule 10.11.2011

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

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

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

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

person Basile Starynkevitch    schedule 10.11.2011

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

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

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

person Rob Latham    schedule 10.11.2011

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

person ovk    schedule 10.11.2011