Rust 1.96 발표

발행: (2026년 5월 29일 AM 04:20 GMT+9)
7 분 소요

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를 직접 구현하고 있습니다. 같은 타입에 IteratorCopy를 동시에 구현하면 위험하기 때문에(Clippy lint 참고) — Clippy lint 보기 — RFC 3550에서는 Iterator 대신 IntoIterator를 구현하는 대체 범위 타입을 도입했습니다. 이를 통해 Copy가 가능해졌습니다. 해당 RFC의 표준 라이브러리 부분이 이제 안정화되어 다음이 추가되었습니다:

  • core::range::Range
  • core::range::RangeFrom
  • core::range::RangeInclusive
  • 연관된 iterator들

향후 Rust 버전에서는 core::range::RangeFullcore::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


보안 권고

Rust 1.96에는 서드파티 레지스트리를 사용하는 사용자에게 영향을 주는 두 가지 취약점이 수정되었습니다.

  • CVE‑2026‑5223 – 크레이트 tarball 추출과 관련된 중간 심각도 이슈.

(두 번째 권고에 대한 상세 내용은 원본에서 생략되었습니다.)

보안

  • CVE‑2026‑5221 – 심볼릭 링크 처리와 관련된 낮음 심각도 이슈.
  • CVE‑2026‑5222 – 정규화된 URL 인증과 관련된 낮음 심각도 취약점.

참고: crates.io 이용자는 두 취약점 모두 영향을 받지 않습니다.

기타 변경 사항

다음에서 전체 변경 내역을 확인하세요:

1.96.0에 기여한 사람들

많은 분들이 모여 Rust 1.96.0을 만들었습니다. 여러분 없이는 이룰 수 없었겠죠.
감사합니다!

0 조회
Back to Blog

관련 글

더 보기 »

Rust 1.96.0 발표

Rust 1.96.0 – Release Announcement The Rust team is happy to announce a new version of Rust, 1.96.0. Rust is a programming language empowering everyone to buil...

마이크로소프트, C# 메모리 안전성을 러스트 수준으로 높인다

마이크로소프트의 C 메모리 안전성 강화 계획 마이크로소프트는 C 언어의 메모리 안전성을 러스트 수준으로 끌어올리겠다는 계획을 발표했습니다. 닷넷 제품 관리자 리처드 랜더는 21일 개발자 블로그에서 “C의 메모리 안전성을 대폭 개선하는 작업을 진행 중”이라며, unsafe 키워드를 재설...