Dead Code Finder: суровая реальность статического анализа

Я написал инструмент для хакатона, чтобы находить «мертвый» код. Цель была проста: найти код, к которому никто не обращается.

Я не хотел знать, что сломается при удалении кода. Я хотел знать, вызывается ли конкретный фрагмент кода вообще хоть чем-нибудь.

Я назвал его Dead Code Finder. Он использует граф знаний для поиска вызовов и импортов. Каждую находку он распределяет по трем категориям:

• Confident: ноль входящих ребер и не является точкой входа. • Uncertain: случаи вроде наследования, когда статического анализа недостаточно. • Skipped: такие вещи, как декораторы или тестовые фреймворки, которые инструмент не может разрешить.

Я следовал одному строгому правилу: никогда не утверждать, что код можно безопасно удалять. В отчете лишь говорится, что в графе не найдено ни одной ссылки.

Проект оказался сложнее, чем я ожидал. Я столкнулся с двумя основными проблемами платформы:

  1. Отсутствие инструментов: инструменты графа отсутствовали во время выполнения, хотя они были указаны в конфигурации.
  2. Ненадежная инъекция: система иногда не могла предоставить агенту полную логику.

Я решил это, создав режим отката (fallback mode). Если инструменты графа отсутствуют, инструмент считывает реальные файлы в репозитории. Он использует поиск по файлам для нахождения ссылок. Если используется этот метод, находки помечаются как «выведенные» (inferred).

Мне также пришлось исправить логические ошибки в определенных случаях:

  • Dunder-методы: Методы вроде __init__ часто показывают ноль входящих ребер, потому что граф связывает вызов с классом, а не с методом. Я исправил это, добавив проверку оборачивающего класса.
  • Декораторы: Функции, вызываемые через строковый поиск в словаре, выглядят «мертвыми» для статического графа. Я перенес их в категорию Skipped.
  • Тесты: Тестовые фреймворки находят методы через рефлексию. Их я также отправил в категорию Skipped.

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

Извлеченные уроки:

  • Проверяйте наличие доступных инструментов перед написанием логики, которая от них зависит.
  • Отчет, который говорит «Я не знаю», лучше, чем отчет, который уверенно ошибается.
  • Маркировка неопределенности делает ваши уверенные находки пригодными для принятия решений.

Источник: https://dev.to/hereforlolz/dead-code-finder-gitlab-orbit-based-static-analysis-that-turned-out-to-be-harder-than-expected-4jgk

Дополнительное обучающее сообщество: https://t.me/GyaanSetuAi