본문으로 건너뛰기
cd /languages
  • 시스템의 핵심
  • 프로그래밍
  • AST 및 심볼 지원

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

Maguyva는 AST, 심볼, 그래프로 C를 지원하여, AI 에이전트가 시스템, 펌웨어, 라이브러리 코드에서 함수, 구조체, 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를 사용하세요.

다음 단계

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

가장 적합한 경우

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

에이전트 워크플로

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

엔진 세부 정보

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

유용한 MCP 진입점

  • find_symbol

    정의와 모든 참조가 필요할 때 함수나 구조체 이름으로 쓰세요.

  • dependency_search

    공유 함수의 시그니처나 오류 처리를 바꾸기 전에 incoming 탐색을 쓰세요.

  • get_task_context

    “패킷이 수신 인터럽트에서 프로토콜 파서까지 어떻게 이동하는지 설명해 줘” 같은 프롬프트에 쓰세요.