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