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

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

Поэтому я начал удалять макросы функций переменных и т. Д. С помощью «Найти ссылки» и «Показать график вызовов» в Netbeans. Я использую средства удаленной разработки NetBeans для C / C ++.
Но это громоздко. Так есть ли какой-нибудь инструмент для очистки?

14

Решение

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

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

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

Можно ожидать, что Clang статический анализатор сделал бы это, но из того, что я вижу доступные проверки не предлагайте такие вещи.

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

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

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

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

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

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

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

Для более подробной информации читайте Документация по параметрам предупреждений GCC.

10

Другие решения

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

#if 0
... lots of code
#endif

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

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

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

2

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

0