[Rust] 1.81.0 업데이트 발표 (번역)
https://blog.rust-lang.org/2024/09/05/Rust-1.81.0.html
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.
만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable
rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.
미래의 릴리즈를 테스트해서 러스트 팀을 돕고 싶다면, 로컬에서 베타 채널(rustup default beta) 또는 nightly 채널(rustup default nightly)로 업데이트하는 것을 고려할 수 있습니다.
버그를 발견했다면 리포트해주세요!
What's in 1.81.0 stable
core::error::Error
1.81은 core에서 Error trait을 stable에 넣어서 이제 #![no_std] 라이브러리에서도 사용할 수 있습니다.
이건 라이브러리가 어떤 환경을 대상으로 하는지에 관계없이, 더 넓은 러스트 생태계가 동일한 Error trait을 표준화할 수 있게 합니다.
새로운 sort 구현
표준 라이브러리의 stable sort와 unstable sort 구현이 모두 새로운 알고리즘으로 업데이트되어 런타임 성능과 컴파일 시간이 향상되었습니다.
또한 두 새로운 sort 알고리즘 모두 의미 있게 정렬된 결과를 생성할 수 없도록 하는 Ord의 잘못된 구현을 감지하려고 하며, 이제 무작위로 배열된 데이터를 반환하지 않고 panic을 던질 겁니다.
사용자가 이러한 panic에 직면한다면 PartialOrd/Ord에 문서화된 요구 사항을 충족하는지 확인하기 위해 ordering 구현을 검사해야 합니다.
#[expect(lint)]
1.81은 새로운 lint level을 stable에 넣었습니다.
이제는 특정 lint가 발생해야 함을 명시적으로 언급하고, 발생하지 않으면 경고할 수 있습니다.
이건 lint 구현 버그나 지속적인 리팩터링으로 인해 lint를 일시적으로 침묵시키거나, lint이 더 이상 필요하지 않은 시기를 알고 싶은 경우를 위해 제공됩니다.
예를 들어, undocumented_unsafe_blocks과 같은 clippy lint를 통해 시행되는 새로운 제한을 준수하기 위해 코드 베이스를 이동하는 경우, 전환 시에 #[expect(clippy::undocumented_unsafe_blocks)]를 사용하여 모든 unsafe 블록이 문서화되면 lint를 거부하는 겁니다.
clippy는 또한 이 기능의 사용을 강제하고 기존 속성을 마이그레이션하는 데 도움이 되는 두 개의 lint를 가지고 있습니다.
-
clippy::allow_attributes는 #[expect]에 유리한(favor) 속성을 제한하거나 #[allow] 속성을 #[expect]로 이동하도록 허용합니다.
-
clippy::allow_attributes_without_reason는 #[allow] attribute에 대한 이유를 요구하기 위해 존재합니다.
Lint reasons
lint level을 변경하는 것은 종종 특수한 이유로 이루어집니다.
예를 들어, 코드가 부동소수점 지원이 없는 환경에서 실행되는 경우에는 #![deny(clippy::float_arithmetic)]로 clippy를 사용하여 이러한 사용에 lint를 사용할 수 있습니다.
하지만 프로젝트의 새로운 개발자가 이 lint fire를 보았다면 추가된 이유를 설명하는 deny에 대한 comment를 찾아야 합니다.
Rust 1.81을 사용하면 컴파일러 메시지로 직접 알 수 있습니다.
error: floating-point arithmetic detected
** --> src/lib.rs:4:5**
** |**
4 | a + b
** | ^^^^^**
** |**
** = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_arithmetic**
** = note: no hardware float support**
note: the lint level is defined here
** --> src/lib.rs:1:9**
** |**
1 | #![deny(clippy::float_arithmetic, reason = "no hardware float support")]
** | ^^^^^^^^^^^^^^^^^^^^^^^^**
Stable이 된 API
core::error
hint::assert_unchecked
fs::exists
AtomicBool::fetch_not
Duration::abs_diff
IoSlice::advance
IoSlice::advance_slices
IoSliceMut::advance
IoSliceMut::advance_slices
PanicHookInfo
PanicInfo::message
PanicMessage
이 API들은 이제 const context에서도 stable입니다.
char::from_u32_unchecked (function)
char::from_u32_unchecked (method)
CStr::count_bytes
CStr::from_ptr
호환성 노트
panic hook과 panic handler 인자를 분리
우리는 std::panic::PanicInfo를 std::panic::PanicHookInfo로 이름을 변경했습니다.
예전 이름도 alias로 계속 작동하지만 1.82.0에서부터는 deprecation 경고가 발생할 겁니다.
그러나 core::panic::PanicInfo는 이제 다른 타입이기 때문에 변경되지 않습니다.
그 이유는 이 타입들이 다른 역할을 하기 때문입니다.
std::panic::PanicHookInfo는 std 컨텍스트에서 panic hook에 대한 인자입니다. panic이 임의의 페이로드를 가질 수 있죠.
반면 core::panic::PanicInfo는 #![no_std] 컨텍스트에서 #[panic_handler]에 대한 인자입니다. panic이 항상 형식화(formatted)된 메시지를 가지죠.
이제 이 타입들을 분리한 덕분에 std::panic::PanicHookInfo:payload_as_str() 및 core::panic::PanicInfo::message()와 같이, 타입에 더 유용한 method를 추가할 수 있습니다.
extern "C" 함수에서 uncaught panics에 대해 abort
이로써 1.71에서 시작된 대장정이 완료됩니다.
ABI 경계를 넘어 unwind될 때 전용 "C-unwind" ABI가 추가되는 거죠.
1.81을 기준으로 non-unwind ABI(예: "C")는 이제 uncaught unwinds에 대해 abort를 날려서 오랜 soundness 문제를 종료합니다.
unwind에 의존하는 프로그램은 -unwind 접미사 ABI 변형을 사용하는 것으로 전환해야 합니다.
WASI 0.1 target naming 변경
이제 ism32-wasi target(WASI 0.1 target)를 사용하면 컴파일러 경고가 뜨고, 사용자가 ism32-wasip1 target으로 전환하도록 제안할 수 있습니다.
두 target은 모두 동일하며, 아직까지는 이름만 변경되고 있는 중이고, 원본인 wasm32-wasi은 2025년 1월 제거가 가능하도록 준비중입니다.
CVE-2024-43402 수정
std::process::Command는 이제 후행 화이트 스페이스 또는 마침표가 있는 상태에서 Windows에서 배치 파일을 호출할 때 인수를 올바르게 escape합니다.
후행 화이트 스페이스나 마침표는 windows에 의해 무시되고 제거되죠.
이 변경 사항에 대한 자세한 내용은 이전 발표를 참조하세요.
기타 변경점
이외의 모든 변경사항은 각각 Rust, Cargo, Clippy에서 확인하세요.
1.81.0의 컨트리뷰터들에게
1.81.0의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.