Использование Clang для анализа кода C ++ - PullRequest
4 голосов
/ 11 марта 2010

Мы хотим сделать довольно простой анализ пользовательского кода на C ++, а затем использовать эту информацию для инструментирования своего кода (в основном, регенерации своего кода с небольшим количеством инструментария кода), чтобы пользователь мог выполнить динамический анализ своего кода и получить статистика таких вещей, как диапазоны значений определенных числовых типов.

Clang должен иметь возможность обрабатывать достаточно C ++, чтобы обрабатывать тот код, который будут использовать наши пользователи - и, поскольку охват Clang C ++ постоянно улучшается к тому времени, как мы закончим, он будет еще лучше.

Так как же использовать clang, как этот, в качестве автономного парсера? Мы думаем, что могли бы просто сгенерировать AST, а затем пройтись по нему, ища объекты классов, которые мы заинтересованы в отслеживании. Было бы интересно услышать от других, кто использует Clang без LLVM.

Ответы [ 2 ]

1 голос
/ 11 марта 2010

То, что вы не указали, это то, какой «анализ» вы хотели сделать. Большинство анализов C ++ требуют, чтобы у вас были точные данные таблицы символов, чтобы при обнаружении символа foo вы имели некоторое представление о том, что это такое. (Технически вы даже не знаете, что такое + без такой таблицы символов!) Вам также нужна информация об общем типе; если у вас есть выражение "a * b", каков тип результата? Наличие информации «имя и тип» является ключом практически ко всему, что вы хотите сделать для анализа.

Если вы настаиваете на лязге, то здесь есть другие ответы. Я не знаю, это обеспечивает разрешение имени и типа.

Если вам нужно разрешение имен и типов, тогда другим решением будет DMS Software Reengineering Toolkit . DMS предоставляет универсальный компилятор, такой как инфраструктура для анализа, анализа, преобразования и анализа (восстановление исходного кода из структур данных компилятора). Промышленный интерфейс C ++ DMS промышленного уровня (он также имеет множество других языковых интерфейсов) обеспечивает полное разрешение имен и типов в соответствии со стандартом ANSI, а также диалекты GCC и MS VC ++.

Преобразования кода могут быть реализованы через интерфейс дерева абстрактного синтаксиса, предоставляемый DMS, или с помощью правил преобразования программ, ориентированных на шаблоны, написанных в поверхностном синтаксисе вашего целевого языка (в данном случае, C ++). Вот простое преобразование с использованием языка правил:

    domain Cpp~GCC3;  -- says we want patterns for C++ in the GCC3 dialect

    rule optimize_to_increment(lhs:left_hand_side):expression -> expression
      " \lhs = \lhs + 1 " ->   " \lhs++"  if no_side_effects(lhs).

Это неявно работает с AST, созданными DMS, для их изменения. Условный позволяет запрашивать произвольные свойства переменных шаблона (в данном случае lhs ), включая ограничения имени и типа, если хотите.

DMS много раз использовался для очень сложного анализа программ и преобразования кода C ++. Мы создаем инструменты для покрытия тестов C ++, применяя код C ++ довольно очевидным образом, используя DMS. На сайте есть библиография с бумагами, описывающими, как DMS использовалась для реструктуризации архитектуры большой линейки программного обеспечения для военных самолетов. Этот вид деятельности буквально вливает C ++ в одной архитектурной форме в другую, применяя большое количество преобразований, направленных на паттерны, таких как описанные выше.

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

1 голос
/ 11 марта 2010

clang предназначен для модульной конструкции. Цитирую со своей страницы:

Основной концепцией дизайна для Clang является его использование на основе библиотеки архитектура. В этом дизайне различные части переднего конца могут быть чисто разделены на отдельные библиотеки, которые затем можно смешать для разных потребности и использование.

Посмотрите на библиотеки clang как libast для своих нужд Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...