Комментарии 23
.
0
Оборвали на самом интересном месте. :)
+1
А не устарел ли материал? Описываются Ubuntu 13.04 и Clang 3.5, когда текущие Ubuntu 18.04 и Clang 6.0.
0
К слову, у LibreOffice есть отличная пачка плагинов к clang для статического анализа кода проекта.
Их можно посмотреть в качестве примеров, а также просто брать и использовать.
Особенно must have плагин — это проверка на неявный каст bool в другие типы (implicitboolconversion.cxx). Он находил нам такие баги, что мы не знали плакать или смеяться.
Сразу предупрежу, что с последней версией clang эти плагины могут не скомпиляться — надо проявить немного упорства в исправлении расхождений в api, но у меня это не заняло много времени.
Их можно посмотреть в качестве примеров, а также просто брать и использовать.
Особенно must have плагин — это проверка на неявный каст bool в другие типы (implicitboolconversion.cxx). Он находил нам такие баги, что мы не знали плакать или смеяться.
Сразу предупрежу, что с последней версией clang эти плагины могут не скомпиляться — надо проявить немного упорства в исправлении расхождений в api, но у меня это не заняло много времени.
+2
И инструкция по сборке уже не рабочая, а в остальном все норм:
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
################################################################################
################################################################################
0
К слову, у LibreOffice есть отличная пачка плагинов к clang для статического анализа кода проекта.
Их можно посмотреть в качестве примеров, а также просто брать и использовать.
Особенно must have плагин — это проверка на неявный каст bool в другие типы (implicitboolconversion.cxx). Он находил нам такие баги, что мы не знали: плакать или смеяться.
Сразу предупрежу, что с последней версией clang эти плагины могут не скомпиляться — надо проявить немного упорства в исправлении расхождений в api, но у меня это не заняло много времени.
Их можно посмотреть в качестве примеров, а также просто брать и использовать.
Особенно must have плагин — это проверка на неявный каст bool в другие типы (implicitboolconversion.cxx). Он находил нам такие баги, что мы не знали: плакать или смеяться.
Сразу предупрежу, что с последней версией clang эти плагины могут не скомпиляться — надо проявить немного упорства в исправлении расхождений в api, но у меня это не заняло много времени.
0
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
0
> и хорошо документирован
> вы получите удовольствие, изучая различные классы элементов 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 — несколько вводных туториалов на русском.
> вы получите удовольствие, изучая различные классы элементов 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 — несколько вводных туториалов на русском.
0
Честно говоря, из вопроса на SO не очень понятно — какая именно задача решается и зачем нужно знать, на какой глубине вы сейчас находитесь. AST в кланге анализировать не то, чтобы просто — это правда. Сам в презентации об этом красочно рассказывал. Но, с другой стороны, это и не rocket science. И разделение классов узлов AST на группы (statements/expressions, types, declarations) — в общем, обосновано.
0
> Честно говоря, из вопроса на SO не очень понятно — какая именно задача решается и зачем нужно знать, на какой глубине вы сейчас находитесь.
Ну, насколько я понял, «visitor» — единственный (можно, наверное, ручками, но там наверняка свихнуться можно) способ обхода AST дерева. И как понять, что ты находишься в условном узле или листе дерева? Как отследить отношение «родитель — ребёнок» в этом дереве?
> Но, с другой стороны, это и не rocket science.
Понятно, что ничего нерешаемого нет. Просто складывается ощущение, что CLang специально делали так, чтобы усложнить жизнь пользователю.
Ну, насколько я понял, «visitor» — единственный (можно, наверное, ручками, но там наверняка свихнуться можно) способ обхода AST дерева. И как понять, что ты находишься в условном узле или листе дерева? Как отследить отношение «родитель — ребёнок» в этом дереве?
> Но, с другой стороны, это и не rocket science.
Понятно, что ничего нерешаемого нет. Просто складывается ощущение, что CLang специально делали так, чтобы усложнить жизнь пользователю.
0
Ну, насколько я понял, «visitor» — единственный (можно, наверное, ручками, но там наверняка свихнуться можно) способ обхода AST дерева. И как понять, что ты находишься в условном узле или листе дерева? Как отследить отношение «родитель — ребёнок» в этом дереве?
Да. Можно ещё ручками. Это так. То есть способа 3: DOM-like («ручками»), SAX-like (с помощью визиторов) и XPath-like (с помощью матчеров).
Отношение «родитель-потомок» отследить несложно. Можно идти вверх по дереву (если это возможно, например, в декларациях), либо в визиторе хранить стейт. Вот, например, визитор, который превращает «абстрактный» QualType в нечто вразумительное и пригодное для простого анализа:
TypeUnwrapper
На выходе этот код даёт структуру, хранящую упрощённую информацию о типе.
Понятно, что ничего нерешаемого нет. Просто складывается ощущение, что CLang специально делали так, чтобы усложнить жизнь пользователю.
Думаю, цели были немножко другими. :) Ну а уж как получилось — так получилось.
0
НЛО прилетело и опубликовало эту надпись здесь
Вот тут, от самого вендора.
0
Если вы ищете статический анализатор кода, я настоятельно рекомендую Clang, он существенно превосходит другие статические анализаторыЭто у автора статьи просто нормального
Если кто не знаком, то у нас есть вот такие статьи на тему поиска ошибок в Clang с помощью PVS-Studio. Впрочем, есть и обратная заметка :). Не спорю, в целом анализатор Clang хороший и мы регулярно его используем.
0
А когда PVS Studio можно будет интегрировать в IDE так же, как это делается с clang-tidy и clang static analyzer в случае с CLion и QtCreator? :) Да и, прямо скажем, лучше пользовать сразу несколько средств, а не какое-то одно. Как мы, например. :)
+2
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Clang. Часть 1: введение