LINUX.ORG.RU

Есть ли готовые утилиты для анализа сишного кода на неиспользуемые сущности?

 , , ,


0

4

Положим что есть какой-то старый легаси проект где куча модулей, перечислений, структур и типов. Положим что у нас есть цель отрефачить его.

Оптимально было бы сначала запустить какую-нибудь утилу, которая сказала бы «перечисление aaa не используется в проекте» и мы такие - круто, удаляем из кода, чтобы не мешало восприятию. Или «функция bbb не используется в проекте» и мы такие - ваще кайф, минус 2500 строк кода.

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

Есть что-то готовое чтобы не городить огород?

★★★★

А разве при компиляции, со всеми включёнными флагами на вывод предупреждений и ошибок, не показывает неиспользуемое?

NAY_GIGGER ()
Ответ на: комментарий от NAY_GIGGER

Конечно нет, их же можно вызвать снаружи даже у исполняемого файла, с точки зрения системы разницы нет.

PPP328 ★★★★ ()
Ответ на: комментарий от PPP328

Гугл говорит про CppCheck но я, если честно, не помню подобного функционала. Хотя, очень давно его тыкал.

NAY_GIGGER ()

Я такое только в анализаторе кода Clion видел, но там всё равно вручную нужно глядеть глазами на код (неиспользуемые участки выделены серым цветом).

Встроенная утилита для генерации именно отчета тупит полчаса-час, и выдает неправильные результаты.

reprimand ★★★★★ ()

Статические анализаторы находят. Тот же cppcheck, который упомянули, точно жалуется на неиспользуемые функции.

Линкер тоже должен, если компилировать с -ffunction-sections и линковать с --gc-sections --print-gc-sections. Но не знаю, что там в выводе будет.

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

xaizek ★★★★★ ()
Ответ на: комментарий от PPP328

Не совсем, они как раз по сути смотрят код, который не используется, т.к. покрытие тестами ставит цель не тупо лишнего тестового кода нагородить, а привести к тому, чтобы весь основной код был проверяем-используем по средством тестов или пусть даже живой программы, поэтому gcov смотрите, он вам для правильно скомпилированного проекта будет выплёвывать отчёт с указанием того, к каким строкам не было обращений и при желании много чего ещё. Правда логику со структурами данных я не уверен что он будет анализировать, в этом плане мб какой-нибудь статический анализатор поможет тот же cppcheck или pvs.

AKonia ★★ ()
Последнее исправление: AKonia (всего исправлений: 2)

По идее, утилиты проверки правил MISRA C должны находить неиспользуемый код. Правда, они все проприетарные. Если проект открытый, можно попробовать прогнать через Coverity. Говорят, там есть подходящий детектор.

В общем случае автоматизировать удаление будет сложно — утилиты слишком тупые. Например, в программе, где большая часть кода из ANGLE не использовалась, но формально могла быть вызывана из большого switch-case, Coverity не нашёл проблем. Я вызывал функцию всегда с одним параметром, но проверялка не смогла или не захотела протащить эту константу через вызов функции в другой единице трансляции.

i-rinat ★★★★★ ()
Ответ на: комментарий от PPP328

gcov смотрит именно покрытие выполнения. Да и думаю что анализаторы расчитанные на testing coverage тоже можно применить

mittorn ★★★★★ ()

Оптимально было бы сначала запустить какую-нибудь утилу, которая сказала бы «перечисление aaa не используется в проекте» и мы такие - круто, удаляем из кода, чтобы не мешало восприятию. Или «функция bbb не используется в проекте» и мы такие - ваще кайф, минус 2500 строк кода.

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

aiqu6Ait ★★★ ()
Последнее исправление: aiqu6Ait (всего исправлений: 1)

Или «функция bbb не используется в проекте» и мы такие - ваще кайф, минус 2500 строк кода.

Веселый проект)

goingUp ★★★★★ ()
Ответ на: комментарий от PPP328
gcc -Wall -Wextra -Wunused

А вообще, читай man gcc, ищи по слову «unused», задавай то, что тебе действительно нужно, потому что вышеприведённое выдаст километровую простыню. Заодно посмотри "-fanalyzer" и всё с ним связанное. Можешь так же посмотреть на clang - он управляется аналогично, но статанализатор у него отдельный, труднозапускаемый и труднонастраиваемый, и малополезный (по крайней мере по сравнению с cppcheck).

ABW ★★★★★ ()

Да просто удаляй. Когда пользователи прибегут с криками: «Всё сломалось!», ревертнёшь коммит :)

fluorite ★★★★★ ()

С IDE в заголовках пробежаться по каждой функции, посмотреть где вызывается.

xDShot ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.