← 목록으로

Rust 1.99.0 발표

요약
  • Rust 1.99.0 버전이 출시되었습니다.
  • 이번 업데이트에서는 "C" 및 "C-unwind" ABI를 위한 가변 인자 함수를 직접 정의할 수 있는 기능이 추가되었으며, 원시 포인터 레이아웃 조회 및 컬렉션 관련 다양한 API가 안정화되었습니다.
  • 또한 Box::leak 사용 시 메모리 재해제 패턴을 피하도록 권고하는 문서 변경이 포함되었습니다.
  • Rust 1.99.0에서 "C"와 "C-unwind" ABI의 가변 인자 함수를 직접 정의할 수 있게 됨
  • 가변 인자 목록은 C의 va_list와 ABI 호환되는 VaList 로 다루며, 읽을 수 있는 타입은 VaArgSafe 트레이트로 제한됨
  • 원시 포인터의 레이아웃 정보 조회 API 3개가 안정화되며, Sized와 Sized가 아닌 타입에 대한 안전성 요구사항이 확정됨
  • Box::leak 이후 메모리를 다시 해제하는 패턴을 피하도록 문서가 변경됨. 언어 의미론의 변경은 없으며, 대신 Box::into_non_null이나 Box::into_raw 사용을 권장함
  • 컬렉션, 문자열, 파일 시간 설정 API도 안정화됨. 박싱된 배열의 IntoIterator, Vec의 구성 요소 변환, 손실 허용 UTF-8 변환 등이 포함됨
가변 인자 함수와 메모리 안전성
  • C ABI 가변 인자 함수 정의가 안정화됨
    • 기존에는 libc::printf처럼 외부에서 정의한 가변 인자 함수를 호출할 수 있었지만, 이제 "C"와 "C-unwind" ABI로 Rust 자체에서 작성할 수 있음
    • ...로 가변 인자 목록을 받으며, 예제의 unsafe extern "C" fn sum(mut args: ...)은 호출자가 최소 2개의 i32 인자를 전달한다는 안전성 조건 아래 args.next_arg::<i32>()로 두 값을 읽어 더함
    • ...의 타입인 VaList는 각 타깃의 C va_list와 ABI 호환되며, 읽을 수 있는 타입은 VaArgSafe 트레이트가 제한함
    • "C"가 아닌 ABI의 naked 가변 인자 함수 정의도 안정화되며, 반드시 인라인 어셈블리로 작성해야 함
    • 세부 규칙은 C 가변 인자 함수 레퍼런스에서 확인 가능함
  • 원시 포인터의 레이아웃 정보 조회를 위한 API 3개가 안정화됨
    • Layout::for_value_raw, mem::size_of_val_raw, mem::align_of_val_raw가 대상임
    • Sized와 Sized가 아닌 타입 모두에 대해 크기와 정렬 정보를 조회할 때의 안전성 요구사항을 확정함
    • Sized 타입의 조회는 안전성 조건이 자명하며, 기존 안정 버전에서도 가능했음
  • Box::leak 문서는 누출한 메모리를 나중에 다시 해제하는 패턴을 피하도록 권고함
    • 이 패턴은 현재 및 향후 도입될 수 있는 컴파일러 최적화와 상호작용할 때 문제가 있으며, 특히 향후 사용자 정의 할당자 안정화와 관련해 문제가 큼
    • 대신 Box::into_non_null 또는 Box::into_raw를 사용하는 편이 바람직함
    • 언어 의미론은 바뀌지 않으며, 같은 권고가 표준 라이브러리의 다른 leak 함수에도 적용됨
추가 안정화 API와 업데이트
  • 컬렉션과 반복자 관련 API가 안정화됨
    • 박싱된 배열의 IntoIterator for Box<[T; N]>, &Box<[T; N]>, &mut Box<[T; N]>에 대한 구현이 포함됨
    • VecDeque::retain_back과 FusedIterator for StepBy<I>도 안정화됨
  • 포인터와 구성 요소 변환 API로 Box::into_non_null, Box::from_non_null, Vec::into_parts, Vec::from_parts가 안정화됨
  • 문자열과 파일 시간 설정 API도 안정화됨
    • 문자열에는 String::from_utf8_lossy_owned, string::FromUtf8Error::into_utf8_lossy가 추가됨
    • 파일 시스템에는 std::fs::set_times, std::fs::set_times_nofollow가 추가됨
  • 기존 rustup 사용자는 rustup update stable로 1.99.0으로 업데이트할 수 있음
    • 신규 설치는 rustup 설치 페이지를 이용할 수 있음
    • 향후 릴리스 테스트에는 rustup default beta 또는 rustup default nightly를 사용할 수 있으며, 발견한 버그는 이슈 페이지에 신고 가능함
  • 전체 변경 사항은 1.99.0 상세 릴리스 노트와 Rust, Cargo, Clippy 변경 내역에서 확인 가능함
그냥 목록으로
원문 보기 ↗