本文へスキップ
cd /languages
  • システムの中核
  • プログラミング
  • AST・シンボル対応

MaguyvaのC対応: システム・組み込みコードのコールグラフ

MaguyvaはAST、シンボル、グラフでCに対応しています。AIエージェントはシステム、ファームウェア、ライブラリのコードで関数、構造体、インクルード、呼び出し元をたどれます。

Cにgrepではなくコールグラフが必要な理由

Cには、コードを整理するためのクラスやモジュールがありません。構造は関数呼び出し、ヘッダー、構造体の中にあり、同じ名前がコメント、マクロ、文字列リテラルにも現れます。エクスポート用やアノテーション用のマクロが宣言を包むため、素のCしか解析できないツールはつまずきます。エージェントにとって安全な第一歩は、コールグラフです。

Maguyvaはそのグラフを構築するため、エージェントは変更を提案する前に、関数が何に到達し、何から到達されるのかを確認できます。

MaguyvaがCで抽出するもの

Maguyvaは .c と .h に対応しています。関数定義はシンボルとして抽出され、構造体と共用体は構造検索で型定義として選択できます。#include ディレクティブはインポートの関係になります。

エクスポートと可視性のマクロ(FOO_API、DLLEXPORT、LIBEXPORT のようなパターン)とスレッド安全性のアノテーションマクロ(GUARDED_BY や REQUIRES など)は解析前にマスクされるため、それらに包まれた宣言も宣言として解析されます。関数形式マクロの本体は解析されますが、オブジェクト形式マクロの本体は解析されません。

グラフには、呼び出し、インクルード、複合リテラルによるインスタンス化、型参照、読み取りと書き込み、制御フローが記録されます。約124個の標準Cライブラリの呼び出し(printf、malloc、free、memcpy、strlen など)は関係性から除外されるため、プロジェクトのコードが際立ちます。

エージェントへのプロンプト例

  • 「uart_write を、直接またはほかの関数経由で呼び出しているのは誰か?」(dependency_search の incoming)
  • 「config.h をインクルードしているファイルはどれで、そのどの構造体を使っているか?」(dependency_search、次に find_symbol)
  • 「受信割り込みからプロトコルパーサーまで、パケットがどう流れるかを説明して。」(get_task_context)

既知の制限

  • Cにはクラスも例外もないため、継承、インターフェース実装、オーバーライド、スロー、キャッチの関係は適用対象外としてマークされています。
  • .h はC、C++、Objective-Cの拡張子リストに含まれているため、複数言語が混在するヘッダーはこれらのプロファイル間で共有されます。
  • 除外された標準ライブラリ関数への呼び出しはグラフのエッジになりません。すべての malloc や memcpy が必要なときは text_pattern_search を使ってください。

次のステップ

クイックスタートでリポジトリを接続し、互換性ページで対応マトリクスを確認してください。同じツリーにC++のコードがある場合は、C++ガイドをご覧ください。

最適な用途

  • > 共有関数への小さな変更がハードウェアの経路にまで届く、ファームウェア、組み込み、OSのチーム。
  • > 公開ヘッダー、エクスポートマクロ、多数の内部翻訳単位を持つ、長く使われるCライブラリ。
  • > 「これを呼んでいるのは誰で、どのヘッダー経由か?」が問いになる、エージェント支援型のレビュー。

エージェントワークフロー

  • > 関数のシグネチャやエラー処理を変更する前に、その呼び出し元をすべて見つける。
  • > あるヘッダーをインクルードしているファイルと、それらが使う構造体をマッピングする。
  • > 割り込みハンドラーやエントリーポイントから、到達する関数までリクエストを追跡する。

エンジンの詳細

  • > Cの対応は `.c` と `.h` を含みます。関数定義はシンボルに、構造体と共用体は型定義になり、`#include` はインポートの関係になります。
  • > エクスポート、可視性、スレッド安全性のアノテーションマクロは解析前にマスクされるため、包まれた宣言も解析されます。関数形式マクロの本体は解析されますが、オブジェクト形式のものは解析されません。
  • > `printf`、`malloc`、`memcpy` など約124個の標準ライブラリの呼び出しは除外されます。継承、オーバーライド、例外の関係は適用対象外としてマークされています。

役立つMCPエントリーポイント

  • find_symbol

    定義とすべての参照が必要なときに、関数や構造体の名前で使ってください。

  • dependency_search

    共有関数のシグネチャやエラー処理を変更する前に、incomingのトラバーサルを使ってください。

  • get_task_context

    「受信割り込みからプロトコルパーサーまで、パケットがどう流れるかを説明して」のようなプロンプトに使ってください。