Skip to content

Интеграция с 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. 🛠️⚡️