Rust 1.96.0 발표
요약
Rust 1.96.0 버전이 발표되었습니다. 이번 업데이트에서는 Copy 구현이 가능한 새로운 Range 타입 도입, 테스트 진단을 돕는 assert_matches 매크로 추가, 그리고 Cargo의 보안 취약점 수정이 포함되었습니다.
핵심 포인트
- IntoIterator를 구현하여 Copy가 가능한 새로운 Range 타입 안정화
- assert_matches! 매크로를 통한 패턴 매칭 테스트 진단 개선
- WebAssembly 대상 undefined 심볼 처리 방식 변경
- Cargo의 서드파티 레지스트리 관련 보안 취약점(CVE) 수정
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 이슈 트래커에 보고 가능함
- 기존 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에서 적용됨
- WebAssembly 대상은 더 이상 링커에
안정화 API와 보안 수정
안정화된 API
Cargo 보안 권고 2건
-
Rust 1.96은 서드파티 레지스트리 사용자를 위한
Cargo 취약점 2건의 수정 사항을 포함함 - CVE-2026-5223은 심볼릭 링크가 있는 크레이트 tarball 추출과 관련된
중간 심각도취약점임 - CVE-2026-5222는 정규화된 URL을 통한 인증과 관련된
낮은 심각도취약점임 - crates.io 사용자는 두 취약점 모두의 영향을 받지 않음 -
Rust 1.96은 서드파티 레지스트리 사용자를 위한
추가 변경 사항
AI 자동 생성 콘텐츠
본 콘텐츠는 RSS: GeekNews (한국어)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기