Chuyển tới nội dung
cd /languages
  • Lõi hệ thống
  • Lập trình
  • Hỗ trợ AST và symbol

C trên Maguyva: đồ thị lời gọi cho mã hệ thống và nhúng

Maguyva hỗ trợ C với AST, ký hiệu và đồ thị, để agent AI có thể lần theo hàm, struct, include và nơi gọi trong mã hệ thống, firmware và thư viện.

Vì sao C cần đồ thị lời gọi chứ không phải grep

C không có lớp hay module để tổ chức mã. Cấu trúc nằm ở lời gọi hàm, header và struct, và cùng một cái tên có thể xuất hiện trong chú thích, macro và chuỗi ký tự. Macro export và annotation bao quanh khai báo, khiến các công cụ chỉ phân tích C thuần bị vấp. Với một agent, bước đầu tiên an toàn là đồ thị lời gọi.

Maguyva xây dựng đồ thị này, để agent thấy một hàm đi tới đâu và cái gì đi tới nó trước khi đề xuất thay đổi.

Maguyva trích xuất gì từ C

Maguyva bao phủ .c và .h. Định nghĩa hàm được trích xuất thành ký hiệu, và struct cùng union có thể được chọn làm định nghĩa kiểu trong tìm kiếm cấu trúc. Chỉ thị #include trở thành quan hệ nhập.

Macro export và visibility (các mẫu như FOO_API, DLLEXPORT hoặc LIBEXPORT) và macro annotation an toàn luồng (như GUARDED_BY và REQUIRES) được che trước khi phân tích, để các khai báo mà chúng bao quanh được phân tích như khai báo bình thường. Thân của macro dạng hàm được phân tích; thân của macro dạng đối tượng thì không.

Đồ thị ghi lại lời gọi, include, khởi tạo qua compound literal, tham chiếu kiểu, đọc và ghi, cùng luồng điều khiển. Khoảng 124 lời gọi thư viện chuẩn C (printf, malloc, free, memcpy, strlen và tương tự) bị lọc khỏi quan hệ, để mã của dự án nổi bật lên.

Ví dụ prompt cho agent

  • “Ai gọi uart_write, trực tiếp hoặc qua các hàm khác?” (dependency_search theo chiều vào)
  • “Những tệp nào include config.h, và chúng dùng struct nào của nó?” (dependency_search, sau đó find_symbol)
  • “Giải thích cách một gói tin đi từ ngắt nhận tới bộ phân tích giao thức.” (get_task_context)

Giới hạn đã biết

  • C không có lớp hay ngoại lệ, nên các quan hệ kế thừa, triển khai interface, ghi đè, throw và catch được đánh dấu là không áp dụng.
  • .h xuất hiện trong danh sách phần mở rộng của C, C++ và Objective-C, nên header trong các cây mã đa ngôn ngữ được chia giữa các profile này.
  • Lời gọi tới các hàm thư viện chuẩn đã bị lọc không phải là cạnh đồ thị. Dùng text_pattern_search khi bạn cần mọi malloc hoặc memcpy.

Bước tiếp theo

Kết nối một kho mã bằng hướng dẫn bắt đầu nhanh, sau đó xem ma trận hỗ trợ trên trang tương thích. Với mã C++ trong cùng cây mã, hãy đọc hướng dẫn C++.

Phù hợp nhất

  • > Các nhóm firmware, hệ thống nhúng và hệ điều hành, nơi một thay đổi nhỏ ở một hàm dùng chung có thể lan tới đường dẫn phần cứng.
  • > Thư viện C lâu năm có header công khai, macro export và nhiều translation unit nội bộ.
  • > Các đợt review có agent hỗ trợ, nơi câu hỏi là: “ai gọi cái này, và qua những header nào?”

Workflow agent

  • > Tìm mọi nơi gọi một hàm trước khi chữ ký hoặc cách xử lý lỗi của nó thay đổi.
  • > Lập bản đồ các tệp include một header và các struct mà chúng sử dụng.
  • > Lần theo một yêu cầu từ trình xử lý ngắt hoặc điểm vào qua các hàm mà nó đi tới.

Chi tiết engine

  • > Hỗ trợ C bao phủ `.c` và `.h`. Định nghĩa hàm là ký hiệu, struct và union là định nghĩa kiểu, và `#include` trở thành quan hệ nhập.
  • > Macro export, visibility và annotation an toàn luồng được che trước khi phân tích, để các khai báo được bao quanh vẫn được phân tích. Thân macro dạng hàm được phân tích; dạng đối tượng thì không.
  • > Khoảng 124 lời gọi thư viện chuẩn như `printf`, `malloc` và `memcpy` bị lọc. Quan hệ kế thừa, ghi đè và ngoại lệ được đánh dấu là không áp dụng.

Điểm khởi đầu MCP hữu ích

  • find_symbol

    Dùng với tên hàm hoặc struct khi bạn cần định nghĩa và mọi tham chiếu.

  • dependency_search

    Dùng duyệt theo chiều vào trên một hàm dùng chung trước khi chữ ký hoặc cách xử lý lỗi của nó thay đổi.

  • get_task_context

    Dùng cho các prompt như “giải thích cách một gói tin đi từ ngắt nhận tới bộ phân tích giao thức”.