Skip to content

Commit

Permalink
Translate 2024-09-05-Rust-1.81.0.md via GitLocalize
Browse files Browse the repository at this point in the history
  • Loading branch information
funkill committed Sep 5, 2024
1 parent 4d97d38 commit 244ebf5
Showing 1 changed file with 125 additions and 0 deletions.
125 changes: 125 additions & 0 deletions ru/announcements/2024-09-05-Rust-1.81.0.md
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

0 comments on commit 244ebf5

Please sign in to comment.