diff --git a/ru/announcements/2024-09-05-Rust-1.81.0.md b/ru/announcements/2024-09-05-Rust-1.81.0.md new file mode 100644 index 0000000..b1dc356 --- /dev/null +++ b/ru/announcements/2024-09-05-Rust-1.81.0.md @@ -0,0 +1,125 @@ +--- +layout: post +title: 'Rust 1.81.0: Error, новая реализация сортировки, #[expect(lint)]' +author: The Rust Release Team +release: 'true' +--- + +Команда Rust рада сообщить о новой версии языка — 1.81.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение. + +Если у вас есть предыдущая версия Rust, установленная через `rustup`, то для обновления до версии 1.81.0 вам достаточно выполнить команду: + +```console +$ rustup update stable +``` + +Если у вас ещё не установлен `rustup`, вы можете установить его с [соответствующей страницы](https://www.rust-lang.org/install.html) нашего веб-сайта, а также посмотреть [подробные примечания к выпуску](https://doc.rust-lang.org/nightly/releases.html#version-1810-2024-09-05) на GitHub. + +Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (`rustup default beta`) или nightly (`rustup default nightly`). Пожалуйста, [сообщайте](https://github.com/rust-lang/rust/issues/new/choose) обо всех встреченных вами ошибках. + +## Что стабилизировано в 1.81.0 + +### `core::error::Error` + +В 1.81 стабилизирован трейт `Error` из `core`, что позволяет использовать его в `#![no_std]` библиотеках. Это даст возможность большей части экосистемы Rust использовать один и тот же трейт `Error` независимо от того, для какой среды была предназначена библиотека. + +### Новая реализация сортировки + +В стандартной библиотеке для стабильной и нестабильной сортировки реализован обновлённый алгоритм. Время его компиляции было уменьшено, а производительность во время выполнения заметно возросла. + +Кроме того, оба новых алгоритма сортировки пытаются определить неправильную реализацию `Ord`, которая не позволяет получить правильно отсортированный результат. Теперь в таких случаях сортировка будет паниковать, а не возвращать отсортированные случайным образом данные. Пользователи, сталкивающиеся с таким поведением, должны будут проверить свои реализации сортировки, чтобы удостовериться, что те соответствует требованиям, описанным в [PartialOrd] и [Ord]. + +### `#[expect(lint)]` + +В 1.81 стабилизирован новый уровень проверок — `expect`. Он позволяет явно указать, что определённая проверка *должна* возникнуть — или появится предупреждение. Его предлагается использовать, когда нужно временно заглушить проверку из-за ошибки реализации или во время рефакторинга, когда проверка не требуется. + +К примеру, если вы приводите кодовую базу в соответствие с новыми ограничениями через Clippy, таким как [`undocumented_unsafe_blocks`](https://rust-lang.github.io/rust-clippy/stable/index.html#/undocumented_unsafe_blocks), вы можете использовать `#[expect(clippy::undocumented_unsafe_blocks)]`, а когда все `unsafe`-блоки будут задокументированы, сможете включить запрещающую проверку обратно. + +Clippy также имеет две проверки для принудительного использования этой фичи и облегчения миграции существующих атрибутов: + +- [`clippy::allow_attributes`](https://rust-lang.github.io/rust-clippy/master/index.html#/allow_attributes) — чтобы ограничить разрешающие атрибуты в пользу `#[expect]` или для миграции `#[allow]` в `#[expect]` +- [`clippy::allow_attributes_without_reason`](https://rust-lang.github.io/rust-clippy/master/index.html#/allow_attributes_without_reason) — чтобы потребовать указать причину для атрибута `#[allow]` + +### Причины проверки + +Изменение уровня проверок часто выполняется по конкретной причине. Например, если код выполняется в среде без поддержки чисел с плавающей точкой, вы можете использовать Clippy для корректировки такого использования с помощью отказа `#![deny(clippy::float_arithmetic)]`. Однако если новый разработчик проекта увидит предупреждение от этой проверки, ему нужно будет найти комментарий, объясняющий, почему этот отказ был добавлен. С Rust 1.81 вы сможете оставлять необходимую информацию непосредственно в сообщении компилятора: + +```text +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")] + | ^^^^^^^^^^^^^^^^^^^^^^^^ +``` + +### Стабилизированные API + +- [`core::error`](https://doc.rust-lang.org/stable/core/error/index.html) +- [`hint::assert_unchecked`](https://doc.rust-lang.org/stable/core/hint/fn.assert_unchecked.html) +- [`fs::exists`](https://doc.rust-lang.org/stable/std/fs/fn.exists.html) +- [`AtomicBool::fetch_not`](https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicBool.html#method.fetch_not) +- [`Duration::abs_diff`](https://doc.rust-lang.org/stable/core/time/struct.Duration.html#method.abs_diff) +- [`IoSlice::advance`](https://doc.rust-lang.org/stable/std/io/struct.IoSlice.html#method.advance) +- [`IoSlice::advance_slices`](https://doc.rust-lang.org/stable/std/io/struct.IoSlice.html#method.advance_slices) +- [`IoSliceMut::advance`](https://doc.rust-lang.org/stable/std/io/struct.IoSliceMut.html#method.advance) +- [`IoSliceMut::advance_slices`](https://doc.rust-lang.org/stable/std/io/struct.IoSliceMut.html#method.advance_slices) +- [`PanicHookInfo`](https://doc.rust-lang.org/stable/std/panic/struct.PanicHookInfo.html) +- [`PanicInfo::message`](https://doc.rust-lang.org/stable/core/panic/struct.PanicInfo.html#method.message) +- [`PanicMessage`](https://doc.rust-lang.org/stable/core/panic/struct.PanicMessage.html) + +Следующие API теперь можно использовать в контексте `const`: + +- [`char::from_u32_unchecked`](https://doc.rust-lang.org/stable/core/char/fn.from_u32_unchecked.html) (функция) +- [`char::from_u32_unchecked`](https://doc.rust-lang.org/stable/core/primitive.char.html#method.from_u32_unchecked) (метод) +- [`CStr::count_bytes`](https://doc.rust-lang.org/stable/core/ffi/c_str/struct.CStr.html#method.count_bytes) +- [`CStr::from_ptr`](https://doc.rust-lang.org/stable/core/ffi/c_str/struct.CStr.html#method.from_ptr) + +### Замечания о совместимости + +#### Разделение перехватчика паники и аргументов её обработчика + +Мы переименовали [`std::panic::PanicInfo`] в [`std::panic::PanicHookInfo`]. Старое имя продолжает работать в качестве алиаса, но будет приводить к предупреждениям об устаревании начиная с Rust 1.82.0. + +`core::panic::PanicInfo` осталась неизменным, однако теперь это *другой тип*. + +Причиной такого разделения служит то, что эти типы имеют различные роли: `std::panic::PanicHookInfo` — аргумент [для перехватчика паники](https://doc.rust-lang.org/stable/std/panic/fn.set_hook.html) в контексте `std` (где паника может содержать какую-либо полезную нагрузку), в то время как `core::panic::PanicInfo` — аргумент для [`#[panic_handler]`](https://doc.rust-lang.org/nomicon/panic-handler.html) в `#![no_std]` (где паника всегда содержит отформатированное *сообщение*). Разделение этих типов позволяет нам добавить в них более удобные методы, такие как [`std::panic::PanicHookInfo::payload_as_str()`]() и [`core::panic::PanicInfo::message()`](https://doc.rust-lang.org/stable/core/panic/struct.PanicInfo.html#method.message). + +#### Прерывание при необработанной панике в `extern "C"` функциях + +Это завершает переход, начатый в [1.71](https://blog.rust-lang.org/2023/07/13/Rust-1.71.0.html#c-unwind-abi), где был добавлен отдельный `C-unwind` (вместе с прочими вариантами `-unwind`) ABI, предназначенный для раскрутки между границами ABI. В 1.81 нераскручивающие ABI (например `"C"`) будут прерывать выполнение при необработанной раскрутке стека. Такое поведение закрывает долгоживущую проблему надёжности. + +Программы, использующие раскрутку стека, должны перейти на использование вариантов ABI с суффиксом {code 0}-unwind{/code 0}. + +#### Изменение имени таргета WASI 0.1 + +Использование таргета `wasm32-wasi` (который целится в WASI 0.1) теперь вызывает предупреждение компилятора, призывающее пользователям использовать имя `wasm32-wasip1`. Оба таргета одинаковы, переименован только `wasm32-wasi`. Это [изменение на WASI](https://blog.rust-lang.org/2024/04/09/updates-to-rusts-wasi-targets.html) позволит удалить `wasm32-wasi` в январе 2025 года. + +Таргет `wasm32-wasip2`, который целится в WASI 0.2, теперь также на втором уровне поддержки. Смотрите [анонс](https://blog.rust-lang.org/2024/09/05/wasip2-tier-2.html) для подробной информации. + +#### Исправление CVE-2024-43402 + +`std::process::Command` теперь корректно экранирует аргументы при вызове bat-файлов в Windows при наличии завершающих пробелов или точек (которые игнорируются и удаляются самой Windows). + +Больше деталей можно получить в предыдущем [анонсе этого изменения](https://blog.rust-lang.org/2024/09/04/cve-2024-43402.html). + +### Прочие изменения + +Проверьте всё, что изменилось в [Rust](https://github.com/rust-lang/rust/releases/tag/1.81.0), [Cargo](https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-181-2024-09-05) и [Clippy](https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-181). + +## Кто работал над 1.81.0 + +Многие люди собрались вместе, чтобы создать Rust 1.81.0. Без вас мы бы не справились. [Спасибо!](https://thanks.rust-lang.org/rust/1.81.0/) + + +[PartialOrd]: https://doc.rust-lang.org/nightly/std/cmp/trait.PartialOrd.html +[Ord]: https://doc.rust-lang.org/nightly/std/cmp/trait.Ord.html +[`std::panic::PanicInfo`]: https://doc.rust-lang.org/stable/std/panic/type.PanicInfo.html +[`std::panic::PanicHookInfo`]: https://doc.rust-lang.org/stable/std/panic/type.PanicHookInfo.html