Rust 1.96.0 발표

1 hour ago 1
  • Rust 1.96.0은 rustup update stable로 설치할 수 있으며, 향후 릴리스 검증은 beta/nightly 채널에서 참여 가능함
  • 새 core::range::Range* 타입은 Iterator 대신 IntoIterator를 구현해 Copy 구현이 가능하며, 향후 범위 문법의 기본 타입이 될 예정임
  • assert_matches! 와 debug_assert_matches!는 패턴 불일치 시 값의 Debug 표현을 함께 출력해 테스트 실패 진단을 쉽게 만듦
  • WebAssembly 대상은 더 이상 --allow-undefined를 기본 전달하지 않아 정의되지 않은 심볼이 import가 아니라 링커 오류가 됨
  • Cargo에는 서드파티 레지스트리 사용자를 위한 CVE-2026-5223과 CVE-2026-5222 수정이 포함됐고, crates.io 사용자는 영향받지 않음

Rust 1.96.0 주요 변경점

  • 업데이트와 테스트 채널

    • 기존 Rust를 rustup으로 설치한 사용자는 rustup update stable로 Rust 1.96.0을 받을 수 있음
    • rustup이 없으면 Rust 웹사이트의 rustup 설치 페이지에서 설치할 수 있으며, 1.96.0 상세 릴리스 노트도 공개됨
    • 향후 릴리스 검증에 참여하려면 rustup default beta 또는 rustup default nightly로 beta/nightly 채널을 사용할 수 있고, 버그는 Rust 이슈 트래커에 보고 가능함
  • 새로운 Range* 타입

    • 기존 Range와 관련 core::ops 타입은 많은 사용자가 Copy를 기대하지만, 직접 Iterator를 구현하기 때문에 Copy를 함께 구현하지 않았음
    • 같은 타입에 Iterator와 Copy를 함께 구현하는 방식은 Clippy가 지적하는 footgun이어서 피하고 있었음
    • RFC3550은 Iterator 대신 IntoIterator를 구현하는 대체 범위 타입을 제안했고, 이 구조에서는 해당 타입들이 Copy도 구현할 수 있음
    • 표준 라이브러리에는 core::range::Range, core::range::RangeFrom, core::range::RangeInclusive와 관련 반복자들이 안정화됨
    • 가까운 향후 Rust 버전에는 core::ops에서 다시 내보내는 core::range::RangeFull과 core::range::RangeTo, 현재 범위 타입의 새 위치가 될 core::range::legacy::*도 추가될 예정임
    • 0..1 같은 범위 문법은 현재 레거시 타입을 만들지만, 향후 에디션에서 core::range 타입으로 바뀔 예정임
    • 새 안정화로 start와 end를 분리하지 않고도 슬라이스 접근자를 Copy 타입에 저장할 수 있음
    • 예시: use core::range::Range; #[derive(Clone, Copy)] pub struct Span(Range<usize>); impl Span { pub fn of(self, s: &str) -> &str { &s[self.0] } }
    • 새 RangeInclusive는 필드를 공개하며, 레거시 버전처럼 소진된 반복자 상태 노출을 피할 필요가 없음
    • 새 타입은 반복을 시작하려면 먼저 변환되어야 하므로 공개 필드가 문제가 되지 않음
    • 라이브러리 작성자는 공개 API에서 레거시와 새 범위 타입을 모두 받는 impl RangeBounds 사용을 고려해야 함
    • 구체 타입이 필요하면 향후 기본값이 될 새 범위 타입을 선호하는 것이 권장됨
  • 패턴 매칭 단언 매크로

    • 새 매크로 assert_matches!debug_assert_matches!는 값이 주어진 패턴과 맞는지 검사하고, 맞지 않으면 해당 값의 Debug 표현과 함께 패닉함
    • 두 매크로는 본질적으로 assert!(matches!(..)), debug_assert!(matches!(..))와 같지만, 실패 시 출력되는 값 덕분에 진단 가능성이 좋아짐
    • 같은 이름의 매크로를 제공하는 인기 서드파티 크레이트와 충돌할 수 있어 표준 프렐류드에는 추가되지 않았음
    • 사용 전 core 또는 std에서 직접 가져와야 함
    • 예시: use core::assert_matches; /// [Random Number](https://xkcd.com/221/) fn get_random_number() -> u32 { // chosen by a fair dice roll. // guaranteed to be random. 4 } fn main() { assert_matches!(get_random_number(), 1..=6); }
  • WebAssembly 대상 변경

    • WebAssembly 대상은 더 이상 링커에 --allow-undefined를 전달하지 않음
    • 링크 시 정의되지 않은 심볼은 "env" 모듈의 WebAssembly import로 변환되지 않고 링커 오류가 됨
    • 링크 관련 심볼이 모두 정의되지 않으면 모듈이 링크되지 않으므로, 버그를 더 일찍 잡고 심볼 이름 등에서 발생하는 우발적 문제를 막을 수 있음
    • 정의되지 않은 링크 관련 심볼은 보통 빌드 시간 버그나 설정 오류를 나타냄
    • 기존 동작이 의도된 경우 RUSTFLAGS=-Clink-arg=--allow-undefined로 되돌리거나, 소스 코드에서 심볼을 정의하는 블록에 #[link(wasm_import_module = "env")]를 사용할 수 있음
    • 이 변경은 이전 블로그 공지 이후 Rust 1.96에서 적용됨

안정화 API와 보안 수정

Read Entire Article