2010-03-11 2 views
4

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

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

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

ответ

1

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

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

Посмотрите на такие библиотеки, как libast для ваших нужд. Подробнее here.

1

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

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

Если у вас необходимо имя и тип разрешения, тогда другое решение будет DMS Software Reengineering Toolkit. DMS предоставляет универсальный компилятор, такой как инфраструктура для синтаксического анализа, анализа, преобразования и разбора (регенерация исходного кода из структур данных компилятора). DMS промышленно-силовой интерфейс C++ (он также имеет много других интерфейсов) обеспечивает полное разрешение имен и типов в соответствии со стандартом 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). 

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

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

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

+2

Я склонен думать, что clang должен предоставлять информацию о разрешении имен и типов - как еще они компилируют LLVM и предоставляют полезные сообщения об ошибках (более полезно, чем gcc на данном этапе). – aneccodeal

+0

Конечно, clang-the-compiler имеет таблицы символов. Доступна ли она в АСТ в удобной форме? Разве clang-the-compiler даже строит полные АСТ? Доступна ли она для нескольких единиц компиляции одновременно? Что бы я сделал, если бы я разрабатывал такой инструмент (и делал с DMS), но это отличается от того, что они на самом деле делали. Я просто не знаю. –

Смежные вопросы