Crustify: LLM 에이전트와 커버리지 기반 테스트를 이용한 리포지토리 수준의 안전한 Rust 바인딩 생성
요약
Crustify는 에이전트 기반 공동 번역기 역할을 하여 C 라이브러리에 대한 안전한 Rust 바인딩을 자동으로 생성합니다. 이 시스템은 의존성 순서에 따라 작업을 스케줄링하고, 커버리지 및 UB 테스트를 통해 각 바인딩의 소유권과 생명주기를 검증하여 안전성을 확보합니다.
핵심 포인트
- Crustify는 에이전트 기반으로 C 라이브러리 바인딩을 자동 생성하는 최초의 연구입니다.
- Wavefront는 의존성별 순서화를 담당하며, 숨겨진 의존성까지 분석합니다.
- 커버리지 기반 테스트와 UB 테스트를 통해 안전한 코드를 검증합니다.
- libgit2 및 ffmpeg에 적용 시 높은 커버리지(98.92% 등)를 달성했습니다.
C 코드를 안전한 Rust 인터페이스로 래핑하면, 개발자는 코드 자체를 Rust로 마이그레이션할 때까지 unsafe 코드를 작성하지 않고도 Rust 애플리케이션에서 이를 사용할 수 있습니다. 하지만 이러한 바인딩을 작성하는 것은 매우 번거롭고 오류가 발생하기 쉽습니다. 왜냐하면 내부적으로는 Rust 컴파일러가 검사하지 않는 unsafe 코드를 사용하기 때문에, 단 하나의 실수만으로도 정의되지 않은 동작(Undefined Behavior, UB)이 도입될 수 있으며, 지금까지는 대부분 사람이 직접 작성되어 왔기 때문입니다.
우리는 리포지토리 수준의 C 라이브러리에 대한 안전한 Rust 바인딩을 생성하는 에이전트 기반 공동 번역기인 Crustify를 소개합니다. Crustify는 타겟의 타입과 심볼들을 의존성 순서가 정해진 독립적인 배치 웨이브로 스케줄링하여, 여러 에이전트들이 이를 동시에 바인딩하도록 합니다. 이 에이전트들은 자신이 래핑하는 모든 포인터와 타입에 대한 소유권 및 생명주기 계약(ownership and lifecycle contract)을 파악하고, Sanitizer와 Miri 하에서 커버리지 기반 동등성 테스트 및 UB 테스트를 통해 각 바인딩을 검사하며, 모든 웨이브를 검토합니다.
저희는 세 가지 도구를 기여했습니다: (a) ffibox. 이는 Box, Arc, Vec 같은 Rust의 기본 타입들을 모방하여 C 객체에 대한 Rust/C 상호 운용성을 제공하지만, C가 별칭(alias)을 지정할 수 있는 메모리를 참조하는 경우는 없습니다. (b) Wavefront. 이는 타겟 항목들을 의존성별로 순서화하는 신경-기호 정적 분석기이며, 캐스팅이나 타입이 제거된 포인터가 숨기는 의존성까지 포함합니다. 그리고 (c) ffimap. 이는 바인딩의 unsafe 표면을 매핑하는 rustc 기반 분석 도구입니다.
한 개발자가 참여하여 libgit2와 ffmpeg에 적용했을 때, Crustify는 약 51.9시간과 58.9시간 만에 각각 공개 API의 41.9%와 42.8%에 대한 안전한 바인딩을 생성했습니다. 인터페이스 소비자들이 사용하도록 예상되는 부분에서는, 바인딩의 공개 함수 중 unsafe한 것은 단지 1.6%와 0.4%에 불과하며, 시그니처에 raw pointer가 포함된 경우는 각각 0.1%와 0.6%에 그쳤습니다. 또한 테스트 커버리지는 Rust 코드의 98.92%와 99.07%를 다루었으며, libgit2와 ffmpeg의 libavutil은 각각 45.95%와 67.20%를 커버했습니다. 검토자들은 Rust에서 도달 가능한 UB를 유발하는 8개 및 13개의 결함을 수정했습니다. 저희가 아는 한, 이는 C 라이브러리에 대한 안전한 Rust 바인딩을 자동 생성한 최초의 연구입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 arXiv cs.PL (Programming Languages)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기