Есть ли какой-либо инструмент/способ для обнаружения/удаления всех неиспользуемых переменных, макросов, заголовков (включая) и функций из кода С++?

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

Итак, я начал удалять функции макросов переменных и т.д., используя "Найти ссылки" и "Показать график вызовов" в Netbeans. Я использую инструменты удаленного управления netbeans для c/С++. Но это громоздко. Итак, есть ли какой-нибудь инструмент для очистки?

Ответ 1

Из того, что я знаю, в настоящее время нет инструмента, который делает все, о чем вы упоминали, однако есть тот, который помогает в очистке неиспользуемых заголовков include: include-what-you-use

" Включить то, что вы используете" означает следующее: для каждого символа (тип, функция переменная или макрос), которые вы используете в foo.cc, либо foo.cc, либо foo.h должен # включать файл .h, который экспортирует объявление этого символа. Инструмент include-what-you-use - это программа, которая может быть создана с помощью clang, чтобы анализировать #include исходных файлов, чтобы найти включать-что-вы-использовать нарушения, и предложить исправления для них.

Основная цель include-what-you-use - удалить лишние #includes. Он делает это как путем выяснения того, что #includes на самом деле не требуется для этого файла (для файлов .cc и .h), и заменяя #includes forward-declares, когда это возможно.

Можно было бы ожидать, что проверки availalbe не предлагают таких вещей.

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

Тем временем я предлагаю вам включить флаги компилятора -Wall и -Wextra, что вызовет следующие предупреждения (среди прочего) (см. документы GCC ниже):

  • -Wunused-функция
  • -Wunused-label
  • -Унимое значение
  • -Wunused-variable
  • -Wunused-параметр
  • -Wunused-но-установленный параметр

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

Но для того, чтобы получить предупреждение о неиспользуемом параметре функции, вы должен либо указать -Wextra -Wunused (обратите внимание, что -Wall подразумевает -Wunused), или отдельно укажите параметр -Wunused.

Конечно, это означает, что вы должны вручную выполнить очистку

Если вы хотите быть дополнительным педантичным, вы можете также преобразовать все предупреждения в ошибки, добавив флаг -pedantic-errors

Подробнее читайте Документацию GCC Warnings Options.

Ответ 2

Я иногда использовал метод маркировки большого блока кода как "не использованный", добавив

#if 0
  ... lots of code 
#endif

Затем вы можете скомпилировать код и посмотреть, что пойдет не так. Проанализируйте "необъявленные ошибки varibale X", которые вы получаете, и восстановите необходимые для этого бит. Вы можете сделать это путем "вырезания" блока #if 0 (добавление #endif, затем новый #if 0 чуть дальше вниз) или перемещение фрагментов, которые вам нужны из текущего блока.

Например, если у вас есть блок глобальных переменных или макросов, просто разместите #if 0 вокруг всех них и посмотрите, какие из них действительно используются. [Хотя макросы могут быть немного сложнее, если они используются в #ifdef и т.д.].

Я был бы удивлен, если бы там не было инструмента, но в то же время вам все равно придется выполнять работу по сокращению, и как только у вас будет большой кусок кода в #if 0 ... #endif, это довольно легко вырезать его.

Ответ 3

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