Rust 1.96 발표
Rust 1.96.0 릴리스
Rust 팀은 새로운 버전 1.96.0을 발표하게 되어 기쁩니다. Rust는 모두가 신뢰할 수 있고 효율적인 소프트웨어를 만들 수 있게 해 주는 프로그래밍 언어입니다.
설치
이미 rustup을 통해 이전 버전의 Rust를 설치했었다면, 다음 명령으로 1.96.0으로 업그레이드하세요:
rustup update stable
아직 rustup이 없다면 여기서 받으세요. 전체 변경 사항 목록은 **1.96.0 상세 릴리스 노트**를 참고하세요.
향후 릴리스를 테스트하려면 베타 혹은 나이틀리 채널로 전환해 보세요:
rustup default beta # 베타 채널 사용
rustup default nightly # 나이틀리 채널 사용
1.96.0 (stable)에서 새로 추가된 내용
새로운 Range* 타입
많은 사용자가 Range와 관련 core::ops 타입이 Copy가 되길 기대하지만, 현재 이들은 Iterator를 직접 구현하고 있습니다. 같은 타입에 Iterator와 Copy를 동시에 구현하면 위험하기 때문에(Clippy lint 참고) — Clippy lint 보기 — RFC 3550에서는 Iterator 대신 IntoIterator를 구현하는 대체 범위 타입을 도입했습니다. 이를 통해 Copy가 가능해졌습니다. 해당 RFC의 표준 라이브러리 부분이 이제 안정화되어 다음이 추가되었습니다:
core::range::Rangecore::range::RangeFromcore::range::RangeInclusive- 연관된 iterator들
향후 Rust 버전에서는 core::range::RangeFull과 core::range::RangeTo( core::ops에서 재내보내기)도 추가되고, 현재 사용 중인 범위들은 core::range::legacy::*로 이동할 예정입니다. 0..1 구문은 아직 레거시 타입을 생성하지만, 이후 에디션에서는 새로운 core::range 타입으로 교체될 것입니다.
예시
use core::range::Range;
#[derive(Clone, Copy)]
pub struct Span(Range);
impl Span {
pub fn of(self, s: &str) -> &str {
&s[self.0]
}
}
RangeInclusive는 이제 필드를 공개합니다. 레거시 버전은 소진된 iterator 상태를 숨겼었죠. 구체적인 타입이 필요할 때는 새로운 범위 타입을 사용하세요—곧 기본이 될 예정입니다.
팁: 라이브러리 작성자는 공개 API에서
impl RangeBounds를 사용하는 것을 고려하세요. 이렇게 하면 레거시와 새로운 범위 타입 모두를 받아들일 수 있습니다.
assert_matches! 매크로
새로운 매크로 assert_matches!와 debug_assert_matches!가 추가되었습니다. 이 매크로들은 값이 지정된 패턴과 일치하는지 확인하고, 일치하지 않을 경우 Debug 표현을 포함한 패닉을 발생시킵니다. assert!(matches!(..))와 debug_assert!(matches!(..))와 동일하지만, 실패 시 출력되는 값이 진단을 쉽게 해 줍니다.
이 매크로들은 표준 프리루드에 포함되지 않습니다(동일 이름의 서드파티 크레이트와 충돌 방지). 직접 가져와서 사용하세요:
use core::assert_matches;
/// [Random Number](https://xkcd.com/221/)
fn get_random_number() -> u32 {
// 공정한 주사위 굴림으로 선택되었습니다.
// 무작위임이 보장됩니다.
4
}
fn main() {
assert_matches!(get_random_number(), 1..=6);
}
WebAssembly 타깃 변경 사항
WebAssembly 타깃이 이제 링커에 --allow-undefined 옵션을 전달하지 않습니다. 따라서 정의되지 않은 심볼이 있으면 링커 오류가 발생하고, 이전처럼 자동으로 "env" 모듈에서 가져오기로 전환되지 않습니다. 이로써 버그를 더 일찍 발견하고, 실수로 심볼 이름을 잘못 지정하는 상황을 방지할 수 있습니다.
예전 동작이 필요하다면 다음과 같이 다시 활성화할 수 있습니다:
RUSTFLAGS="-Clink-arg=--allow-undefined"
또는 소스를 수정하고 심볼을 정의하는 블록에 #[link(wasm_import_module = "env")]를 추가하세요.
이 변경은 이전에 공지된 바와 같이 Rust 1.96에서 적용됩니다.
안정화된 API
assert_matches!debug_assert_matches!From for AssertUnwindSafeFrom for LazyCellFrom for LazyLockcore::range::RangeToInclusivecore::range::RangeToInclusiveItercore::range::RangeFromcore::range::RangeFromItercore::range::Rangecore::range::RangeIter
보안 권고
Rust 1.96에는 서드파티 레지스트리를 사용하는 사용자에게 영향을 주는 두 가지 취약점이 수정되었습니다.
- CVE‑2026‑5223 – 크레이트 tarball 추출과 관련된 중간 심각도 이슈.
(두 번째 권고에 대한 상세 내용은 원본에서 생략되었습니다.)
보안
- CVE‑2026‑5221 – 심볼릭 링크 처리와 관련된 낮음 심각도 이슈.
- CVE‑2026‑5222 – 정규화된 URL 인증과 관련된 낮음 심각도 취약점.
참고: crates.io 이용자는 두 취약점 모두 영향을 받지 않습니다.
기타 변경 사항
다음에서 전체 변경 내역을 확인하세요:
1.96.0에 기여한 사람들
많은 분들이 모여 Rust 1.96.0을 만들었습니다. 여러분 없이는 이룰 수 없었겠죠.
감사합니다!