C 코드를 안전한 러스트로 변환하는 Scylla

C 코드를 안전한 러스트로 변환하는 Scylla
안내: 본 포스트의 한글 요약 및 분석 리포트는 AI 기술을 통해 자동 생성되었습니다. 정보의 정확성을 위해 하단의 [원본 논문 뷰어] 또는 ArXiv 원문을 반드시 참조하시기 바랍니다.

초록

Scylla는 C 코드의 구조를 점진적으로 정제해 안전한 Rust로 자동 변환하는 시스템이다. 제한된 C 서브셋을 Mini‑C라는 중간 언어로 변환한 뒤, 타입‑지향 번역과 “split tree” 기반 정적 분석을 이용해 포인터 연산을 Rust 슬라이스와 슬라이스 분할로 표현한다. 변이 가능성 추론, 소유‑비소유 메모리 구분 등도 자동으로 수행한다. 실제 암호 라이브러리·압축·파서 등을 실험했으며, 변환된 Rust 코드가 원본 C와 비슷한 성능을 보이고, bzip2와 FrodoKEM에서 정의되지 않은 동작을 발견했다.

상세 분석

Scylla의 핵심 아이디어는 “C를 바로 Rust로 번역하기보다, C 코드를 점진적으로 구조화시켜 안전 Rust로 컴파일 가능하게 만든다”는 점이다. 이를 위해 저자들은 먼저 Clang AST를 Mini‑C라는 표현식 중심의 중간 언어로 변환한다. Mini‑C는 C와 동일한 제어 흐름과 포인터 연산을 제공하지만, 모든 정수는 고정 폭을 갖고 암시적 프로모션·변환을 명시적 캐스트로 드러낸다. 또한 void*와 같은 무형 포인터를 허용하지 않으며, 할당은 타입과 요소 개수를 명시하는 malloc(t, n) 형태로 정형화한다. 이러한 정형화는 이후 Rust의 안전 메모리 모델에 매핑하기 위한 전제 조건이다.

번역 단계에서는 타입‑지향 규칙을 적용해 C 선언·표현식을 Mini‑C 표현식으로 바꾸고, 필요 시 명시적 캐스트를 삽입한다. 특히 배열 파라미터가 포인터로 디케이되는 C의 관습을 정확히 모델링하고, while, if 조건을 bool 타입으로 강제한다. 이후 Scylla는 “split tree” 분석을 수행한다. split tree는 포인터 연산을 슬라이스와 슬라이스 분할 연산으로 분해하는데, 예를 들어 p + i와 같은 포인터 오프셋을 slice.split_at(i) 형태로 변환한다. 이 과정에서 포인터가 가리키는 메모리 영역이 연속적이고 경계가 명확함을 정적 검증한다.

변이 가능성 추론은 각 포인터·레퍼런스에 대해 읽기 전용(&)과 가변(&mut)을 자동 결정한다. 저자들은 데이터 흐름 분석과 사용 패턴(예: *p = … vs let x = *p)을 결합해 최소한의 가변 빌림만 허용한다. 메모리 소유권 측면에서는 malloc으로 만든 힙 영역을 Rust의 `Box<


댓글 및 학술 토론

Loading comments...

의견 남기기