RustyDL 러스트 검증을 위한 새로운 프로그램 논리
RustyDL은 Rust 소스코드 수준에서 동적 논리를 적용한 프로그램 논리로, 인간‑인‑루프(HIL) 방식의 자동화된 deductive verification을 가능하게 한다. 기존의 중간언어 변환 방식과 달리 소스 레벨에서 소유권·참조·대여 규칙을 모델링하고, 업데이트 연산을 통해 가변 참조와 배열을 정밀히 다룬다. KeY 기반 프로토타입인 RustyKeY를 통해 개념 증명을 수행하였다.
저자: Daniel Drodt, Reiner Hähnle
본 논문은 Rust 언어의 메모리 안전성과 데이터 레이스 방지를 보장하는 강력한 타입 시스템을 기반으로, 소스 코드 수준에서 직접 작동하는 프로그램 논리인 RustyDL을 제안한다. 기존의 Rust 검증 도구들은 대부분 Rust 코드를 Viper, Why3 등 중간 언어로 변환한 뒤, 그 중간 표현에 대해 SMT 솔버를 이용해 자동 검증을 수행한다. 이러한 접근법은 구현이 비교적 쉬우며 자동화에 강점이 있지만, 변환 과정 자체가 복잡하고 오류 가능성을 내포한다는 단점이 있다. 또한, 검증이 실패했을 때 증명 트리를 인간이 직접 탐색하거나 수동으로 증명 단계를 적용하기 어려워, 인간‑인‑루프(HIL) 방식의 정밀 검증에 부적합하다.
이에 저자들은 HIL 스타일의 검증을 가능하게 하는 소스 레벨 프로그램 논리를 설계하였다. RustyDL은 동적 논리(Dynamic Logic)를 기반으로 하며, Rust의 핵심 개념인 소유권, 불변·가변 대여, 그리고 배열을 논리적 정렬과 연산자로 모델링한다. 논리 정렬 계층은 Any(최상위)와 ! (최하위) 사이에 bool, unit, 정수, 배열, 그리고 Refₛ(공유 참조)와 Refₘ(가변 참조) 정렬을 두어, Rust 타입 시스템을 1:1로 대응시킨다. 정수 타입은 수학적 정수(int)와 매핑되고, 배열은 고정 길이와 원소 타입을 그대로 반영한다.
핵심 설계 요소는 ‘업데이트(Upd)’라는 연산자 집합이다. 일반 변수 할당(a := t), 가변 참조에 대한 쓰기 연산(t₁ ∗ → t₂), 병렬 업데이트(u₁ ∥ u₂), 그리고 중첩 업데이트({u₁} u₂) 등을 정의함으로써, 프로그램 상태 변화를 원자적이고 결정적인 단계로 분해한다. 특히 가변 참조를 정확히 모델링하기 위해 ‘Place’ 정렬을 도입하고, 각 변수에 고유한 장소 상수 Tₓᴡ를 부여한다. 이를 통해 ‘mref(pl)’ 형태의 참조를 사용해 대여된 메모리 위치를 명시적으로 표현하고, 업데이트 시 대여자와 대여받은 위치가 일치하는지를 검증한다. 이러한 접근은 메모리 모델을 별도로 구축하거나 활성 대여 집합을 추적하는 복잡성을 크게 줄인다.
논리의 의미론은 Kripke 구조(K = (S, ρ))를 이용해 정의된다. 여기서 S는 프로그램 상태의 집합이며, ρ는 프로그램 fragment p에 대한 상태 전이 함수를 부분 함수로 정의한다. 모달 연산자 ⟨p⟩와
원본 논문
고화질 논문을 불러오는 중입니다...
댓글 및 학술 토론
Loading comments...
의견 남기기