Dead Code Finder: суровая реальность статического анализа
Я написал инструмент для хакатона, чтобы находить «мертвый» код. Цель была проста: найти код, к которому никто не обращается.
Я не хотел знать, что сломается при удалении кода. Я хотел знать, вызывается ли конкретный фрагмент кода вообще хоть чем-нибудь.
Я назвал его Dead Code Finder. Он использует граф знаний для поиска вызовов и импортов. Каждую находку он распределяет по трем категориям:
• Confident: ноль входящих ребер и не является точкой входа. • Uncertain: случаи вроде наследования, когда статического анализа недостаточно. • Skipped: такие вещи, как декораторы или тестовые фреймворки, которые инструмент не может разрешить.
Я следовал одному строгому правилу: никогда не утверждать, что код можно безопасно удалять. В отчете лишь говорится, что в графе не найдено ни одной ссылки.
Проект оказался сложнее, чем я ожидал. Я столкнулся с двумя основными проблемами платформы:
- Отсутствие инструментов: инструменты графа отсутствовали во время выполнения, хотя они были указаны в конфигурации.
- Ненадежная инъекция: система иногда не могла предоставить агенту полную логику.
Я решил это, создав режим отката (fallback mode). Если инструменты графа отсутствуют, инструмент считывает реальные файлы в репозитории. Он использует поиск по файлам для нахождения ссылок. Если используется этот метод, находки помечаются как «выведенные» (inferred).
Мне также пришлось исправить логические ошибки в определенных случаях:
- Dunder-методы: Методы вроде
__init__часто показывают ноль входящих ребер, потому что граф связывает вызов с классом, а не с методом. Я исправил это, добавив проверку оборачивающего класса. - Декораторы: Функции, вызываемые через строковый поиск в словаре, выглядят «мертвыми» для статического графа. Я перенес их в категорию Skipped.
- Тесты: Тестовые фреймворки находят методы через рефлексию. Их я также отправил в категорию Skipped.
Результаты оказались надежными. Мой режим отката правильно определял мертвый код и соответствовал данным реального графа. Он также корректно помечал неопределенные случаи, такие как наследование.
Извлеченные уроки:
- Проверяйте наличие доступных инструментов перед написанием логики, которая от них зависит.
- Отчет, который говорит «Я не знаю», лучше, чем отчет, который уверенно ошибается.
- Маркировка неопределенности делает ваши уверенные находки пригодными для принятия решений.
Дополнительное обучающее сообщество: https://t.me/GyaanSetuAi
