- Rust 컴파일러가 포인터 별칭 보장을 최적화에 활용하려면, unsafe 코드가 어디서 규칙을 어기는지 명확히 정의해야 함
- 기존 Stacked Borrows는 그 기준을 제시했지만, 실제 unsafe Rust 코드의 흔한 패턴과 최신 borrow checker 기능을 충분히 받아들이지 못함
- Tree Borrows는 Stacked Borrows의 핵심 구조를 스택에서 트리로 바꿔 더 많은 유효 패턴을 표현할 수 있게 함
- 가장 널리 쓰이는 Rust crate 30,000개 평가에서 Stacked Borrows보다 거부한 테스트 케이스가 54% 적음
- Rocq 증명으로 기존 최적화 대부분을 유지하면서 read-read 재정렬 같은 새 최적화도 가능함을 확인함
unsafe Rust에서 필요한 별칭 규칙
- Rust는 소유권 기반 타입 시스템으로 메모리 안전성과 데이터 레이스 방지 같은 강한 보장을 제공함
- 다만 unsafe 코드 영역에서는 안전성이 자동으로 보장되지 않으며, 프로그래머가 지켜야 할 규칙이 따로 필요함
- 컴파일러는 타입 시스템의 보장, 특히 포인터 별칭(aliasing) 관련 정보를 활용해 함수 내부 최적화를 강화하려 함
- 잘못 작성된 unsafe 코드는 이런 최적화를 깨뜨릴 수 있어, 어떤 코드를 “badly behaved”로 볼지 명확한 기준이 중요함
- 기존 연구인 Stacked Borrows는 이 기준을 정의했지만 한계가 있음
- 실제 unsafe Rust 코드에서 흔한 여러 패턴을 거부함
- 최근 도입된 Rust borrow checker의 고급 기능을 반영하지 못함
Tree Borrows의 접근과 평가 결과
- Tree Borrows는 Stacked Borrows의 중심 구조인 스택을 트리로 대체해 정의됨
- 이 구조 변경으로 기존 모델의 제한을 완화함
- 가장 널리 쓰이는 Rust crate 30,000개 평가에서 Stacked Borrows보다 거부한 테스트 케이스가 54% 감소함
- Rocq 증명으로 최적화 관련 성질도 확인됨
- Stacked Borrows가 허용하던 최적화 대부분을 유지함
- 중요한 새 최적화인 read-read reorderings도 가능함
- Tree Borrows는 PLDI'25 Distinguished Paper Award를 받음
- 관련 자료