[Перевод] Rust 1.81.0: Error, новая реализация сортировки, #[expect(lint)]

d76cf020b2577d504060b4e44513642b

Команда Rust рада сообщить о новой версии языка — 1.81.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.

Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.81.0 вам достаточно выполнить команду:

$ rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.

Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (rustup default beta) или nightly (rustup default nightly). Пожалуйста, сообщайте обо всех встреченных вами ошибках.


Что стабилизировано в 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, вы можете использовать #[expect(clippy::undocumented_unsafe_blocks)], а когда все unsafe-блоки будут задокументированы — включить запрещающую проверку обратно.

Clippy также имеет две проверки для принудительного использования этой фичи и облегчения миграции существующих атрибутов:


  • clippy::allow_attributes — чтобы ограничить разрешающие атрибуты в пользу #[expect] или для миграции #[allow] в #[expect]
  • clippy::allow_attributes_without_reason — чтобы потребовать указать причину для атрибута #[allow]


Причины проверки

Изменение уровня проверок часто выполняется по конкретной причине. Например, если код выполняется в среде без поддержки чисел с плавающей точкой, вы можете использовать Clippy для корректировки такого использования с помощью отказа #![deny(clippy::float_arithmetic)]. Однако если новый разработчик проекта увидит предупреждение от этой проверки, ему нужно будет найти комментарий, объясняющий, почему этот отказ был добавлен. С Rust 1.81 вы сможете оставлять необходимую информацию непосредственно в сообщении компилятора:

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

Следующие API теперь можно использовать в контексте const:


Замечания о совместимости


Разделение перехватчика паники и аргументов её обработчика

Мы переименовали std::panic::PanicInfo в std::panic::PanicHookInfo. Старое имя продолжает работать в качестве алиаса, но будет приводить к предупреждениям об устаревании начиная с Rust 1.82.0.

core::panic::PanicInfo осталась неизменным, однако теперь это другой тип.

Причиной такого разделения служит то, что эти типы имеют различные роли: std::panic::PanicHookInfo — аргумент для перехватчика паники в контексте std (где паника может содержать какую-либо полезную нагрузку), в то время как core::panic::PanicInfo — аргумент для #[panic_handler] в #![no_std] (где паника всегда содержит отформатированное сообщение). Разделение этих типов позволяет нам добавить в них более удобные методы, такие как [std::panic::PanicHookInfo::payload_as_str()]() и core::panic::PanicInfo::message().


Прерывание при необработанной панике в extern "C" функциях

Это завершает переход, начатый в 1.71, где был добавлен отдельный C-unwind (вместе с прочими вариантами -unwind) ABI, предназначенный для раскрутки между границами ABI. В 1.81 нераскручивающие ABI (например "C") будут прерывать выполнение при необработанной раскрутке стека. Такое поведение закрывает долгоживущую проблему надёжности.

Программы, использующие раскрутку стека, должны перейти на использование вариантов ABI с суффиксом -unwind.


Изменение имени таргета WASI 0.1

Использование таргета wasm32-wasi (который целится в WASI 0.1) теперь вызывает предупреждение компилятора, призывающее пользователям использовать имя wasm32-wasip1. Оба таргета одинаковы, переименован только wasm32-wasi. Это изменение на WASI позволит удалить wasm32-wasi в январе 2025 года.

Таргет wasm32-wasip2, который целится в WASI 0.2, теперь также на втором уровне поддержки. Смотрите анонс для подробной информации.


Исправление CVE-2024–43402

std::process::Command теперь корректно экранирует аргументы при вызове bat-файлов в Windows при наличии завершающих пробелов или точек (которые игнорируются и удаляются самой Windows).

Больше деталей можно получить в предыдущем анонсе этого изменения.


Прочие изменения

Проверьте всё, что изменилось в Rust, Cargo и Clippy.


Кто работал над 1.81.0

Многие люди собрались вместе, чтобы создать Rust 1.81.0. Без вас мы бы не справились. Спасибо!


От переводчиков

С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.

Данную статью совместными усилиями перевели TelegaOvoshey и funkill.

© Habrahabr.ru