[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를 가지고 있습니다.




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의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.

고마워요!

Search