Нередко пользователи инструментов статического анализа интересуются, как выполнить задачу поиска определенных фрагментов кода. Например, как найти функцию длиннее, чем 1000 строк. Или как найти класс, в котором более 100 методов. Или в каких функциях больше всего (или меньше всего) комментариев. Для чего они это спрашивают?
Причины могут быть разные:
На первый взгляд кажется, что это действительно задачи для инструмента статического анализа. Ведь именно статический анализ кода является той технологией, которая умеет разобрать весь код "по косточкам".
Однако мне кажется все-таки, что статический анализ кода предназначен для выявления ошибок в программах. Ну, или если уж быть совсем точным, для выявления мест в программе, где программисту стоит внимательнее присмотреться и возможно найти ошибку. А отвечать на SQL-подобные запросы инструменты статического анализа кода хоть и могут, но все-таки, наверное, не должны. Потому что есть специальные инструменты для этого. Например, в инструменте CppDepend существует специальный язык запросов CQLinq (расшифровывается как "Code Querry Linq"). Как следует из названия, этот язык (очень похожий на Microsoft LINQ) позволяет строить запросы к анализируемой кодовой базе.
Какие публичные методы имеют размер больше 30 строк:
from m in Application.Methods
where m.NbLinesOfCode > 30 && m.IsPublic
select m
Какие классы наследуются от конкретного класса:
particular from t in Types
where t.IsClass && t.DeriveFrom ("CBase")
select t
Какие сложные методы недостаточно прокомментированы:
from t in Types
where t.IsClass && t.DeriveFrom ("CBase")
select t
Примеров подобных запросов довольно много на странице описания CQLinq. Все они достаточно очевидные и простые в понимании. Поэтому когда кто-то спрашивает меня, как ему с помощью статического анализа найти "методы, которые содержат ..." я сразу же отвечаю: "Статический анализ тут вам не очень подойдет. Попробуйте лучше CQLinq из CppDepend".