Как стать автором
Обновить

Комментарии 23

Оборвали на самом интересном месте. :)
Придётся немного подождать. Или пройти по ссылке на оригинальный текст.

А не устарел ли материал? Описываются Ubuntu 13.04 и Clang 3.5, когда текущие Ubuntu 18.04 и Clang 6.0.

Пока это только введение. Там, где будет код, я приведу его к API clang 6. Версия операционной системы здесь ни на что не влияет.
Спасибо, понятно.

Лучше 5.0. Когда шестая (dev-сборка) версия будет доступна на конвейерах типа travis или appveyor — не ясно.

К слову, у LibreOffice есть отличная пачка плагинов к clang для статического анализа кода проекта.

Их можно посмотреть в качестве примеров, а также просто брать и использовать.

Особенно must have плагин — это проверка на неявный каст bool в другие типы (implicitboolconversion.cxx). Он находил нам такие баги, что мы не знали плакать или смеяться.

Сразу предупрежу, что с последней версией clang эти плагины могут не скомпиляться — надо проявить немного упорства в исправлении расхождений в api, но у меня это не заняло много времени.
Спасибо, это интересно.
И инструкция по сборке уже не рабочая, а в остальном все норм:
kar@pc:~/static_analysis/llvm$ ./configure
################################################################################
################################################################################
The LLVM project no longer supports building with configure & make.

Please migrate to the CMake-based build system.
For more information see: llvm.org/docs/CMake.html
################################################################################
################################################################################

К слову, у LibreOffice есть отличная пачка плагинов к clang для статического анализа кода проекта.

Их можно посмотреть в качестве примеров, а также просто брать и использовать.

Особенно must have плагин — это проверка на неявный каст bool в другие типы (implicitboolconversion.cxx). Он находил нам такие баги, что мы не знали: плакать или смеяться.

Сразу предупрежу, что с последней версией clang эти плагины могут не скомпиляться — надо проявить немного упорства в исправлении расхождений в api, но у меня это не заняло много времени.
LibTooling используется для запуска некоторого анализа на исходном коде (с множеством файлов, при желании) без запуска обычного процесса компиляции.

Строго говоря, это не так. LibTooling используется для упрощения настройки clang frontend — предоставляет механизмы удобного разбора командной строки, созданием окружения для компилятора и т. п. А запустить потом можно любой frontend action. Хоть на препроцессинг, хоть на статический анализ, хоть на полноценную компиляцию. Ну и да: интеграция с ast matchers — отдельная вишенка на торте. Но что-то мне подсказывает, что в переводе об этом ничего не будет.

Скачать и установить (например, с помощью apt-get) все необходимые пакеты.
(Типичный дистрибутив Linux идёт со всем необходимым, кроме subversion).
Смените директорию на ту, в которую вы хотите установить LLVM (например, ~/static_analysis/). Будем называть её директорией верхнего уровня. Выполните следующие команды в терминале:

Сейчас уже проще скачать нужные dev-пакеты из репозиториев и не заниматься убийством собственного жёсткого диска.

Ну и довольно неплохая преза по Clang AST лежит здесь: llvm.org/devmtg/2013-04/klimek-slides.pdf

Спасибо за развёрнутый комментарий. Про AST matchers я напишу потом отдельно.

> и хорошо документирован
> вы получите удовольствие, изучая различные классы элементов Clang AST
Простите, но автор наркоман. Второй месяц ковыряюсь в CLang, и впечатления почти сугубо отрицательные. Вместо однородной структуры тех же AST, есть жуткое месиво из тысячи разных классов, что невероятно трудно уложить в голове. Многие вещи делаются через пень-колоду (хотите получить тип переменной из объявления — вот вам цепочка из пяти вызовов), постоянно приходится что-то куда-то кастовать, сплошные голые пойнтеры и прочие мерзости. И ладно бы была годная документация, но она фактические отсутствует. Есть пара туториалов на официальном сайте и доксиген, ничего не объясняющий и почти никак не помогающий. По итогу приходится заниматься цифровой археологией, находя ответы на интересующие вопросы по маленьким кусочкам. На некоторые вопросы я так и не получил ответов (https://stackoverflow.com/questions/49028456/how-to-receive-the-current-depth-in-recursiveastvisitor-clang — судя по отсутствию какой-либо реакции, это невозможно).

Полезная ссылка для интересующихся: white-knight-is-alive.blogspot.com/2016/01/clang-api_20.html — несколько вводных туториалов на русском.

Честно говоря, из вопроса на SO не очень понятно — какая именно задача решается и зачем нужно знать, на какой глубине вы сейчас находитесь. AST в кланге анализировать не то, чтобы просто — это правда. Сам в презентации об этом красочно рассказывал. Но, с другой стороны, это и не rocket science. И разделение классов узлов AST на группы (statements/expressions, types, declarations) — в общем, обосновано.
> Честно говоря, из вопроса на SO не очень понятно — какая именно задача решается и зачем нужно знать, на какой глубине вы сейчас находитесь.
Ну, насколько я понял, «visitor» — единственный (можно, наверное, ручками, но там наверняка свихнуться можно) способ обхода AST дерева. И как понять, что ты находишься в условном узле или листе дерева? Как отследить отношение «родитель — ребёнок» в этом дереве?

> Но, с другой стороны, это и не rocket science.
Понятно, что ничего нерешаемого нет. Просто складывается ощущение, что CLang специально делали так, чтобы усложнить жизнь пользователю.
Ну, насколько я понял, «visitor» — единственный (можно, наверное, ручками, но там наверняка свихнуться можно) способ обхода AST дерева. И как понять, что ты находишься в условном узле или листе дерева? Как отследить отношение «родитель — ребёнок» в этом дереве?

Да. Можно ещё ручками. Это так. То есть способа 3: DOM-like («ручками»), SAX-like (с помощью визиторов) и XPath-like (с помощью матчеров).
Отношение «родитель-потомок» отследить несложно. Можно идти вверх по дереву (если это возможно, например, в декларациях), либо в визиторе хранить стейт. Вот, например, визитор, который превращает «абстрактный» QualType в нечто вразумительное и пригодное для простого анализа:
TypeUnwrapper
На выходе этот код даёт структуру, хранящую упрощённую информацию о типе.
Понятно, что ничего нерешаемого нет. Просто складывается ощущение, что CLang специально делали так, чтобы усложнить жизнь пользователю.

Думаю, цели были немножко другими. :) Ну а уж как получилось — так получилось.
НЛО прилетело и опубликовало эту надпись здесь
Вот тут, от самого вендора.
Если вы ищете статический анализатор кода, я настоятельно рекомендую Clang, он существенно превосходит другие статические анализаторы
Это у автора статьи просто нормального м.. анализатора не было :).

Если кто не знаком, то у нас есть вот такие статьи на тему поиска ошибок в Clang с помощью PVS-Studio. Впрочем, есть и обратная заметка :). Не спорю, в целом анализатор Clang хороший и мы регулярно его используем.
А когда PVS Studio можно будет интегрировать в IDE так же, как это делается с clang-tidy и clang static analyzer в случае с CLion и QtCreator? :) Да и, прямо скажем, лучше пользовать сразу несколько средств, а не какое-то одно. Как мы, например. :)
В планах есть. Прототипы пробовали. Когда-нибудь зарелизим и такие плагины.
Вот это — хорошая новость. :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации