跳至主要內容
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++ 指南。

最適合的情境

  • > 韌體、嵌入式與作業系統團隊,對共用函式的一個小改動就可能波及硬體路徑。
  • > 長期維護的 C 函式庫,具有公開標頭檔、匯出巨集與大量內部翻譯單元。
  • > 由代理輔助的審查,核心問題是「誰在呼叫它,經由哪些標頭檔?」

代理工作流程

  • > 在變更函式簽章或錯誤處理之前,找出它的所有呼叫端。
  • > 梳理哪些檔案引入了某個標頭檔,以及它們使用了哪些結構。
  • > 從中斷處理常式或進入點出發,追蹤一個請求所到達的函式。

引擎細節

  • > C 支援涵蓋 `.c` 與 `.h`。函式定義是符號,結構與聯合是型別定義,`#include` 會成為匯入關係。
  • > 匯出、可見性與執行緒安全註記巨集會在剖析前被遮蔽,因此被包住的宣告仍能剖析。類函式巨集的本體會被剖析;類物件巨集的則不會。
  • > 約 124 個標準函式庫呼叫(如 `printf`、`malloc` 與 `memcpy`)會被過濾掉。繼承、覆寫與例外關係被標記為不適用。

實用的 MCP 進入點

  • find_symbol

    需要定義與所有參照時,以函式或結構名稱查找。

  • dependency_search

    在變更共用函式的簽章或錯誤處理之前,使用 incoming 走訪。

  • get_task_context

    適合用於「說明一個封包如何從接收中斷流向協定剖析器」這類提示。