TL;DR

  • Rust 1.99.0에서 C 및 C-unwind ABI를 사용하는 C 가변 함수 정의와 raw pointer의 크기·정렬 정보 조회 기능이 안정화됨.
  • VaList와 VaArgSafe를 통해 가변 인자 목록을 다루며, 비C ABI의 naked 가변 함수 정의도 인라인 어셈블리를 사용하는 방식으로 지원됨.
  • Layout::for_value_raw, mem::size_of_val_raw, mem::align_of_val_raw가 안정화돼 Sized 및 비Sized 타입을 가리키는 raw pointer의 레이아웃 정보 조회가 가능함.
  • Box::leak 문서는 나중에 메모리를 해제하는 패턴을 권장하지 않으며, 대신 Box::into_non_null을 선호하도록 안내함.
  • 이터레이터, VecDeque, Box, Vec, 문자열, 파일 시스템 시간 설정 등을 포함한 표준 라이브러리 API가 추가로 안정화됨.

Rust 1.99.0 출시

  • Rust 팀이 프로그래밍 언어 Rust의 새 버전인 1.99.0을 발표함. Rust는 누구나 신뢰할 수 있고 효율적인 소프트웨어를 만들 수 있도록 지원하는 프로그래밍 언어임.
  • rustup으로 이전 버전의 Rust를 설치했다면 rustup update stable 명령으로 1.99.0을 설치할 수 있음.
  • rustup이 설치돼 있지 않다면 Rust 웹사이트의 해당 페이지에서 설치할 수 있으며, 1.99.0의 상세 릴리스 노트도 확인할 수 있음.
  • 향후 릴리스를 테스트하려면 로컬 기본 채널을 베타(rustup default beta) 또는 나이틀리(rustup default nightly)로 변경할 수 있으며, 발견한 버그를 보고하도록 요청함.

Rust 1.99.0 안정 버전의 주요 변경 사항

`extern "C"` 가변 함수

  • Rust 1.99.0에서 C 및 C-unwind ABI로 C 가변 함수(variadic function)를 정의하는 기능이 안정화됨.
  • 이 방식으로 정의한 함수는 가변 인자 목록(...)을 사용해 임의 개수의 인자를 받음. Rust는 이전부터 libc::printf처럼 외부에서 정의된 가변 함수를 호출할 수 있었으며, 이제 Rust 코드 자체에서 해당 함수를 정의할 수 있음.
  • ...의 타입은 VaList이며, 모든 대상 플랫폼에서 C의 va_list 타입과 ABI 호환됨. VaList에서 읽을 수 있는 타입은 VaArgSafe 트레이트로 제한됨.
  • C 가변 함수에 관한 자세한 내용은 Reference에서 확인할 수 있음.
  • 이 릴리스에서는 비C ABI의 naked 가변 함수 정의 지원도 안정화됨. 해당 함수는 인라인 어셈블리로 작성해야 함.

raw pointer의 레이아웃 정보

  • 이번 릴리스에서 Sized 및 비Sized 타입을 가리키는 raw pointer의 크기와 정렬을 조회하는 데 필요한 안전성 요건이 정리됨. Sized 타입 조회는 trivially safe하며 이미 안정 버전에서 가능했음.
  • 다음 세 함수가 안정화됨.
  • Layout::for_value_raw
  • mem::size_of_val_raw
  • mem::align_of_val_raw
  • Rust 1.99.0에서 언어 의미론 변경은 없음. 다만 Box::leak 문서가 해당 메모리를 나중에 해제하는 패턴을 권장하지 않도록 갱신됨.
  • 그런 코드가 현재 및 향후 가능성이 있는 컴파일러 최적화와 문제가 있는 상호작용을 일으키는 것으로 확인됐으며, 곧 안정화될 사용자 정의 할당자(custom allocator)와 특히 문제가 됨. 대신 Box::into_non_null을 선호하도록 안내함.
  • 이 지침은 표준 라이브러리의 다른 누수 함수에도 적용됨.

안정화된 API

  • IntoIterator for Box<[T; N]>
  • IntoIterator for &Box<[T; N]>
  • IntoIterator for &mut Box<[T; N]>
  • VecDeque::retain_back
  • core::ffi::VaList
  • Box::into_non_null
  • Box::from_non_null
  • Vec::into_parts
  • Vec::from_parts
  • core::mem::size_of_val_raw
  • core::mem::align_of_val_raw
  • core::alloc::Layout::for_value_raw
  • String::from_utf8_lossy_owned
  • string::FromUtf8Error::into_utf8_lossy
  • FusedIterator for StepBy<I>
  • std::fs::set_times
  • std::fs::set_times_nofollow

기타 변경 사항

  • Rust, Cargo, Clippy에서 변경된 전체 내용을 확인할 수 있음.

Rust 1.99.0 기여자

  • 많은 사람이 함께 Rust 1.99.0을 만들었으며, 모두의 기여에 감사를 전함.