Автоматическое обнаружение мертвого кода в родном приложении C ++ в Windows? - PullRequest
12 голосов
/ 21 ноября 2008

Фон

У меня есть приложение, написанное на нативном 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 ++ компилировать весь код. Можно ли это сделать?

Ответы [ 3 ]

7 голосов
/ 21 ноября 2008

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

1 голос
/ 21 ноября 2008

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

0 голосов
/ 21 ноября 2008

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

...