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

Фон

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

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

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

  • Нативный (то есть неуправляемый) С++
  • Windows XP
  • Visual Studio 2005
  • Не нужно требовать от пользователя тестовых примеров для покрытия. (например, не может зависеть от модульных тестов для генерации покрытия кода).

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

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

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

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

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

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

Вопрос

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

См. также

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

Ответ 1

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

Ответ 2

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

Ответ 3

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