[Перевод] Rust 1.81.0: Error, новая реализация сортировки, #[expect(lint)]
Команда 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.