Автоматическое обнаружение мертвого кода в собственном приложении C++ в Windows?

StackOverflow https://stackoverflow.com/questions/307478

Вопрос

Фон

У меня есть приложение, написанное на родном C++ в течение нескольких лет и требующее около 60 KLOC.Есть много-много функций и классов, которые мертвы (вероятно, 10-15%, как и аналогичный вопрос на основе Unix, заданный ниже).Недавно мы начали проводить модульное тестирование всего нового кода и по возможности применять его к модифицированному коду.Тем не менее, я бы сказал, что на данный момент у нас тестовое покрытие менее 5%.

Предположения/ограничения

Метод и/или инструменты должны поддерживать:

  • Родной (т.неуправляемый) C++
  • Windows XP
  • Визуальная Студия 2005
  • Для покрытия не должны требоваться тестовые примеры, предоставленные пользователем.(например.не может зависеть от модульных тестов для создания покрытия кода)

Если методы поддерживают больше, чем эти требования, то отлично.

ПРИМЕЧАНИЕ: В настоящее время мы используем профессиональную версию Visual Studio 2005, а не Team System.Таким образом, использование Team System может быть действительный предложение (я не знаю, я никогда им не пользовался), однако я надеюсь, что это не то только решение.

Почему использование модульных тестов для покрытия кода проблематично

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

Используя модульные тесты для обеспечения такого покрытия, вы больше не используете общий алгоритм и, таким образом, увеличиваете как процент мертвого кода, который вы можете обнаружить, так и вероятность того, что любые попадания не будут ложными срабатываниями.И наоборот, использование модульных тестов может привести к ложноотрицательным результатам, поскольку сами модульные тесты могут быть единственным, что проверяет данный фрагмент кода.В идеале я хотел бы провести регрессионное тестирование, которое проверяет все доступные извне методы, API, пользовательские элементы управления и т. д.который будет служить базовым измерением анализа покрытия кода, чтобы исключить ложные срабатывания определенных методов.К сожалению, в настоящее время у меня нет такого автоматизированного тестирования.

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

Вопрос

Как вы выполняете автоматическое или полуавтоматическое обнаружение мертвого кода в собственном приложении C++ на платформе Windows со средой разработки Visual Studio 2005?

Смотрите также

Обнаружение мертвого кода в устаревшем проекте C/C++ Я хочу, чтобы компилятор VС++ скомпилировал весь код.Можно ли это сделать?

Это было полезно?

Решение

Попросите компоновщик удалить объекты, на которые нет ссылок (/OPT:REF).Если вы используете связывание на уровне функций и подробный вывод компоновщика, в выводе компоновщика будут перечислены все функции, которые, как он может доказать, не используются.Возможно, этот список далеко не полный, но необходимые инструменты у вас уже есть.

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

Мы используем Прямо в точку, и я могу его порекомендовать.Его не обязательно запускать из среды модульного тестирования, хотя мы именно это и делаем.

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

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