Bun Rust 재작성: "코드베이스가 기본적인 miri 검사에 실패하고 safe Rust에서 UB를 허용"
4 hours ago
2
이 이슈는 현재 Open 상태이며, 대화는 off topic으로 잠기고 collaborator로 제한됐고, 관련 수정으로 #30728과 #30876이 연결돼 있음
제보자는 PathString::init으로 만든 값이 원본 Box가 drop된 뒤에도 slice()를 호출할 수 있어, Miri가 dangling reference 기반 Undefined Behavior를 보고한다고 제시함
재현 코드는 Box::new(*b"Hello World")로 만든 버퍼를 PathString::init(&*test)에 넘긴 뒤 drop(test) 후 init.slice()를 호출하는 형태였고, Miri는 core::slice::from_raw_parts 지점에서 오류를 냄
robobun은 문제가 재현됐다고 확인하며, PathString::init이 safe 함수인데도 slice lifetime을 지워서 dangling &[u8]를 만들 수 있다고 정리함
연결된 #30728은 PathString::init과 dir_iterator::next()의 병렬 구멍을 unsafe fn으로 바꾸고, 호출부 약 70곳에 backing allocation을 명시한 SAFETY 주석을 추가하는 방향임
같은 수정에는 세 시그니처에서 unsafe 키워드가 필요함을 강제하는 compile_fail doctest와 resolver의 readdir-error fd leak 수정도 포함됐다고 설명됨
AwesomeQubic은 추가로 PathString::init이 provenance를 지우며 MIRIFLAGS=-Zmiri-strict-provenance에서도 실패한다고 덧붙임
JavaDerg는 init이 &[u8]의 암묵적 lifetime을 받아 unsafe 작업으로 이를 지운 뒤 'static처럼 보이는 Self를 반환해 use-after-free와 invalid aliasing을 허용한다고 설명함
JavaDerg는 Rust의 안전 모델 위에서 UB가 예상 밖의 위치에서 문제를 일으킬 수 있다며, unsafe 사용 전반에 대한 검토가 필요하고 다른 언어의 메모리 관리 방식을 Rust로 1:1 번역하는 것은 적합하지 않다고 경고함