Инструменты для поиска неиспользуемых объявлений функций?

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
2 764
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Если вы индексируете код с помощью Doxygen, вы можете увидеть, откуда ссылаются на каждую функцию. Однако вам придется просматривать каждый класс (по 1 HTML-странице на класс) и искать те, у которых нет ничего, указывающего на них.

В качестве альтернативы вы можете использовать ctags для создания списка всех функций в коде, а затем использовать objdump или другой аналогичный инструмент для получения списка всех функций в файлах .o, а затем сравнить эти списки. Однако это может быть проблематично из-за искажения имени.

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

Ответ принят как подходящий

Если возможно, вы можете создать файл test.cpp для вызова их всех, компоновщик пометит те, у которых нет кода, как неразрешенные, таким образом, ваш тестовый код нужно только скомпилировать и не беспокоиться о фактическом запуске.

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

Kris Kumler 19.09.2008 20:41

Согласен, я больше думал о том, чтобы протестировать реорганизуемую область. Это не долгосрочное решение, другим подходом может быть использование вывода VERBOSE в компоновщике.

titanae 20.09.2008 12:25

У меня есть С ++ ftplugin для vim, который может проверять и сообщать о несоответствующих функциях - vimmers, набор ftplugin еще не прост в установке. Ftplugin основан на результатах ctags (следовательно, его эвристический можно легко адаптировать к другим средам), иногда бывают ложные срабатывания в случае встроенных функций.

HTH,

В дополнение к Doxygen (@Milan Babuskov) вы можете увидеть, есть ли предупреждения об этом в вашем компиляторе. Например. gcc имеет -Wunused-function для статических функций; -fdump-ipa-cgraph.

Я слышал хорошие отзывы о PC-Lint, но полагаю, что это, вероятно, излишек для ваших нужд.

Не так. PC-Lint хорош не только для этого. Просто не забудьте отключить все предупреждения и медленно включать их по мере необходимости. На самом деле, вам нужно выбрать ядро ​​из примерно двух дюжин, чтобы улучшить вашу кодовую базу. Педантизм и максимизация делают ваш код уродливым.

graham.reeds 15.03.2009 14:45

PC-lint можно настроить по назначению:

Я проверил следующий код на ваш вопрос:

void foo(int );

int main()
{
    return 0;
}
lint.bat test_unused.cpp

и получили следующий результат:

============================================================

--- Module:   test_unused.cpp (C++)

    --- Wrap-up for Module: test_unused.cpp

Info 752: local declarator 'foo(int)' (line 2, file test_unused.cpp) not referenced
test_unused.cpp(2) : Info 830: Location cited in prior message

============================================================

Таким образом, вы можете передать предупреждение номер 752 о своем пуропсе:

lint.bat  -"e*"  +e752  test_unused.cpp

-e «*» удалит все предупреждения, а + e752 включит это конкретное.

Другие вопросы по теме