Идентификация мертвого кода (C++)


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

Я ищу инструмент, который будет идентифицировать это статический анализ.

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

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

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

7   51   2008-11-26 19:07:29

7 ответов:

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

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

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

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

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

У меня нет аффилированности с Gimpel, просто удовлетворенный долгосрочный клиент.

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

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

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

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

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

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

 --enable=unusedFunction

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

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

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

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

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

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

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

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

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

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