Vai al contenuto
cd /languages
  • Cuore di sistema
  • Programmazione
  • Supporto AST e simboli

C in Maguyva: grafi delle chiamate per codice di sistema ed embedded

Maguyva supporta C con AST, simboli e grafo, così gli agenti IA seguono funzioni, struct, include e chiamanti nel codice di sistema, firmware e librerie.

Perché C ha bisogno di un grafo delle chiamate, non di grep

C non ha classi né moduli per organizzare il codice. La struttura vive nelle chiamate di funzione, negli header e nelle struct, e lo stesso nome può comparire in commenti, macro e letterali stringa. Le macro di export e di annotazione avvolgono le dichiarazioni, mandando in crisi gli strumenti che sanno analizzare solo C puro. Per un agente, il primo passo sicuro è il grafo delle chiamate.

Maguyva costruisce questo grafo, così un agente vede cosa raggiunge una funzione e cosa la raggiunge prima di proporre una modifica.

Cosa estrae Maguyva in C

Maguyva copre .c e .h. Le definizioni di funzione vengono estratte come simboli, e struct e union si possono selezionare come definizioni di tipo nella ricerca strutturale. Le direttive #include diventano relazioni di import.

Le macro di export e visibilità (pattern come FOO_API, DLLEXPORT o LIBEXPORT) e le macro di annotazione per la thread safety (come GUARDED_BY e REQUIRES) vengono mascherate prima dell’analisi, così le dichiarazioni avvolte vengono comunque riconosciute come dichiarazioni. I corpi delle macro di tipo funzione vengono analizzati; quelli delle macro di tipo oggetto no.

Il grafo registra chiamate, include, istanziazione tramite compound literal, riferimenti di tipo, letture e scritture, e flusso di controllo. Circa 124 chiamate della libreria standard C (printf, malloc, free, memcpy, strlen e simili) vengono filtrate dalle relazioni, così il codice del progetto risalta.

Esempi di prompt per agenti

  • “Chi chiama uart_write, direttamente o tramite altre funzioni?” (dependency_search incoming)
  • “Quali file includono config.h e quali sue struct usano?” (dependency_search, poi find_symbol)
  • “Spiega come un pacchetto passa dall’interrupt di ricezione al parser del protocollo.” (get_task_context)

Limiti noti

  • C non ha classi né eccezioni, quindi le relazioni di ereditarietà, implementazione di interfacce, override, lancio e cattura sono contrassegnate come non applicabili.
  • .h compare negli elenchi di estensioni di C, C++ e Objective-C, quindi gli header multilinguaggio sono condivisi tra questi profili.
  • Le chiamate alle funzioni filtrate della libreria standard non sono archi del grafo. Usa text_pattern_search quando ti serve ogni malloc o memcpy.

Prossimi passi

Collega un repository con la guida rapida, poi consulta la matrice di supporto nella pagina di compatibilità. Per il codice C++ nello stesso albero, leggi la guida a C++.

Il più adatto per

  • > Team firmware, embedded e di sistemi operativi in cui una piccola modifica a una funzione condivisa può arrivare ai percorsi hardware.
  • > Librerie C di lunga data con header pubblici, macro di export e molte unità di traduzione interne.
  • > Revisioni assistite da agenti in cui la domanda è: "chi chiama questa funzione, e attraverso quali header?"

Workflow degli agenti

  • > Trovare tutti i chiamanti di una funzione prima di cambiarne la firma o la gestione degli errori.
  • > Mappare quali file includono un header e quali struct usano.
  • > Tracciare una richiesta da un gestore di interrupt o da un punto di ingresso attraverso le funzioni che raggiunge.

Dettagli del motore

  • > Il supporto a C copre `.c` e `.h`. Le definizioni di funzione sono simboli, struct e union sono definizioni di tipo, e `#include` diventa una relazione di import.
  • > Le macro di export, visibilità e annotazione per la thread safety vengono mascherate prima dell'analisi, così le dichiarazioni avvolte vengono analizzate. I corpi delle macro di tipo funzione vengono analizzati; quelli di tipo oggetto no.
  • > Circa 124 chiamate della libreria standard come `printf`, `malloc` e `memcpy` vengono filtrate. Le relazioni di ereditarietà, override ed eccezione sono contrassegnate come non applicabili.

Punti di ingresso MCP utili

  • find_symbol

    Usalo con il nome di una funzione o di una struct quando ti servono la definizione e ogni riferimento.

  • dependency_search

    Usa la navigazione incoming su una funzione condivisa prima di cambiarne la firma o la gestione degli errori.

  • get_task_context

    Usalo per prompt come "spiega come un pacchetto passa dall'interrupt di ricezione al parser del protocollo".