Zum Inhalt springen
cd /languages
  • Systemkern
  • Programmierung
  • AST- und Symbol-Support

C in Maguyva: Aufrufgraphen für System- und Embedded-Code

Maguyva unterstützt C mit AST, Symbolen und Graph, damit KI-Agenten Funktionen, Structs, Includes und Aufrufer in System-, Firmware- und Bibliothekscode verfolgen.

Warum C einen Aufrufgraphen braucht statt grep

C hat keine Klassen oder Module, die den Code ordnen. Die Struktur steckt in Funktionsaufrufen, Headern und Structs, und derselbe Name kann in Kommentaren, Makros und String-Literalen auftauchen. Export- und Annotations-Makros umschließen Deklarationen, was Werkzeuge ins Stolpern bringt, die nur reines C parsen. Für einen Agenten ist der sichere erste Schritt der Aufrufgraph.

Maguyva baut diesen Graphen auf, damit ein Agent sehen kann, was eine Funktion erreicht und wovon sie erreicht wird, bevor er eine Änderung vorschlägt.

Was Maguyva in C extrahiert

Maguyva deckt .c und .h ab. Funktionsdefinitionen werden als Symbole extrahiert, und Structs und Unions lassen sich in der Struktursuche als Typdefinitionen auswählen. #include-Direktiven werden zu Importbeziehungen.

Export- und Sichtbarkeitsmakros (Muster wie FOO_API, DLLEXPORT oder LIBEXPORT) und Thread-Safety-Annotationsmakros (etwa GUARDED_BY und REQUIRES) werden vor dem Parsen maskiert, sodass damit umschlossene Deklarationen weiterhin als Deklarationen geparst werden. Rümpfe funktionsartiger Makros werden geparst, Rümpfe objektartiger Makros nicht.

Der Graph erfasst Aufrufe, Includes, Instanziierung über Compound Literals, Typreferenzen, Lese- und Schreibzugriffe sowie Kontrollfluss. Etwa 124 Aufrufe der C-Standardbibliothek (printf, malloc, free, memcpy, strlen und ähnliche) werden aus den Beziehungen gefiltert, damit der Projektcode hervortritt.

Beispiel-Prompts für Agenten

  • „Wer ruft uart_write auf, direkt oder über andere Funktionen?“ (dependency_search incoming)
  • „Welche Dateien binden config.h ein, und welche seiner Structs verwenden sie?“ (dependency_search, dann find_symbol)
  • „Erkläre, wie ein Paket vom Empfangs-Interrupt zum Protokollparser gelangt.“ (get_task_context)

Bekannte Grenzen

  • C hat weder Klassen noch Ausnahmen, daher sind Beziehungen für Vererbung, Interface-Implementierung, Override, Throw und Catch als nicht anwendbar markiert.
  • .h steht in den Listen der Dateiendungen von C, C++ und Objective-C, daher teilen sich diese Profile Header in gemischtsprachigen Bäumen.
  • Aufrufe gefilterter Funktionen der Standardbibliothek sind keine Graphkanten. Verwende text_pattern_search, wenn du jedes malloc oder memcpy brauchst.

Nächste Schritte

Verbinde ein Repository über den Schnellstart und prüfe dann die Unterstützungsmatrix auf der Kompatibilitätsseite. Für C++-Code im selben Baum lies den C++-Leitfaden.

Am besten geeignet

  • > Firmware-, Embedded- und Betriebssystem-Teams, bei denen eine kleine Änderung an einer gemeinsamen Funktion bis in Hardwarepfade reicht.
  • > Langlebige C-Bibliotheken mit öffentlichen Headern, Export-Makros und vielen internen Übersetzungseinheiten.
  • > Agentengestützte Reviews, bei denen die Frage lautet: „Wer ruft das auf, und über welche Header?“

Agentenabläufe

  • > Jeden Aufrufer einer Funktion finden, bevor sich ihre Signatur oder Fehlerbehandlung ändert.
  • > Erfassen, welche Dateien einen Header einbinden und welche Structs sie verwenden.
  • > Eine Anfrage von einem Interrupt-Handler oder Einstiegspunkt aus durch die Funktionen verfolgen, die sie erreicht.

Engine-Einordnung

  • > Die C-Unterstützung deckt `.c` und `.h` ab. Funktionsdefinitionen sind Symbole, Structs und Unions sind Typdefinitionen, und `#include` wird zu einer Importbeziehung.
  • > Export-, Sichtbarkeits- und Thread-Safety-Annotationsmakros werden vor dem Parsen maskiert, sodass umschlossene Deklarationen geparst werden. Rümpfe funktionsartiger Makros werden geparst, die objektartiger nicht.
  • > Etwa 124 Aufrufe der Standardbibliothek wie `printf`, `malloc` und `memcpy` werden gefiltert. Vererbungs-, Override- und Ausnahmebeziehungen sind als nicht anwendbar markiert.

Nützliche MCP-Einstiegspunkte

  • find_symbol

    Nutz es für einen Funktions- oder Struct-Namen, wenn du die Definition und jede Referenz brauchst.

  • dependency_search

    Nutz die eingehende Traversierung auf einer gemeinsamen Funktion, bevor du ihre Signatur oder Fehlerbehandlung änderst.

  • get_task_context

    Nutz es für Prompts wie „erkläre, wie ein Paket vom Empfangs-Interrupt zum Protokollparser gelangt“.