# Maguyva의 C 지원: 시스템·임베디드 코드를 위한 호출 그래프

Canonical source: https://maguyva.ai/ko/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 에이전트가 시스템, 펌웨어, 라이브러리 코드에서 함수, 구조체, include, 호출자를 따라갈 수 있게 합니다.

## 지원 현황 요약

- 등급: AST 및 심볼 지원
- 프로그래밍
- 확장자: .c, .h
- 구문 인식 검색과 구조적 컨텍스트를 위한 실제 AST 파싱을 제공합니다.
- 이름이 지정된 심볼은 시맨틱 조회와 상호 참조에 활용됩니다. 관계 추출이 활성화된 경우 그래프 내비게이션을 사용할 수 있습니다.
- 이 언어는 그래프 인식 검색에 심볼과 관계를 제공합니다. 지원되는 에지 유형은 언어 고유의 구문 구조에 따라 다릅니다.
- AST 파싱과 심볼 추출을 모두 지원합니다.

## 가장 적합한 경우

- 공유 함수의 작은 변경이 하드웨어 경로까지 닿을 수 있는 펌웨어, 임베디드, 운영체제 팀.
- 공개 헤더, 익스포트 매크로, 많은 내부 번역 단위를 가진 오래된 C 라이브러리.
- "이걸 누가 호출하고, 어떤 헤더를 거치나요?"가 질문인 에이전트 지원 리뷰.

## 에이전트 워크플로

- 함수 시그니처나 오류 처리를 바꾸기 전에 모든 호출자를 찾습니다.
- 어떤 파일이 헤더를 include하고, 어떤 구조체를 쓰는지 매핑합니다.
- 인터럽트 핸들러나 진입점에서 출발해 요청이 도달하는 함수까지 추적합니다.

## C에 grep이 아니라 호출 그래프가 필요한 이유

C에는 코드를 정리해 줄 클래스나 모듈이 없습니다. 구조는 함수 호출, 헤더, 구조체 안에 있고, 같은 이름이 주석, 매크로, 문자열 리터럴에도 나타납니다. 익스포트 매크로와 어노테이션 매크로가 선언을 감싸기 때문에, 순수한 C만 파싱하는 도구는 걸려 넘어집니다. 에이전트에게 안전한 첫걸음은 호출 그래프입니다.

Maguyva는 그 그래프를 만들어, 에이전트가 변경을 제안하기 전에 함수가 무엇에 도달하고 무엇이 그 함수에 도달하는지 볼 수 있게 합니다.

## Maguyva가 C에서 추출하는 것

Maguyva는 `.c`와 `.h`를 지원합니다. 함수 정의는 심볼로 추출되고, 구조체와 공용체는 구조적 검색에서 타입 정의로 선택할 수 있습니다. `#include` 지시문은 임포트 관계가 됩니다.

익스포트·가시성 매크로(`FOO_API`, `DLLEXPORT`, `LIBEXPORT` 같은 패턴)와 스레드 안전성 어노테이션 매크로(`GUARDED_BY`, `REQUIRES` 등)는 파싱 전에 마스킹되므로, 이들로 감싼 선언도 선언으로 파싱됩니다. 함수형 매크로의 본문은 파싱되고, 객체형 매크로의 본문은 파싱되지 않습니다.

그래프는 호출, include, 복합 리터럴 인스턴스화, 타입 참조, 읽기와 쓰기, 제어 흐름을 기록합니다. 약 124개의 표준 C 라이브러리 호출(`printf`, `malloc`, `free`, `memcpy`, `strlen` 등)은 관계에서 걸러지므로 프로젝트 코드가 더 잘 드러납니다.

## 에이전트 프롬프트 예시

- "`uart_write`를 직접 또는 다른 함수를 거쳐 호출하는 것은 누구인가요?" (`dependency_search` incoming)
- "`config.h`를 include하는 파일은 무엇이고, 그 안의 어떤 구조체를 쓰나요?" (`dependency_search`, 그다음 `find_symbol`)
- "패킷이 수신 인터럽트에서 프로토콜 파서까지 어떻게 이동하는지 설명해 줘." (`get_task_context`)

## 알려진 한계

- C에는 클래스도 예외도 없으므로, 상속, 인터페이스 구현, 오버라이드, throw, catch 관계는 적용 불가로 표시됩니다.
- `.h`는 C, C++, Objective-C의 확장자 목록에 모두 들어 있어서, 여러 언어가 섞인 헤더는 이 프로필들이 공유합니다.
- 필터링된 표준 라이브러리 함수 호출은 그래프 엣지가 아닙니다. 모든 `malloc`이나 `memcpy`가 필요하다면 `text_pattern_search`를 사용하세요.

## 다음 단계

[빠른 시작](/ko/docs/quickstart)으로 저장소를 연결한 다음, [호환성 페이지](/ko/docs/compatibility)에서 지원 매트릭스를 확인하세요. 같은 트리에 C++ 코드가 있다면 [C++ 가이드](/ko/languages/cpp)를 읽어 보세요.

## 엔진 세부 정보

- C 지원은 `.c`와 `.h`를 포함합니다. 함수 정의는 심볼, 구조체와 공용체는 타입 정의이며, `#include`는 임포트 관계가 됩니다.
- 익스포트, 가시성, 스레드 안전성 어노테이션 매크로는 파싱 전에 마스킹되므로 감싸인 선언도 파싱됩니다. 함수형 매크로의 본문은 파싱되고, 객체형 매크로의 본문은 파싱되지 않습니다.
- `printf`, `malloc`, `memcpy` 같은 약 124개의 표준 라이브러리 호출은 걸러집니다. 상속, 오버라이드, 예외 관계는 적용 불가로 표시됩니다.

## 유용한 MCP 진입점

- `find_symbol`: 정의와 모든 참조가 필요할 때 함수나 구조체 이름으로 쓰세요.
- `dependency_search`: 공유 함수의 시그니처나 오류 처리를 바꾸기 전에 incoming 탐색을 쓰세요.
- `get_task_context`: “패킷이 수신 인터럽트에서 프로토콜 파서까지 어떻게 이동하는지 설명해 줘” 같은 프롬프트에 쓰세요.
