2010-03-04 3 views
42

В настоящее время я работаю над большим и старым C++-приложением, в котором много разработчиков передо мной. В проекте есть много «мертвого кода», классов и функций, которые больше не используются кем-либо.Поиск «мертвого кода» в большом унаследованном приложении C++

Какие инструменты доступны для C++ для анализа большой базы кода для обнаружения и реорганизации мертвого кода? Примечание. Я не говорю о инструментах для тестирования, таких как gcov.

Как вы нашли мертвый код в своем проекте?

+2

Используйте какой-то инструмент покрытия кода. Я собирался предложить 'gcov', но не знаю, что доступно в VC. –

+0

Мы успешно использовали Bullseye. Вот ссылка на оценочную копию. http://www.bullseye.com/evaluation.html –

+0

У этого вопроса есть отличное решение для gcc: [Есть ли способ получить gcc для предупреждения о неиспользуемых функциях?] (http://stackoverflow.com/questions/9091397/is-there-a-way-to-get-gcc-to-warn-about-unused-functions) –

ответ

24

Вы хотите использовать статический анализ приспособление

Главный Гоча я бежать в том, что вы должны быть осторожны, чтобы какие-либо библиотеки не использовались где-то, что вы не c ontrol/у. Если вы удаляете функцию из класса, который используется, ссылаясь на библиотеку в вашем проекте, вы можете сломать то, что вы не знали, используя код.

0

Хотя специально не для мертвого кода, я нашел источник Navigator

http://sourcenav.berlios.de/

весьма полезным, хотя и громоздки, чтобы настроить и немного глючит. Это было год назад в Linux (Fedora).

2

Один из подходов заключается в использовании пункта контекстного меню «Найти все ссылки» на имена классов и функций. Если класс/функция ссылается только на себя, это почти наверняка мертвый код.

Другой подход, основанный на той же идее, состоит в том, чтобы удалить (закомментировать) файлы/функции из проекта и посмотреть, какие сообщения об ошибках вы получите.

+0

Этот подход определенно ** не применим ** для крупных проектов. –

3

Я думаю, что ваш лучший выбор, вероятно, будет инструментом покрытия. Есть много для * nix и windows. Если у вас есть модульные тесты, это легко - если у вас низкий уровень охвата тестированием, то непокрытый код либо мертв, либо еще не проверен (вы хотите, чтобы оба фрагмента этой информации в любом случае). Если у вас нет модульных тестов, создайте приложение с помощью инструментария, предоставляемого одним из этих инструментов, запустите его через некоторые (все должно быть идеально) пути выполнения и просмотрите отчет. Вы получаете ту же информацию, что и с модульными тестами, это потребует гораздо больше работы.

Поскольку вы используете VisualStudio, я мог бы предоставить вам несколько ссылок, которые вы могли бы рассмотреть возможность использования:

Ни один из них не свободен, даже не дешево , но результат обычно стоит того.

On * nix-подобные платформы gcov в сочетании с такими инструментами, как zcov или lcov - действительно отличный выбор.

2

Ничто не сравнится с кодом.За исключением, возможно, жесткой обрезки, как один идет.

Иногда то, что выглядит как мертвое дерево, используется в качестве лесов для модульных испытаний и т. Д., Или оно кажется живым просто потому, что его устаревшие юниты проверяют его, но он никогда не используется вне тестов. Некоторое время назад я удалил более 1000 LOC, которые поддерживали внешних переводчиков модели CAD, у нас были тесты с привлечением этих внешних переводчиков, но эти переводчики не поддерживались в течение 8+ лет, и не было никакого способа, чтобы пользователь приложения, даже если они хотели могут когда-либо ссылаться на них.

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

+0

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

0

См. Наш SD C++ Test Coverage.

Вам необходимо сделать много динамических тестов для осуществления кода, чтобы убедиться, что вы достигли максимального уровня покрытия. Кодекс «не распространяется» может быть или не быть мертвым; возможно, у вас просто нет тестового примера для его осуществления.

3

Caolán McNamara's callcatcher очень эффективно используется в проекте LibreOffice (~ 6 MLOC), чтобы найти мертвый код.

4

Вы можете использовать Cppcheck для этой цели:

$ cppcheck --enable=unusedFunction . 
Checking 2380153.c... 
1/2 files checked 0% done 
Checking main.c... 
2/2 files checked 0% done 
[2380153.c:1]: (style) The function '2380153' is never used. 
+0

Пожалуйста, не отправляйте тот же ответ на несколько вопросов. Если одна и та же информация действительно отвечает на оба вопроса, тогда один вопрос (обычно более новый) должен быть закрыт как дубликат другого. Вы можете указать это путем [голосования, чтобы закрыть его как дубликат] (http://stackoverflow.com/help/privileges/close-questions), или, если у вас недостаточно репутации для этого, [поднять флаг] (http://stackoverflow.com/help/privileges/flag-posts), чтобы указать, что это дубликат. В противном случае убедитесь, что вы адаптируете свой ответ к * этому * вопросу и не просто вставляете один и тот же ответ в нескольких местах. –

Смежные вопросы