Если вы индексируете код с помощью Doxygen, вы можете увидеть, откуда ссылаются на каждую функцию. Однако вам придется просматривать каждый класс (по 1 HTML-странице на класс) и искать те, у которых нет ничего, указывающего на них.
В качестве альтернативы вы можете использовать ctags для создания списка всех функций в коде, а затем использовать objdump или другой аналогичный инструмент для получения списка всех функций в файлах .o, а затем сравнить эти списки. Однако это может быть проблематично из-за искажения имени.
Я не думаю, что это есть, потому что некоторые функции, не имеющие тела в фактическом дереве исходных текстов, могут быть определены в какой-то внешней библиотеке. Это можно сделать только путем создания сценария, который составляет список объявленных функций в заголовке и проверяет, вызываются ли они иногда.
Если возможно, вы можете создать файл test.cpp для вызова их всех, компоновщик пометит те, у которых нет кода, как неразрешенные, таким образом, ваш тестовый код нужно только скомпилировать и не беспокоиться о фактическом запуске.
Согласен, я больше думал о том, чтобы протестировать реорганизуемую область. Это не долгосрочное решение, другим подходом может быть использование вывода VERBOSE в компоновщике.
У меня есть С ++ ftplugin для vim, который может проверять и сообщать о несоответствующих функциях - vimmers, набор ftplugin еще не прост в установке. Ftplugin основан на результатах ctags (следовательно, его эвристический можно легко адаптировать к другим средам), иногда бывают ложные срабатывания в случае встроенных функций.
HTH,
В дополнение к Doxygen (@Milan Babuskov) вы можете увидеть, есть ли предупреждения об этом в вашем компиляторе. Например. gcc имеет -Wunused-function для статических функций; -fdump-ipa-cgraph.
Я слышал хорошие отзывы о PC-Lint, но полагаю, что это, вероятно, излишек для ваших нужд.
Не так. PC-Lint хорош не только для этого. Просто не забудьте отключить все предупреждения и медленно включать их по мере необходимости. На самом деле, вам нужно выбрать ядро из примерно двух дюжин, чтобы улучшить вашу кодовую базу. Педантизм и максимизация делают ваш код уродливым.
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 включит это конкретное.
В итоге получится еще один набор дополнений для каждой написанной функции. Кроме того, если в этом тестовом файле пропущен вызов функции, который ничего не делает, в какой-то момент будет практически невозможно узнать об этом.