Przejdź do treści
cd /languages
  • Rdzeń systemu
  • Programowanie
  • Obsługa AST i symboli

C w Maguyva: grafy wywołań dla kodu systemowego i wbudowanego

Maguyva obsługuje C przez AST, symbole i graf, dzięki czemu agenci AI śledzą funkcje, struktury, include'y i wywołujących w kodzie systemowym, firmware i bibliotekach.

Dlaczego C potrzebuje grafu wywołań, a nie grepa

C nie ma klas ani modułów, które porządkowałyby kod. Struktura żyje w wywołaniach funkcji, nagłówkach i strukturach, a ta sama nazwa może pojawić się w komentarzach, makrach i literałach tekstowych. Makra eksportu i adnotacji otaczają deklaracje, przez co potykają się narzędzia, które potrafią parsować tylko czyste C. Dla agenta bezpiecznym pierwszym krokiem jest graf wywołań.

Maguyva buduje ten graf, aby agent widział, do czego dociera funkcja i co dociera do niej, zanim zaproponuje zmianę.

Co Maguyva wyodrębnia w C

Maguyva obejmuje .c i .h. Definicje funkcji są wyodrębniane jako symbole, a struktury i unie można wybrać jako definicje typów w wyszukiwaniu strukturalnym. Dyrektywy #include stają się relacjami importu.

Makra eksportu i widoczności (wzorce takie jak FOO_API, DLLEXPORT czy LIBEXPORT) oraz makra adnotacji bezpieczeństwa wątków (takie jak GUARDED_BY i REQUIRES) są maskowane przed parsowaniem, więc otoczone nimi deklaracje nadal są rozpoznawane jako deklaracje. Treści makr funkcyjnych są parsowane; treści makr obiektowych nie.

Graf zapisuje wywołania, include’y, tworzenie instancji przez literały złożone, odwołania do typów, odczyty i zapisy oraz przepływ sterowania. Około 124 wywołań biblioteki standardowej C (printf, malloc, free, memcpy, strlen i podobne) jest filtrowanych z relacji, aby wyróżnić kod projektu.

Przykładowe prompty dla agentów

  • „Kto wywołuje uart_write, bezpośrednio lub przez inne funkcje?” (dependency_search incoming)
  • „Które pliki dołączają config.h i których jego struktur używają?” (dependency_search, potem find_symbol)
  • „Wyjaśnij, jak pakiet przechodzi od przerwania odbioru do parsera protokołu.” (get_task_context)

Znane ograniczenia

  • C nie ma klas ani wyjątków, więc relacje dziedziczenia, implementacji interfejsu, nadpisania, rzucania i przechwytywania są oznaczone jako nie dotyczy.
  • .h występuje na listach rozszerzeń C, C++ i Objective-C, więc nagłówki w drzewach wielojęzycznych są współdzielone między tymi profilami.
  • Wywołania odfiltrowanych funkcji biblioteki standardowej nie są krawędziami grafu. Gdy potrzebujesz każdego malloc lub memcpy, użyj text_pattern_search.

Kolejne kroki

Podłącz repozytorium za pomocą szybkiego startu, a potem sprawdź macierz obsługi na stronie zgodności. Dla kodu C++ w tym samym drzewie przeczytaj przewodnik po C++.

Najlepsze dopasowanie

  • > Zespoły firmware, systemów wbudowanych i systemów operacyjnych, gdzie mała zmiana we współdzielonej funkcji może sięgnąć ścieżek sprzętowych.
  • > Długowieczne biblioteki C z publicznymi nagłówkami, makrami eksportu i wieloma wewnętrznymi jednostkami translacji.
  • > Przeglądy wspierane przez agentów, w których pytanie brzmi: „kto to wywołuje i przez które nagłówki?”

Workflow agentów

  • > Znaleźć wszystkich wywołujących funkcję przed zmianą jej sygnatury lub obsługi błędów.
  • > Zmapować, które pliki dołączają nagłówek i których struktur używają.
  • > Prześledzić żądanie od procedury obsługi przerwania lub punktu wejścia przez funkcje, do których dociera.

Szczegóły silnika

  • > Obsługa C obejmuje `.c` i `.h`. Definicje funkcji są symbolami, struktury i unie definicjami typów, a `#include` staje się relacją importu.
  • > Makra eksportu, widoczności i adnotacji bezpieczeństwa wątków są maskowane przed parsowaniem, więc otoczone deklaracje są parsowane. Treści makr funkcyjnych są parsowane; makr obiektowych nie.
  • > Około 124 wywołań biblioteki standardowej, takich jak `printf`, `malloc` i `memcpy`, jest filtrowanych. Relacje dziedziczenia, nadpisania i wyjątków są oznaczone jako nie dotyczy.

Przydatne punkty wejścia MCP

  • find_symbol

    Używaj go z nazwą funkcji lub struktury, gdy potrzebujesz definicji i każdego odwołania.

  • dependency_search

    Użyj przejścia incoming na współdzielonej funkcji przed zmianą jej sygnatury lub obsługi błędów.

  • get_task_context

    Używaj go do promptów typu „wyjaśnij, jak pakiet przechodzi od przerwania odbioru do parsera protokołu”.