Сброс 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
, а f
– FunctionDecl
; оба эти узла наследуются от 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… Буду рад услышать ваши отзывы. Спасибо!
Оригинал