Идентификация мертвого кода (C++)
У меня есть большой проект на C++ компилируется в Visual Studio 2008 с. Я знаю, что есть разумное количество "мертвого" кода, который нигде не доступен - методы, которые не вызываются, целые классы, которые не используются.
Я ищу инструмент, который будет идентифицировать это статический анализ.
такой вопрос: обнаружение мертвого кода в устаревшем проекте C / C++ предлагает использовать средства покрытия кода. Это не вариант в качестве тестового покрытия просто недостаточно высоко.
Он также упоминает-Wunreachable-код. возможность ССЗ. Я хотел бы что-то подобное для Visual Studio. Мы уже используем параметр компоновщика /OPT:REF для удаления избыточного кода, но это не сообщает о мертвом коде на полезном уровне (при использовании с /VERBOSE есть более 100 000 строк, в том числе много из библиотек).
есть ли лучшие варианты, которые хорошо работают с проектом Visual Studio?
7 ответов:
вы хотите что-то вроде QA-C++ (http://www.programmingresearch.com/QACPP_MAIN.html), Также см. http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis для подобных продуктов.
вы ищете инструмент статического анализа кода, который обнаруживает недостижимый код; многие рекомендации по кодированию (например, MISRA-C++, если я не ошибаюсь) требуют, чтобы недостижимый код не существовал. Инструмент анализа, специально предназначенный для обеспечения такого руководство было бы вашим лучшим выбором.
и вы хотели бы быть в состоянии найти другие виды использования для инструмента, а также.
Я не знаю Visual C, а также рекомендовал-Wunreachable-code конкретные инструменты покрытия. В качестве решения для вашей ситуации я бы попробовал следующее:
- сделайте с помощью ctags (или аналогичной программы) список всех ваших символов в вашем источнике
- включить в вашем компиляторе устранение мертвого кода (я бы предположил, что по умолчанию он включен)
- включите оптимизацию времени всей программы / ссылки (чтобы он знал, что не используемые функции в ваших модулях не являются требуется другими внешними и отбрасывается)
- возьмите символы из вашего двоичного файла и сравните их с символами из 1.
другим подходом может быть некоторый инструмент генерации графов вызовов (например, doxygen).
Я предлагаю вам использовать несколько подходов: 1. GCC имеет некоторые полезные флаги компиляции:
-Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wunused-parameter -Wunused-but-set-parameter2. Cppcheck имеет некоторые полезные функции, такие как:
--enable=unusedFunction3. Используйте статический анализатор, как было предложено ранее.
один подход, который работает для меня - с Delphi-это включить отладку и запустить программу под отладчиком.
когда программа Delphi запускается под отладчиком, IDE показывает на полях, какие строки кода могут быть установлены в качестве точек останова. Код, который действительно мертв-т. е. был удален компоновщиком/компилятором, очевиден, поскольку точки останова не могут быть установлены там.
некоторые дополнительные примечания, как комментаторы, кажется, неправильно понимают это:
a: вы не нужно попробовать установить точку останова на каждой строке. Просто откройте исходный файл в среде IDE и быстро прокрутите его. Мертвый код легко обнаружить.
b: это не проверка "покрытия кода". Вам не нужно запускать приложение, чтобы увидеть, если он достигает линии.
c: я недостаточно знаком с VS2008, поэтому не могу сказать, будет ли это предложение работать.
или
1) MSVC недостаточно используется в built статического анализа инструмент.
2) MSVC рынок имеет множество инструментов, включая поддержку большинства бесплатных инструментов, в том числе CppCheckвам понадобится последняя версия Visual Studio для приложений market place, но бесплатно"Community Edition " имеет очень мягкую лицензию.
написать скрипт, который случайным образом удаляет функцию (из исходного кода) и перекомпилирует все с нуля. Если он все еще компилируется-эта функция была мертвым кодом.
Comments