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

Задний план

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


person Zach Burlingame    schedule 21.11.2008    source источник
comment
Так что же наконец сделал OP для решения этой проблемы?   -  person Ira Baxter    schedule 16.04.2016


Ответы (3)


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

person MSalters    schedule 21.11.2008

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

person Alastair    schedule 21.11.2008
comment
Спасибо за предложение. Я собираюсь исследовать этот вариант немного дальше. - person Zach Burlingame; 21.11.2008

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

person EvilTeach    schedule 21.11.2008
comment
Это именно то, что я сказал, это не вариант. При таком низком покрытии модульными тестами в 5% их использование для тестирования покрытия кода привело бы к огромному количеству ложных срабатываний. - person Zach Burlingame; 21.11.2008
comment
В вашем наборе модульных тестов покрытие составляет 5%, и вы беспокоитесь об удалении неиспользуемого кода, а не о том, который используется. Интересный. - person EvilTeach; 23.11.2008
comment
Вы можете подумать о повышении уровней предупреждений, чтобы компилятор сообщал о неиспользуемом коде, и настройте параметры компоновщика так, чтобы не связывать мертвый код. - person EvilTeach; 23.11.2008
comment
Мертвый код - не единственное, что меня беспокоит, однако его удаление упрощает выполнение множества задач по обслуживанию, включая добавление тестов в код, который используется в процессе рефакторинга. Распространение мертвого кода создает путаницу для всех, особенно для новичков в проекте. - person Zach Burlingame; 31.07.2009