-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Translate 2024-09-05-Rust-1.81.0.md via GitLocalize
- Loading branch information
Showing
1 changed file
with
125 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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.71 они могут быть проинформированы непосредственно в сообщении компилятора: | ||
|
||
```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, теперь также на 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 |