[Rust] 1.92.0 업데이트 발표 (번역)
https://blog.rust-lang.org/2025/12/11/Rust-1.92.0/
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.
만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable
rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.
미래의 릴리즈를 테스트해서 러스트 팀을 돕고 싶다면, 로컬에서 베타 채널(rustup default beta) 또는 nightly 채널(rustup default nightly)로 업데이트하는 것을 고려할 수 있습니다.
버그를 발견했다면 리포트해주세요!
1.92.0 stable에는 무엇이 있나요?
Deny-by-default never type lint
언어와 컴파일러 팀은 never 타입의 안정화 작업을 계속하고 있습니다.
이벤 릴리즈에서는 never_type_fallback_flowing_into_unsafe와 dependency_on_unit_never_type_fallback라는 향후 호환성을 위한 린트가 deny-by-default가 되었으며, 이는 감지될 경우 컴파일 오류를 던질 것임을 의미합니다.
이건 컴파일 오류를 일으킬 수는 있지만, 아무튼 lint에 불과하니 모두 #[allow]될 수 있습니다.
이 lint들은 영향을 받는 crate를 직접 빌드할 때만 발동되며, dependencies를 통해 컴파일할 때는 발동하지 않습니다. (다만 Cargo에서 경고를 던집니다.)
이 lint들은 Never 타입 안정화로 인해 깨질 가능성이 있는 코드를 감지합니다. 만약 그것들이 당신의 crate 그래프에 보고되었다면 고칠 것을 권장합니다.
이 lint로 인해 약 500개의 crate가 영향을 받을 것으로 예상됩니다.
그럼에도 불구하고, 우리는 이것이 받아들일 만하다고 생각합니다. lint의 오류는 breaking change가 아니며, 앞으로 never 타입을 안정화할 수 있게 도와줄 것이기 때문입니다.
더 자세한 설명은 언어 팀의 평가를 참조해주세요.
unused_must_use는 이제 Result<(), UninhabitedType>에 대해 경고하지 않음
러스트의 unused_must_use lint는 함수의 반환 값을 무시할 때, 함수나 반환 타입에 #[must_use] 어노테이션이 달려 있다면 경고를 던집니다.
예를 들면, Result의 반환 타입을 무시할 경우 ?나 .expect("...")와 같은 것을 사용하도록 권장하는 식이죠.
그러나 일부 함수는 Result를 반환하지만, 오류 타입이 실제로 "inhabited"가 아니며, 해당 유형의 값을 생성할 수 없을 때가 있습니다.
!나 Infallible 타입 같은 것이 있죠.
이런 맥락에서 unused_must_use lint는 이제 더 이상 Result<(), UninhabitedType>나 ControlFlow<UninhabitedType, ()>에 대해서 경고하지 않습니다.
예를 들어, Result<(), Infallible>의 반환값을 쓰지 않더라도 경고가 뜨지 않는 거죠. 이렇게 하면 절대 발생할 수 없는 오류를 확인할 필요가 없습니다.
use core::convert::Infallible;
fn can_never_fail() -> Result<(), Infallible> {
** // ...**
** Ok(())**
}
fn main() {
** can_never_fail();**
}
이는 특히 오류 타입과 관련된 trait의 공통 패턴에 유용하며, 여기서 오류 타입은 때때로 infallible(실패 가능성이 없음)할 수 있습니다.
trait UsesAssocErrorType {
** type Error;**
** fn method(&self) -> Result<(), Self::Error>;**
}
struct CannotFail;
impl UsesAssocErrorType for CannotFail {
** type Error = core::convert::Infallible;**
** fn method(&self) -> Result<(), Self::Error> {**
** Ok(())**
** }**
}
struct CanFail;
impl UsesAssocErrorType for CanFail {
** type Error = std::io::Error;**
** fn method(&self) -> Result<(), Self::Error> {**
** Err(std::io::Error::other("something went wrong"))**
** }**
}
fn main() {
** CannotFail.method(); // No warning**
** CanFail.method(); // Warning: unused Result that must be used**
}
리눅스에서 -Cpanic=abort 가 활성화되어도 table을 unwind
-Cpanic=abort를 켜둘 경우의 Backtraces는 이전에는 Rust 1.22에서 작동했지만, Rust 1.23에서는 깨졌습니다.
-Cpanic=abort를 켤 경우 unwind-table을 더 이상 방출하지 않게 되었기 때문입니다.
Rust 1.45에서는 -Cforce-unwind-tables=yes 형태의 해결 방법이 안정화되었습니다.
Rust 1.92부터는 -Cpanic=abort가 지정되어 있어도 기본적으로 unwind table이 방출되어 백트레이스가 제대로 작동할 수 있습니다.
이 기본 동작을 원하지 않는다면 -Cforce-unwind-tables=no를 사용해서 명시적으로 비활성화해야 합니다.
#[macro_export]에 대한 입력 검증
지난 몇 번의 릴리스에서 컴파일러 built-in attribute이 처리되는 방식에 많은 변경이 있었습니다.
이건 러스트가 built-in attribute에 대해 제공하는 오류 메시지와 경고를 크게 개선하고, 100개가 넘는 built-in attribute들 간의 진단(diagnostics)을 더욱 일관성 있게 만들어줄 겁니다.
작은 예를 하나 들자면, 구체적으로 이번 릴리스에서 Rust는 macro_export에 허용되는 인수를 확인하는 데 더욱 엄격해졌죠. 해당 검사를 종속성(dependencies)에서도 보고될 "기본값 거부 린트(deny-by-default lint)"로 올린 거에요.
Stable이 된 API
NonZero<u{N}>::div_ceil
Location::file_as_c_str
RwLockWriteGuard::downgrade
Box::new_zeroed
Box::new_zeroed_slice
Rc::new_zeroed
Rc::new_zeroed_slice
Arc::new_zeroed
Arc::new_zeroed_slice
btree_map::Entry::insert_entry
btree_map::VacantEntry::insert_entry
impl Extend<proc_macro::Group> for proc_macro::TokenStream
impl Extend<proc_macro::Literal> for proc_macro::TokenStream
impl Extend<proc_macro::Punct> for proc_macro::TokenStream
impl Extend<proc_macro::Ident> for proc_macro::TokenStream
다음의 기존 stable API들은 이제 const context에서도 stable로 사용 가능합니다.
<[]>::rotate_left
<[]>::rotate_right
기타 변경점
이외의 모든 변경사항은 각 Rust, Cargo, Clippy 페이지를 확인하세요
1.92.0의 컨트리뷰터들에게
1.92.0의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.