Сброс AST программы C с помощью внешнего интерфейса компилятора Psyche-C

Сброс AST программы C с помощью внешнего интерфейса компилятора Psyche-C

8 марта 2022 г.

[Psyche-C] (https://github.com/ltcmelo/psychec) — это внешний интерфейс компилятора C, предназначенный для реализации инструментов статического анализа. Он обеспечивает четкое разделение между синтаксисом и семантикой (с устранением неоднозначности синтаксиса на основе алгоритмов и эвристик), устойчивость к ошибкам #include, которая поддерживается выводом типа struct, union, enum и typedef — и API, вдохновленный [компилятором Roslyn .NET] (https://github.com/dotnet/roslyn).


Драйвер cnippet


В основном Psyche-C используется через библиотеку C++. В частности, с помощью любого инструмента, который хочет реализовать статический анализ программ на C. Но Psyche-C можно также использовать как обычный анализатор C через драйвер cnippet. В этой небольшой статье я познакомлю вас с AST (Абстрактное синтаксическое дерево), которое Psyche-C создает в результате анализа программа С. Но сначала небольшая иллюстрация того, как вызвать cnippet с помощью команды cnip.


```нажмите


пустота f ()


в



AST программы C


В результате разбора программы на C Psyche-C создает AST. Этот AST похож на внешний интерфейс Clang (LLVM) (https://clang.llvm.org/). Тем не менее, узел в AST Psyche-C не всегда имеет корреспондента в AST Clang. Например, рассмотрим программу ниже и ее Psyche-C, созданный AST.


```javascript


интервал v, f(int d);


интервал е (целый р)


если (р == v)


возврат (р - 1);


вернуть 0;



Теперь рассмотрим AST, созданный Clang для той же программы на языке C.



В чем разница между ними?


AST Psyche-C немного ближе к грамматике C. Например, вы не можете видеть declarator в AST Clang, поскольку они поглощаются содержащими declarations.


Чтобы лучше понять приведенное выше утверждение, рассмотрим следующее объявление.


```нажмите


интервал v, f(int d);


В Clang AST v представлено VarDecl, а fFunctionDecl; оба эти узла наследуются от DeclaratorDecl (т. е. объявление с декларатором). Однако, говоря педантичными терминами, такое представление не совсем верно, учитывая, что в этом фрагменте существует только одно объявление — начинающееся с int и заканчивающееся на ;.


В AST Psyche-C создается одно VariableAndOrFunctionDeclaration (как и в Clang, этот узел наследуется от DeclaratorDeclaration) с двумя дочерними узлами: IdentifierDeclarator, обозначающий объект v типа int, и FunctionDeclarator`, обозначающий функцию `f`, возвращаемый тип которойint`. Это более детальное представление синтаксиса программы, позволяющее точно переписать AST — характеристика первостепенной важности для инструментов статического анализа, выполняющих рефакторинг исходного кода.


Абстракция и конкретность


Для статического анализа программы AST, создаваемый синтаксическим анализатором, должен абстрагировать синтаксис программы на «правильном» уровне. С одной стороны, AST должен максимально точно выражать значение синтаксиса и игнорировать грамматические особенности; с другой стороны, AST должен выявлять любые технические особенности грамматики, которые как можно меньше влияют на значение синтаксиса. Создание AST на оптимальном балансе между абстракцией и конкретностью с точным соответствием [стандарту C] (https://en.wikipedia.org/wiki/C_standard) является основной целью синтаксического анализатора Psyche-C.


Попробуйте Psyche-C… Буду рад услышать ваши отзывы. Спасибо!



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE