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 번역하는 것은 적합하지 않다고 경고함
  • robobun은 관련 커밋으로 PathString::init signature stays unsafe 테스트와 dir_iterator: make next() unsafe; audit call sites를 추가함
  • SimonReiff는 저장소의 Rust 파일에서 주석을 제외한 unsafe grep 결과가 13255줄이라고 제시하며, 즉시 되돌리고 AI 코드 사용 정책과 절차를 논의해야 한다고 요구함
  • Jarred-Sumner는 Rust port가 현재 원래 Zig 코드에 가능한 한 가까운 1:1 mapping을 출발점으로 삼고 있으며 개선 중이라고 밝히고, Rust 코드의 버그나 unsound behavior를 계속 새 이슈로 제보해 달라고 요청함
Read Entire Article