[Rust] 1.72.0 업데이트 발표 (번역)
https://blog.rust-lang.org/2023/08/24/Rust-1.72.0.html
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.
만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable
rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.
미래의 릴리즈를 테스트해서 러스트 팀을 돕고 싶다면, 로컬에서 베타 채널(rustup default beta) 또는 nightly 채널(rustup default nightly)로 업데이트하는 것을 고려할 수 있습니다.
버그를 발견했다면 리포트해주세요!
1.72.0 stable엔 무엇이 있나요?
Rust reports potentially useful cfg-disabled items in errors
Rust는 이제 오류가 있는 잠재적으로 유용한 cfg-disabled 항목을 보고합니다.
Rust에서는 cfg를 사용해서 코드를 조건부로 활성화할 수 있습니다. 특정 crate features에만 특정 함수들을 제공하거나 특정 플랫폼에서만 특정 함수를 제공할 수도 있죠.
이전에는 이 방식으로 비활성화된 항목이 컴파일러에서 효과적으로 표시되지 않았습니다.
하지만 이제는 컴파일러가 해당 항목의 이름과 cfg 조건을 기억합니다. 그래서 호출하려고 한 함수를 사용할 수 없다면 report해서 알려줄 수 있습니다.
Compiling my-project v0.1.0 (/tmp/my-project)
error[E0432]: unresolved import rustix::io_uring
--> src/main.rs:1:5
|
1 | use rustix::io_uring;
| ^^^^^^^^^^^^^^^^ no io_uring in the root
|
note: found an item that was configured out
--> /home/username/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustix-0.38.8/src/lib.rs:213:9
|
213 | pub mod io_uring;
| ^^^^^^^^
= note: the item is gated behind the io_uring feature
For more information about this error, try rustc --explain E0432.
error: could not compile my-project (bin "my-project") due to previous error
const eval time 제한이 풀립니다!
이제까지는 주어진 const 평가에서 실행되는 구문의 최대 수를 제한했습니다. const 평가가 컴파일 타임 무한 루프에 빠지거나 컴파일 타임이 너무 오래 걸리는 것을 방지하기 위해서였죠.
하지만 특히 창의적일 뿐인 Rust 코드도 이러한 한계에 도달해서 컴파일러 오류를 생성할 수 있습니다.
게다가 코드가 limit에 도달했는지 여부는 사용자가 호출한 라이브러리에 따라 크게 달라질 수 있습니다.
호출한 라이브러리가 함수 중 하나 내에서 명령문을 split하면 초과로 코드가 컴파일되지 않을 수 있었죠.
이제는 컴파일 타임에 무제한의 const 평가를 수행할 수 있습니다.
피드백 없이 컴파일이 길어지는 것을 방지하기 위해 컴파일러는 컴파일 타임 코드가 한동안 실행되는 동안 항상 메시지를 내보내고, 매번 두 배로 늘어나는 기간 후에 해당 메시지를 반복합니다.
기본적으로 컴파일러는 무한 루프를 포착하기 위해 많은 단계 후에 deny-by-default 린트(const_eval_long_running)를 내보냅니다.
그러나 특히 긴 const 평가를 허가하도록 허용할(const_eval_long_running) 수도 있습니다.
Uplifted lints from Clippy
Clippy의 여러 Lint가 Rustc에 추가되었습니다.
ManuallyDrop은 내부 값을 drop하지 않으므로 std::mem::drop을 호출해도 아무 작업도 수행되지 않습니다.
대신 린트는 먼저 ManuallyDrop::into_inner를 제안하거나 안전하지 않은 ManuallyDrop::drop을 사용하여 destructor를 내부에서 실행할 수 있습니다.
이 린트는 기본적으로 거부(denied)됩니다.
- clippy::invalid_utf8_in_unchecked to invalid_from_utf8_unchecked (deny) and invalid_from_utf8 (warn)
첫 번째로, safety pre-condition을 위반하여 undefined behavior를 초래하는 잘못된 UTF-8 리터럴에 대해서 std::str::from_utf8_unchecked 및 std::str::from_utf8_unchecked_mut을 호출하는지 확인합니다.
이 린트는 디폴트로 거부됩니다.
두 번째는 잘못된 UTF-8 리터럴을 사용하여 std::str::from_utf8 및 std::str::from_utf8_mut에 대한 호출을 하는지를 확인하며, 이는 항상 오류를 반환합니다.
이 린트는 디폴트로 warning입니다.
- clippy::cmp_nan to invalid_nan_comparisons (warn)
이는 비교의 피연산자 중 하나로 f32::NAN 또는 f64::NAN이 들어있는지 확인합니다.
NaN은 어떤 값이나, 심지어 다른 NaN 자체와도 의미 있는 비교를 하지 않으므로, 이러한 비교는 항상 거짓입니다.
이 린트는 디폴트로 warning이며 대신 is_nan() 메서드를 호출하도록 제안합니다.
- clippy::cast_ref_to_mut to invalid_reference_casting (allow)
이는 참조가 사용되지 않더라도, interior mutability를 사용하지 않고 undefined behavior로 &T에서 &mut T로의 캐스팅을 하는지를 확인합니다.
이 린트는 잠재적인 오탐지로 인해 현재 기본적으로 허용(allowed)되지만 구현 개선 후 1.73에서는 기본적으로 거부될 예정입니다.
Stable이 된 API들
impl<T: Send> Sync for mpsc::Sender
impl TryFrom<&OsStr> for &str
String::leak
아래 API들은 이제 const context에서도 stable입니다.
CStr::from_bytes_with_nul
CStr::to_bytes
CStr::to_bytes_with_nul
CStr::to_str
기타 변경점
이외의 모든 변경사항은 각각 Rust, Cargo, Clippy에서 확인하세요.
미래의 Windows 호환성
향후 릴리스에서는 지원되는 최소 Windows 버전을 10으로 늘릴 계획입니다.
컴파일러 MCP 651에서 수용된 제안은 Rust 1.75가 Windows 7, 8 및 8.1을 공식적으로 지원하는 마지막 버전이 될 것이라는 것입니다.
Rust 1.76이 2024년 2월에 릴리즈되면, 그때부터는 Windows 10 이상만 Tier-1 타겟으로 지원됩니다.
이 변경 사항은 호스트 컴파일러와 컴파일 타겟 모두에 적용됩니다.
1.72.0의 컨트리뷰터들에게
1.72.0의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.