Вопрос

У меня есть большой устаревший проект на 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 ++, если я не ошибаюсь) требуют, чтобы не было недоступного кода. Лучшим выбором будет инструмент анализа, специально разработанный для обеспечения соблюдения такого руководства.

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

Другие советы

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

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

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

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

<Ол>
  • Составьте с помощью ctags (или аналогичной программы) список всех ваших символов в вашем источнике
  • Включите в своем компиляторе удаление мертвого кода (я бы предположил, что по умолчанию он включен)
  • Включите оптимизацию времени всей вашей программы / канала связи (чтобы он знал, что неиспользуемые функции в ваших модулях не требуются другими внешними устройствами и их отбрасывают)
  • Возьмите символы из вашего двоичного файла и сравните их с символами из 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 недостаточно используется во встроенных инструмент статического анализа.
    2) MSVC Магазин имеет множество инструментов, включая поддержку большинства бесплатных инструментов, включая Проверка CppCheck

    Вам понадобится последняя версия Visual Studio для приложений Market Place, но бесплатная "Издание Сообщества" имеет очень мягкое лицензирование.

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top