Pular para o conteúdo
cd /languages
  • Núcleo de sistemas
  • Programação
  • Suporte a AST e símbolos

C no Maguyva: grafos de chamadas para código de sistemas e embarcado

O Maguyva oferece suporte a C com AST, símbolos e grafo, para que agentes de IA sigam funções, structs, includes e chamadores em código de sistemas, firmware e bibliotecas.

Por que C precisa de um grafo de chamadas, e não de grep

C não tem classes nem módulos para organizar o código. A estrutura vive nas chamadas de função, nos headers e nas structs, e o mesmo nome pode aparecer em comentários, macros e literais de string. Macros de exportação e de anotação envolvem declarações, o que derruba ferramentas que só sabem analisar C puro. Para um agente, o primeiro passo seguro é o grafo de chamadas.

O Maguyva constrói esse grafo para que um agente veja o que uma função alcança e o que a alcança antes de propor uma mudança.

O que o Maguyva extrai em C

O Maguyva cobre .c e .h. Definições de funções são extraídas como símbolos, e structs e unions podem ser selecionadas como definições de tipo na busca estrutural. Diretivas #include viram relações de importação.

Macros de exportação e visibilidade (padrões como FOO_API, DLLEXPORT ou LIBEXPORT) e macros de anotação de thread safety (como GUARDED_BY e REQUIRES) são mascaradas antes da análise, então as declarações envolvidas por elas continuam sendo reconhecidas como declarações. Os corpos de macros do tipo função são analisados; os de macros do tipo objeto, não.

O grafo registra chamadas, includes, instanciação por compound literals, referências de tipo, leituras e escritas, e fluxo de controle. Cerca de 124 chamadas da biblioteca padrão de C (printf, malloc, free, memcpy, strlen e semelhantes) são filtradas das relações para que o código do projeto se destaque.

Exemplos de prompts para agentes

  • “Quem chama uart_write, diretamente ou por meio de outras funções?” (dependency_search incoming)
  • “Quais arquivos incluem config.h e quais das suas structs eles usam?” (dependency_search, depois find_symbol)
  • “Explique como um pacote vai da interrupção de recepção até o parser do protocolo.” (get_task_context)

Limitações conhecidas

  • C não tem classes nem exceções, então relações de herança, implementação de interface, sobrescrita, lançamento e captura estão marcadas como não aplicáveis.
  • .h aparece nas listas de extensões de C, C++ e Objective-C, então headers de várias linguagens são compartilhados entre esses perfis.
  • Chamadas a funções filtradas da biblioteca padrão não são arestas do grafo. Use text_pattern_search quando precisar de cada malloc ou memcpy.

Próximos passos

Conecte um repositório pelo início rápido e depois confira a matriz de suporte na página de compatibilidade. Para código C++ na mesma árvore, leia o guia de C++.

Uso ideal

  • > Equipes de firmware, sistemas embarcados e sistemas operacionais em que uma pequena mudança em uma função compartilhada pode chegar a caminhos de hardware.
  • > Bibliotecas C de longa vida com headers públicos, macros de exportação e muitas unidades de tradução internas.
  • > Revisões assistidas por agentes em que a pergunta é: "quem chama isto, e por quais headers?"

Fluxos de trabalho de agente

  • > Encontrar todos os chamadores de uma função antes de mudar sua assinatura ou o tratamento de erros.
  • > Mapear quais arquivos incluem um header e quais structs eles usam.
  • > Rastrear uma requisição desde um handler de interrupção ou ponto de entrada pelas funções que ela alcança.

Detalhes do motor

  • > O suporte a C cobre `.c` e `.h`. Definições de funções são símbolos, structs e unions são definições de tipo, e `#include` vira uma relação de importação.
  • > Macros de exportação, visibilidade e anotação de thread safety são mascaradas antes da análise, então as declarações envolvidas são analisadas. Corpos de macros do tipo função são analisados; os do tipo objeto, não.
  • > Cerca de 124 chamadas da biblioteca padrão como `printf`, `malloc` e `memcpy` são filtradas. Relações de herança, sobrescrita e exceção estão marcadas como não aplicáveis.

Pontos de entrada MCP úteis

  • find_symbol

    Use com o nome de uma função ou struct quando precisar da definição e de cada referência.

  • dependency_search

    Use a travessia incoming em uma função compartilhada antes de mudar sua assinatura ou o tratamento de erros.

  • get_task_context

    Use para prompts como "explique como um pacote vai da interrupção de recepção até o parser do protocolo".