Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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

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

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

 --enable=unusedFunction

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

Ответ 6

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