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

Canonical source: https://maguyva.ai/ja/languages/c

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

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

## 対応状況スナップショット

- 対応レベル: AST・シンボル対応
- プログラミング
- 拡張子: .c, .h
- 構文を考慮した検索と構造コンテキストのための実際のAST解析。
- 名前付きシンボルはセマンティック検索と相互参照に利用されます。関係抽出が有効な場合は、グラフナビゲーションも利用できます。
- この言語は、グラフを考慮した検索にシンボルと関係情報を提供します。対応するエッジの種類は、その言語固有の構文要素によって異なります。
- AST解析とシンボル抽出の両方に対応しています。

## 最適な用途

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

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

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

## 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` を使ってください。

## 次のステップ

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

## エンジンの詳細

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

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

- `find_symbol`: 定義とすべての参照が必要なときに、関数や構造体の名前で使ってください。
- `dependency_search`: 共有関数のシグネチャやエラー処理を変更する前に、incomingのトラバーサルを使ってください。
- `get_task_context`: 「受信割り込みからプロトコルパーサーまで、パケットがどう流れるかを説明して」のようなプロンプトに使ってください。
