Фон
У меня есть приложение, написанное на нативном C ++ в течение нескольких лет, которое составляет около 60 KLOC. Есть много функций и классов, которые мертвы (вероятно, 10-15%, как и аналогичный вопрос, основанный на Unix ниже). Недавно мы начали проводить модульное тестирование всего нового кода и по возможности применять его к измененному коду. Тем не менее, я бы сделал SWAG, чтобы у нас было менее 5% тестового покрытия в настоящий момент.
Предположение / Ограничения
Метод и / или инструменты должны поддерживать:
- Собственный (т.е. неуправляемый) C ++
- Windows XP
- Visual Studio 2005
- Не требует пользовательских тестовых случаев для покрытия. (например, не может зависеть от юнит-тестов для генерации покрытия кода)
Если методы поддерживают больше, чем эти требования, то отлично.
ПРИМЕЧАНИЕ: В настоящее время мы используем профессиональную версию Visual Studio 2005, а не Team System. Поэтому использование Team System может быть действительным предложением (я не знаю, я никогда не использовал его), однако я надеюсь, что это не решение only .
Почему проблематично использовать модульные тесты для покрытия кода
Я считаю, что универсальному инструменту невозможно найти все мертвые (например, недоступный код) в любом произвольном приложении с нулевым числом ложных срабатываний (я думаю, что это было бы эквивалентно проблеме Остановки). Тем не менее, я также считаю, что универсальный инструмент может найти много типов мертвого кода, которые с большой вероятностью могут быть мертвыми, например, классы или функции, которые никогда не упоминаются в коде кем-либо еще.
Используя модульные тесты для обеспечения этого покрытия, вы больше не используете универсальный алгоритм и, таким образом, увеличиваете как процент мертвого кода, который вы можете обнаружить, так и вероятность того, что любые попадания не являются ложными срабатываниями. И наоборот, использование модульных тестов может привести к ложным отрицаниям, поскольку сами модульные тесты могут быть единственной вещью, выполняющей данный фрагмент кода. В идеале у меня было бы регрессионное тестирование, в котором использовались бы все доступные извне методы, API, пользовательские элементы управления и т. Д., Которые служили бы в качестве базового измерения анализа покрытия кода для исключения некоторых методов из ложных срабатываний. К сожалению, в настоящее время у меня нет этого автоматизированного тестирования.
Поскольку у меня такая большая кодовая база с таким низким процентом охвата тестовых случаев, я ищу что-то, что могло бы помочь, не требуя огромных затрат времени на написание тестовых случаев.
Вопрос
Как вы собираетесь обнаруживать мертвый код в автоматическом или полуавтоматическом режиме в собственном приложении C ++ на платформе Windows в среде разработки Visual Studio 2005?
Смотрите также
Обнаружение мертвого кода в унаследованном проекте C / C ++
Я хочу сказать компилятору VC ++ компилировать весь код. Можно ли это сделать?