경량 AST 기반 다언어 호출 그래프 생성기 PAIGE
초록
본 논문은 멀티랭귀지 소프트웨어 분석을 위한 경량 호출 그래프 생성 도구 PAIGE를 제안한다. PAIGE는 Clang이 생성한 텍스트형 AST를 Island Grammar로 파싱하여 함수 호출 정보와 인자·클래스 정보를 CSV 형태로 추출한다. 기존 Doxygen 등과 비교해 구현이 단순하면서도 정확도와 성능에서 우수함을 실험을 통해 입증한다. 또한 Python·JavaScript용 문법도 제공해 언어 독립성을 확보하였다.
상세 분석
PAIGE는 MLSA(MultiLingual Software Analysis) 아키텍처의 “경량·모듈·정적 분석” 원칙을 그대로 구현한 필터 프로그램이다. 핵심 아이디어는 컴파일러가 이미 제공하는 AST를 활용함으로써 소스 코드를 직접 파싱할 필요 없이 풍부한 타입·스코프 정보를 얻는 것이다. 이를 위해 저자는 Island Grammar(IG)를 선택했는데, IG는 전체 AST 중 관심 있는 “섬”(예: CallExpr, DeclRefExpr)만을 추출하고 나머지 “물”(다른 노드)은 무시한다. Flex와 Bison을 이용해 키워드와 정규표현식으로 섬을 정의하고, Bison 규칙에서 CALL, ARGUMENT 등 토큰을 만나면 C++ 로직을 호출해 함수명, 호출자 클래스, 인자 종류 등을 기록한다. 이러한 설계는 두 가지 장점을 제공한다. 첫째, AST가 매우 크더라도 섬만 탐색하므로 파싱 속도가 빠르고 메모리 사용량이 적다. 둘째, IG 규칙은 AST 구조의 작은 부분에만 의존하므로 Clang AST가 버전업되거나 다른 언어의 AST 형식이 약간 달라져도 쉽게 적응할 수 있다.
실험에서는 C/C++ 100개 프로그램을 대상으로 PAIGE와 Doxygen을 비교하였다. PAIGE는 전체 파싱 시간에서 평균 30% 정도 빠르고, 호출 관계와 인자 정보를 더 완전하게 수집했다. 특히 포인터, 멤버 함수, this 포인터를 통한 동적 디스패치 등 복잡한 C++ 특성을 정확히 파악해 클래스·함수명을 “Class::method” 형태로 출력했다. 또한 PAIGE는 함수 호출이 다른 파일에 정의된 경우에도 정의 파일명을 함께 기록해 다언어 호출 그래프를 구성할 때 필요한 연결 정보를 제공한다.
언어 독립성 측면에서는 동일한 IG 구조를 Python(ast 모듈)와 JavaScript(SpiderMonkey) AST에 적용해 성공적으로 호출 정보를 추출했으며, 이는 PAIGE가 특정 언어에 종속되지 않는 범용 프레임워크임을 시사한다. 마지막으로 저자는 호출 그래프를 트리 형태로 출력하도록 설계했는데, 이는 재귀 호출을 리프 노드로 표시하고, 인자별로 분기가 달라지는 경우 별도 가지로 표현해 분석가가 이해하기 쉽게 만든다. 전체적으로 PAIGE는 경량 구현, 높은 정확도, 언어 확장성을 동시에 만족시키는 실용적인 호출 그래프 생성기라 할 수 있다.
댓글 및 학술 토론
Loading comments...
의견 남기기