Идентификация нерабочего кода (C ++)
-
11-07-2019 - |
Вопрос
У меня есть большой устаревший проект на C ++, скомпилированный в Visual Studio 2008.Я знаю, что существует достаточное количество "мертвого" кода, к которому нигде нет доступа - методы, которые не вызываются, целые классы, которые не используются.
Я ищу инструмент, который определит это с помощью статический анализ.
Этот вопрос: Обнаружение мертвого кода в устаревшем проекте C / C ++ предлагает использовать инструменты покрытия кода.Это не вариант, поскольку охват тестированием просто недостаточно высок.
В нем также упоминается -Wunreachable-code.опция для gcc.Я бы хотел что-то подобное для Visual Studio.Мы уже используем опцию компоновщика /OPT:REF для удаления избыточного кода, но это не сообщает о мертвом коде на полезном уровне (при использовании с /VERBOSE имеется более 100 000 строк, включая множество из библиотек).
Есть ли какие-нибудь лучшие варианты, которые хорошо работают с проектом Visual Studio?
Решение
Вам понадобится что-то вроде 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. В качестве решения вашей ситуации я бы попробовал следующее:
<Ол>Другим подходом может быть инструмент генерации графа вызовов (например, 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 недостаточно используется во встроенных инструмент статического анализа.
2) MSVC Магазин имеет множество инструментов, включая поддержку большинства бесплатных инструментов, включая Проверка CppCheck
Вам понадобится последняя версия Visual Studio для приложений Market Place, но бесплатная "Издание Сообщества" имеет очень мягкое лицензирование.
Напишите скрипт, который случайным образом удаляет функцию (из исходного кода) и перекомпилирует все с нуля. Если он все еще компилируется - эта функция была мертвым кодом.