Naar inhoud springen
cd /languages
  • Systeemkern
  • Programmeren
  • AST- en symboolondersteuning

C in Maguyva: aanroepgrafen voor systeem- en embedded code

Maguyva ondersteunt C met AST, symbolen en graaf, zodat AI-agents functies, structs, includes en aanroepers volgen in systeem-, firmware- en bibliotheekcode.

Waarom C een aanroepgraaf nodig heeft in plaats van grep

C heeft geen klassen of modules om code te ordenen. De structuur zit in functieaanroepen, headers en structs, en dezelfde naam kan opduiken in commentaar, macro’s en stringliterals. Export- en annotatiemacro’s omhullen declaraties, waardoor tools die alleen puur C kunnen parsen struikelen. Voor een agent is de aanroepgraaf de veilige eerste stap.

Maguyva bouwt die graaf, zodat een agent kan zien wat een functie bereikt en wat haar bereikt voordat hij een wijziging voorstelt.

Wat Maguyva in C extraheert

Maguyva dekt .c en .h. Functiedefinities worden als symbolen geëxtraheerd, en structs en unions zijn in structureel zoeken te selecteren als typedefinities. #include-directives worden importrelaties.

Export- en zichtbaarheidsmacro’s (patronen zoals FOO_API, DLLEXPORT of LIBEXPORT) en annotatiemacro’s voor thread safety (zoals GUARDED_BY en REQUIRES) worden vóór het parsen gemaskeerd, zodat declaraties die erin zijn verpakt nog steeds als declaraties worden geparseerd. Bodies van functieachtige macro’s worden geparseerd; die van objectachtige macro’s niet.

De graaf legt aanroepen vast, includes, instantiëring via compound literals, typeverwijzingen, lees- en schrijfacties, en control flow. Ongeveer 124 aanroepen uit de C-standaardbibliotheek (printf, malloc, free, memcpy, strlen en vergelijkbare) worden uit de relaties gefilterd, zodat de projectcode opvalt.

Voorbeeldprompts voor agents

  • “Wie roept uart_write aan, rechtstreeks of via andere functies?” (dependency_search incoming)
  • “Welke bestanden includen config.h, en welke van zijn structs gebruiken ze?” (dependency_search, daarna find_symbol)
  • “Leg uit hoe een pakket van de ontvangstinterrupt naar de protocolparser gaat.” (get_task_context)

Bekende beperkingen

  • C heeft geen klassen of exceptions, dus relaties voor overerving, interface-implementatie, override, throw en catch zijn gemarkeerd als niet van toepassing.
  • .h staat in de extensielijsten van C, C++ en Objective-C, dus headers in bomen met meerdere talen worden door die profielen gedeeld.
  • Aanroepen van gefilterde functies uit de standaardbibliotheek zijn geen randen in de graaf. Gebruik text_pattern_search wanneer je elke malloc of memcpy nodig hebt.

Volgende stappen

Koppel een repository via de snelstart en bekijk daarna de ondersteuningsmatrix op de compatibiliteitspagina. Lees voor C++-code in dezelfde boom de C++-gids.

Beste toepassing

  • > Firmware-, embedded- en besturingssysteemteams waar een kleine wijziging in een gedeelde functie tot in hardwarepaden kan reiken.
  • > Langlevende C-bibliotheken met publieke headers, exportmacro's en veel interne vertaaleenheden.
  • > Door agents ondersteunde reviews waarbij de vraag is: "wie roept dit aan, en via welke headers?"

Agentworkflows

  • > Elke aanroeper van een functie vinden voordat de signatuur of foutafhandeling verandert.
  • > In kaart brengen welke bestanden een header includen en welke structs ze gebruiken.
  • > Een verzoek volgen vanaf een interrupthandler of startpunt door de functies die het bereikt.

Enginedetails

  • > C-ondersteuning dekt `.c` en `.h`. Functiedefinities zijn symbolen, structs en unions zijn typedefinities, en `#include` wordt een importrelatie.
  • > Export-, zichtbaarheids- en thread-safety-annotatiemacro's worden vóór het parsen gemaskeerd, zodat omhulde declaraties worden geparseerd. Bodies van functieachtige macro's worden geparseerd; die van objectachtige niet.
  • > Ongeveer 124 aanroepen uit de standaardbibliotheek zoals `printf`, `malloc` en `memcpy` worden gefilterd. Relaties voor overerving, override en exceptions zijn gemarkeerd als niet van toepassing.

Nuttige MCP-instappunten

  • find_symbol

    Gebruik het voor een functie- of structnaam wanneer je de definitie en elke verwijzing nodig hebt.

  • dependency_search

    Gebruik incoming-traversal op een gedeelde functie voordat de signatuur of foutafhandeling verandert.

  • get_task_context

    Gebruik het voor prompts zoals "leg uit hoe een pakket van de ontvangstinterrupt naar de protocolparser gaat".