Интеграция с Clang AST
Парсинг и валидация структуры C/C++ кода через Abstract Syntax Tree.
Обзор
Интеграция с Clang AST позволяет анализировать код на уровне абстрактного синтаксического дерева, обеспечивая детерминированную валидацию без эвристик.
Как это работает
1. Генерация AST
Clang предоставляет JSON-дамп дерева через флаг:
clang -Xclang -ast-dump=json -fsyntax-only source.c > ast.json
2. Парсинг AST
Babashka-скрипт читает JSON и извлекает:
- Вызовы функций (
CallExpr) - Операции присваивания (
BinaryOperator) - Доступ к памяти (
MemberExpr,ArraySubscriptExpr) - Приведения типов (
CastExpr)
3. Валидация против контрактов
Извлечённые данные сверяются с EDN-контрактами из реестра.
Пример AST
{
"id": "0x1234",
"kind": "CallExpr",
"type": "void",
"inner": [
{
"kind": "ImplicitCastExpr",
"inner": [{ "kind": "DeclRefExpr", "name": "free" }]
},
{ "kind": "ImplicitCastExpr", "name": "ptr" }
]
}
Пример использования
Валидация safe-free
{:intent :safe-free
:match {:kind "CallExpr" :name "free"}
:ensure-next {:kind "BinaryOperator" :opcode "=" :value "NULL"}}
// [[garden:intent(safe-free)]]
void cleanup(void* ptr) {
free(ptr);
ptr = NULL; // ✓ Проходит валидацию
}
// [[/garden:intent]]
Инструменты
| Утилита | Назначение |
|---|---|
clang -ast-dump=json |
Генерация JSON AST |
bb -m garden.enforcer |
Валидация против контрактов |
bb -m garden.echo |
Генерация Markdown-отчётов |
Ссылки
Bake the Future. Build the Substrate. 🛠️⚡️