Идентификация мертвого кода (C ++) - PullRequest
52 голосов
/ 26 ноября 2008

У меня большой унаследованный проект C ++, скомпилированный в Visual Studio 2008. Я знаю, что существует достаточное количество «мертвого» кода, который нигде не доступен - методы, которые не вызываются, целые классы, которые не используются.

Я ищу инструмент, который определит это по статическому анализу .

Этот вопрос: Обнаружение мертвого кода в устаревшем проекте C / C ++ предлагает использовать инструменты покрытия кода. Это не вариант, так как тестовое покрытие недостаточно высоко.

Также упоминается -Wunreachable-код. вариант для gcc. Я хотел бы что-то подобное для Visual Studio. Мы уже используем опцию компоновщика / OPT: REF для удаления избыточного кода, но это не сообщает о мертвом коде на полезном уровне (при использовании с / VERBOSE более 100 000 строк, в том числе много из библиотек).

Есть ли лучшие варианты, которые хорошо работают с проектом Visual Studio?

Ответы [ 7 ]

8 голосов
/ 01 июля 2009

Я знаю, что продукты Gimpel Lint ( PC-Lint и Flexelint ) будут идентифицировать недоступный код и неиспользуемые / не связанные модули.

Они оба попадают в категорию инструментов статического анализа.

У меня нет связи с Gimpel, просто довольный постоянный клиент.

6 голосов
/ 26 ноября 2008

Вам понадобится что-то вроде QA-C ++ (http://www.programmingresearch.com/QACPP_MAIN.html), также см. http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis для аналогичных продуктов.

Вы ищете инструмент статического анализа кода, который обнаруживает недоступный код; Многие правила кодирования (например, MISRA-C ++, если я не ошибаюсь) требуют, чтобы не было недоступного кода. Лучшим выбором будет инструмент анализа, предназначенный специально для обеспечения соблюдения такого руководства.

И вы также сможете найти другие варианты использования этого инструмента.

3 голосов
/ 26 ноября 2008

Я не знаю Visual C, а также рекомендовал инструменты покрытия -Wunreachable-code. В качестве решения вашей ситуации я бы попробовал следующее:

  1. Составьте с помощью ctags (или аналогичной программы) список всех ваших символов в вашем источнике
  2. Включите в своем компиляторе удаление мертвого кода (я бы предположил, что по умолчанию он включен)
  3. Включите оптимизацию времени всей вашей программы / канала связи (чтобы он знал, что неиспользуемые функции в ваших модулях не требуются другими внешними устройствами и их отбрасывают)
  4. Возьмите символы из вашего двоичного файла и сравните их с символами из 1.

Другим подходом может быть инструмент генерации графа вызовов (например, doxygen).

1 голос
/ 28 августа 2017

Я предлагаю вам использовать пару подходов: 1. GCC имеет несколько полезных флагов компиляции:

-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wunused-parameter
-Wunused-but-set-parameter

2. Cppcheck имеет несколько полезных функций, таких как:

 --enable=unusedFunction

3. Используйте статический анализатор, как было предложено ранее.

0 голосов
/ 22 апреля 2018

Или
1) MSVC недостаточно используется во встроенном инструменте статического анализа .
2) MSVC marketplace имеет множество инструментов, включая поддержку большинства бесплатных инструментов, включая CppCheck

Вам потребуется последняя версия Visual Studio для рыночных приложений, но бесплатное " Community Edition " имеет очень мягкое лицензирование.

0 голосов
/ 19 февраля 2009

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

0 голосов
/ 26 ноября 2008

Один подход, который мне подходит - с Delphi - это включить отладку и запустить вашу программу под отладчиком.

Когда программа Delphi запускается под отладчиком, IDE показывает на полях, какие строки кода могут быть установлены как точки останова. Код, который действительно мертв, то есть был удален компоновщиком / компилятором, очевиден, поскольку точки останова не могут быть там установлены.

Некоторые дополнительные примечания, поскольку комментаторы, кажется, неправильно понимают это:

a: Вам не нужно пытаться устанавливать точку останова в каждой строке. Просто откройте исходный файл в IDE и быстро пролистайте его. Мертвый код легко обнаружить.

b: это НЕ проверка «покрытия кода». Вам не нужно запускать приложение, чтобы увидеть, достигает ли оно строк.

c: Я недостаточно знаком с VS2008, поэтому не могу сказать, сработает ли это предложение.

...