-
Notifications
You must be signed in to change notification settings - Fork 8
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 * Translate 2024-09-05-Rust-1.81.0.md via GitLocalize * Update 2024-09-05-Rust-1.81.0.md * Update 2024-09-05-Rust-1.81.0.md ё-потеряшка) --------- Co-authored-by: funkill <[email protected]> Co-authored-by: TelegaOvoshey <[email protected]>
- Loading branch information
1 parent
4d97d38
commit 2dc49f5
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.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 |