Spring til indhold
cd /languages
  • Systemkerne
  • Programmering
  • AST- og symbolunderstøttelse

C i Maguyva: kaldgrafer til system- og embedded-kode

Maguyva understøtter C med AST, symboler og graf, så AI-agenter kan følge funktioner, structs, includes og kaldere i system-, firmware- og bibliotekskode.

Hvorfor C har brug for en kaldgraf og ikke grep

C har ingen klasser eller moduler, der organiserer koden. Strukturen ligger i funktionskald, headere og structs, og det samme navn kan dukke op i kommentarer, makroer og strengliteraler. Eksport- og annotationsmakroer omslutter erklæringer, hvilket får værktøjer, der kun kan parse ren C, til at snuble. For en agent er kaldgrafen det sikre første skridt.

Maguyva bygger den graf, så en agent kan se, hvad en funktion når, og hvad der når den, før den foreslår en ændring.

Hvad Maguyva udtrækker i C

Maguyva dækker .c og .h. Funktionsdefinitioner udtrækkes som symboler, og structs og unions kan vælges som typedefinitioner i strukturel søgning. #include-direktiver bliver til importrelationer.

Eksport- og synlighedsmakroer (mønstre som FOO_API, DLLEXPORT eller LIBEXPORT) og annotationsmakroer til trådsikkerhed (som GUARDED_BY og REQUIRES) maskeres før parsning, så erklæringer, der er omsluttet af dem, stadig parses som erklæringer. Kroppe i funktionslignende makroer parses; kroppe i objektlignende makroer gør ikke.

Grafen registrerer kald, includes, instansiering via sammensatte literaler, typereferencer, læsninger og skrivninger samt kontrolflow. Omkring 124 kald i C’s standardbibliotek (printf, malloc, free, memcpy, strlen og lignende) filtreres fra relationerne, så projektets kode træder frem.

Eksempler på prompts til agenter

  • “Hvem kalder uart_write, direkte eller via andre funktioner?” (dependency_search incoming)
  • “Hvilke filer inkluderer config.h, og hvilke af dens structs bruger de?” (dependency_search, derefter find_symbol)
  • “Forklar, hvordan en pakke går fra modtage-interruptet til protokolparseren.” (get_task_context)

Kendte begrænsninger

  • C har hverken klasser eller undtagelser, så relationer for nedarvning, interfaceimplementering, overskrivning, kast og fangst er markeret som ikke relevante.
  • .h står på listerne over filendelser for C, C++ og Objective-C, så headere i træer med flere sprog deles mellem de profiler.
  • Kald til filtrerede funktioner i standardbiblioteket er ikke kanter i grafen. Brug text_pattern_search, når du har brug for hver malloc eller memcpy.

Næste skridt

Tilslut et repository med hurtigstarten, og se derefter understøttelsesmatricen på kompatibilitetssiden. Til C++-kode i samme træ kan du læse guiden til C++.

Bedst egnet til

  • > Firmware-, embedded- og styresystemteams, hvor en lille ændring i en delt funktion kan nå helt ud i hardwarestier.
  • > Langlivede C-biblioteker med offentlige headere, eksportmakroer og mange interne oversættelsesenheder.
  • > Agentunderstøttede reviews, hvor spørgsmålet er: "hvem kalder det her, og gennem hvilke headere?"

Agent-arbejdsgange

  • > Finde alle, der kalder en funktion, før dens signatur eller fejlhåndtering ændres.
  • > Kortlægge, hvilke filer der inkluderer en header, og hvilke structs de bruger.
  • > Spore en forespørgsel fra en interrupthandler eller et indgangspunkt gennem de funktioner, den når.

Motordetaljer

  • > C-understøttelsen dækker `.c` og `.h`. Funktionsdefinitioner er symboler, structs og unions er typedefinitioner, og `#include` bliver til en importrelation.
  • > Eksport-, synligheds- og trådsikkerhedsmakroer maskeres før parsning, så omsluttede erklæringer parses. Kroppe i funktionslignende makroer parses; kroppe i objektlignende gør ikke.
  • > Omkring 124 kald i standardbiblioteket som `printf`, `malloc` og `memcpy` filtreres fra. Relationer for nedarvning, overskrivning og undtagelser er markeret som ikke relevante.

Nyttige MCP-indgange

  • find_symbol

    Brug det til et funktions- eller structnavn, når du har brug for definitionen og hver reference.

  • dependency_search

    Brug incoming-gennemløb på en delt funktion, før dens signatur eller fejlhåndtering ændres.

  • get_task_context

    Brug det til prompts som "forklar, hvordan en pakke går fra modtage-interruptet til protokolparseren".