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

Canonical source: https://maguyva.ai/vi/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 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.

## Tổng quan hỗ trợ

- Cấp độ: Hỗ trợ AST và symbol
- Lập trình
- Phần mở rộng: .c, .h
- Phân tích AST thật cho tìm kiếm nhận biết cú pháp và context cấu trúc.
- Các symbol có tên cung cấp dữ liệu cho tra cứu ngữ nghĩa và tham chiếu chéo. Điều hướng graph khả dụng khi bật trích xuất quan hệ.
- Ngôn ngữ này đóng góp symbol và quan hệ cho tìm kiếm nhận biết graph; các loại edge được hỗ trợ thay đổi theo cấu trúc riêng của ngôn ngữ.
- Cả phân tích AST và trích xuất symbol đều khả dụng.

## 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.

## 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](/vi/docs/quickstart), sau đó xem ma trận hỗ trợ trên [trang tương thích](/vi/docs/compatibility). Với mã C++ trong cùng cây mã, hãy đọc [hướng dẫn C++](/vi/languages/cpp).

## 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”.
