[Rust] 1.99.0 업데이트 발표 (번역)
https://blog.rust-lang.org/2026/10/01/Rust-1.99.0/
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.
만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable
rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.
미래의 릴리즈를 테스트해서 러스트 팀을 돕고 싶다면, 로컬에서 베타 채널(rustup default beta) 또는 nightly 채널(rustup default nightly)로 업데이트하는 것을 고려할 수 있습니다.
버그를 발견했다면 리포트해주세요!
1.99.0 stable에는 무엇이 있나요?
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
extern "C" variadics
Rust 1.99.0에서는 "C" 및 "C-unwind" ABI를 사용하는 C ABI 가변 인자 함수(variadic function)를 정의하는 기능이 추가되었습니다.
이 방식으로 정의되는 가변 인자 함수는 가변 인자 목록("...")을 사용하며, 임의 개수의 인자를 받을 수 있습니다.
기존에도 Rust에서 외부에 정의된 가변 인자 함수(예: "libc::printf")를 호출하는 것은 가능했지만, Rust 1.99부터는 이러한 함수를 Rust 자체에서 직접 작성할 수 있습니다.
/// SAFETY: 최소 2개의 i32 인자와 함께 호출해야 합니다.****
unsafe extern "C" fn sum(mut args: ...) -> i32 {
** **** // SAFETY: 호출자가 이를 보장합니다.******
** let a = unsafe { args.next_arg::
** let b = unsafe { args.next_arg::
** a + b**
}
fn foo() -> i32 {
** unsafe { sum(0i32, 2i32) }**
}
"..."의 타입은 "VaList"이며, 모든 타깃에서 C의 "va_list" 타입과 ABI 호환성을 가집니다. "VaList"에서 어떤 타입을 읽을 수 있는지는 VaArgSafe trait를 통해 제한됩니다.
C 가변 인자 함수("c-variadic functions")에 대한 자세한 내용은 Reference를 참고하세요.
또한 이번 릴리스에서는 C ABI가 아닌 naked 가변 인자 함수를 정의하는 기능도 안정화되었습니다. 이러한 함수는 인라인 어셈블리(inline assembly)를 사용해 작성해야 합니다.
Raw Pointer에서 레이아웃 정보 가져오기
이번 릴리스에서는 Sized 타입과 non-Sized 타입 모두에 대해, raw pointer로부터 크기(size)와 정렬(alignment) 정보를 가져올 때 필요한 safety 요구사항이 명확하게 정립되었습니다.
이를 위해 다음 세 함수가 안정화되었습니다.
- Layout::for_value_raw
- mem::size_of_val_raw
- mem::align_of_val_raw
Box::leak 이후 다시 메모리를 해제하는 패턴 비권장
Rust 1.99에서는 언어 자체의 의미론이 변경되지는 않았지만, "Box::leak"의 문서가 업데이트되어 "Box::leak"으로 누수시킨 메모리를 나중에 다시 해제하는 패턴을 사용하지 않을 것을 권장하게 되었습니다.
이러한 코드 패턴이 현재 및 향후 도입될 수 있는 컴파일러 최적화와 문제가 발생할 수 있다는 사실이 확인되었기 때문입니다. 특히 앞으로 안정화될 커스텀 allocator 기능과 함께 사용할 경우 더욱 문제가 될 수 있습니다.
따라서 이러한 용도로는 "Box::leak" 대신 다음 함수들을 사용하는 것이 권장됩니다.* *
- Box::into_non_null
- Box::into_raw
이 지침은 표준 라이브러리에 존재하는 다른 "leak" 함수에도 동일하게 적용됩니다.
Stable이 된 API
IntoIterator for Box<[T; N]>
IntoIterator for &Box<[T; N]>
IntoIterator for &mut Box<[T; N]>
VecDeque::retain_back
core::ffi::VaList
Box::into_non_null
Box::from_non_null
Vec::into_parts
Vec::from_parts
core::mem::size_of_val_raw
core::mem::align_of_val_raw
core::alloc::Layout::for_value_raw
String::from_utf8_lossy_owned
string::FromUtf8Error::into_utf8_lossy
FusedIterator for StepBy
std::fs::set_times
std::fs::set_times_nofollow
기타 변경점
이외의 모든 변경사항은 각 Rust, Cargo, Clippy 페이지를 확인하세요.
1.99.0의 컨트리뷰터들에게
1.99.0의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.