Перейти до вмісту
cd /languages
  • Системне ядро
  • Програмування
  • Підтримка AST і символів

C у Maguyva: графи викликів для системного та вбудованого коду

Maguyva підтримує C з AST, символами та графом, щоб ШІ-агенти відстежували функції, структури, include та тих, хто викликає, у системному коді, прошивках і бібліотеках.

Чому C потрібен граф викликів, а не grep

У C немає класів і модулів, які впорядковували б код. Структура живе у викликах функцій, заголовках і структурах, а та сама назва може траплятися в коментарях, макросах і рядкових літералах. Макроси експорту й анотацій обгортають оголошення, і інструменти, що вміють розбирати лише чистий C, на них спотикаються. Для агента безпечний перший крок — граф викликів.

Maguyva будує цей граф, щоб агент бачив, до чого доходить функція і що доходить до неї, перш ніж запропонувати зміну.

Що Maguyva витягує з C

Maguyva охоплює .c і .h. Визначення функцій витягуються як символи, а структури й об’єднання можна вибрати як визначення типів у структурному пошуку. Директиви #include стають зв’язками імпорту.

Макроси експорту й видимості (шаблони на кшталт FOO_API, DLLEXPORT або LIBEXPORT) і макроси анотацій потокобезпеки (наприклад, GUARDED_BY і REQUIRES) маскуються перед розбором, тож обгорнуті ними оголошення й надалі розпізнаються як оголошення. Тіла функціональних макросів розбираються, тіла об’єктних макросів — ні.

Граф фіксує виклики, include, створення екземплярів через складені літерали, посилання на типи, читання й записи, а також потік керування. Близько 124 викликів стандартної бібліотеки C (printf, malloc, free, memcpy, strlen тощо) відфільтровуються зі зв’язків, щоб код проєкту було видно.

Приклади промптів для агентів

  • «Хто викликає uart_write — напряму чи через інші функції?» (dependency_search incoming)
  • «Які файли підключають config.h і які його структури використовують?» (dependency_search, потім find_symbol)
  • «Поясни, як пакет проходить від переривання прийому до парсера протоколу.» (get_task_context)

Відомі обмеження

  • У C немає класів і винятків, тому зв’язки успадкування, реалізації інтерфейсів, перевизначення, викидання й перехоплення позначено як незастосовні.
  • .h входить до списків розширень C, C++ і Objective-C, тому заголовки в багатомовних деревах спільні для цих профілів.
  • Виклики відфільтрованих функцій стандартної бібліотеки не стають ребрами графа. Якщо потрібен кожен malloc чи memcpy, використовуйте text_pattern_search.

Наступні кроки

Під’єднайте репозиторій за швидким стартом, потім перегляньте матрицю підтримки на сторінці сумісності. Для коду на C++ у тому самому дереві прочитайте посібник із C++.

Найкраще підходить

  • > Команди прошивок, вбудованих систем і операційних систем, де невелика зміна спільної функції може дійти до апаратних шляхів.
  • > Довговічні бібліотеки на C з публічними заголовками, макросами експорту й безліччю внутрішніх одиниць трансляції.
  • > Рев'ю за участі агентів, де питання звучить так: «хто це викликає і через які заголовки?»

Робочі процеси агента

  • > Знайти всіх, хто викликає функцію, перш ніж змінювати її сигнатуру чи обробку помилок.
  • > Скласти карту файлів, що підключають заголовок, і структур, які вони використовують.
  • > Простежити запит від обробника переривання чи точки входу крізь функції, до яких він доходить.

Деталі рушія

  • > Підтримка C охоплює `.c` і `.h`. Визначення функцій — символи, структури й об'єднання — визначення типів, а `#include` стає зв'язком імпорту.
  • > Макроси експорту, видимості та анотацій потокобезпеки маскуються перед розбором, тож обгорнуті оголошення розбираються. Тіла функціональних макросів розбираються, об'єктних — ні.
  • > Близько 124 викликів стандартної бібліотеки, як-от `printf`, `malloc` і `memcpy`, відфільтровуються. Зв'язки успадкування, перевизначення та винятків позначено як незастосовні.

Корисні точки входу MCP

  • find_symbol

    Використовуйте з назвою функції чи структури, коли потрібні визначення й усі посилання.

  • dependency_search

    Використовуйте обхід incoming для спільної функції перед зміною її сигнатури чи обробки помилок.

  • get_task_context

    Використовуйте для промптів на кшталт «поясни, як пакет проходить від переривання прийому до парсера протоколу».