Rust 1.72.0: потенциально полезные отключенные элементы, неограниченные константные вычисления

Kate

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


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


rustup update stable

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


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

Что стабилизировано в 1.72.0​


Rust сообщает в ошибках о потенциально полезных элементах, отключенных при помощи cfg​


Вы можете включить Rust-код, используя cfg — например, для предоставления некоторых функций только с определёнными возможностями крейтов или только на определённых платформах. Ранее отключенные таким образом элементы были бы фактически невидимы для компилятора. Однако теперь компилятор запоминает названия и cfg-условия этих элементов, поэтому может, например, сообщать о функциях, которые вы пытались вызвать, но которые оказались недоступны, потому что были отключены в крейте.


Compiling my-project v0.1.0 (/tmp/my-project)
error[E0432]: unresolved import `rustix::io_uring`
--> src/main.rs:1:5
|
1 | use rustix::io_uring;
| ^^^^^^^^^^^^^^^^ no `io_uring` in the root
|
note: found an item that was configured out
--> /home/username/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustix-0.38.8/src/lib.rs:213:9
|
213 | pub mod io_uring;
| ^^^^^^^^
= note: the item is gated behind the `io_uring` feature

For more information about this error, try `rustc --explain E0432`.
error: could not compile `my-project` (bin "my-project") due to previous error

Константные вычисления теперь неограниченны​


Чтобы защитить пользовательский константный код от попадания в вечный цикл или любого другого бесконечного события во время компиляции, Rust ранее ограничивал максимальное количество инструкций, выполняемых как часть любого константного вычисления. Однако особенно креативный код Rust может выйти за эти пределы и привести к ошибке компилятора. Хуже того — то, достигает ли код предела, может сильно варьироваться в зависимости от библиотек, вызываемых пользователем. Если библиотека, которую вы вызвали, разделит инструкцию на две в рамках одной из своих функций, ваш код может не скомпилироваться вовсе.


Теперь вы можете выполнять неограниченное количество константных вычислений во время компиляции. Чтобы избежать длительной компиляции без обратной связи, компилятор всегда будет выдавать сообщение после того, как ваш код будет запущен, и повторять это сообщение через некоторый промежуток времени, который каждый раз будет удваиваться. По умолчанию компилятор также вызывает проверку deny-by-default (const_eval_long_running) после большого количества шагов, чтобы перехватить бесконечные циклы, но вы можете разрешить особенно длинное константное вычисление при помощи allow(const_eval_long_running).


Проверки Clippy, перешедшие в компилятор​


Некоторые проверки перешли из Clippy в rustc:


  • clippy::undropped_manually_drops в undropped_manually_drops (deny)
    • ManuallyDrop не удаляет внутреннее значение, так что вызов std::mem::drop ничего не даст. Вместо этого проверка предложит сначала вызвать ManuallyDrop::into_inner или использовать ManuallyDrop::drop для вызова деструктора. По умолчанию эта запрещающая проверка включена.
  • clippy::invalid_utf8_in_unchecked в invalid_from_utf8_unchecked (deny) и invalid_from_utf8 (warn)
    • Первая проверка проверяет использование std::str::from_utf8_unchecked и std::str::from_utf8_unchecked_mut с невалидными UTF-8 литералами, что нарушает их предварительные условия безопасности, приводя к неопределённому поведению. По умолчанию этот параметр запрещён.
    • Вторая проверка используется для вызовов std::str::from_utf8 и std::str::from_utf8_mut с невалидными UTF-8 литералами, которые всегда будут возвращать ошибку. По умолчанию это предупреждение.
  • clippy::cmp_nan в invalid_nan_comparisons (warn)
    • Эта проверка для сравнений, где в качестве одного операнда стоит f32::NAN или f64::NAN. NaN ни с чем осмысленно не сравнивается — даже с самим собой, — поэтому эти сравнения всегда ложны. Эта проверка по умолчанию является предупреждением и предлагает использовать метод is_nan().
  • clippy::cast_ref_to_mut в invalid_reference_casting (allow)
    • Здесь проверяется преобразование &T в &mut T без использования внутренней изменяемости, что является неопределённым поведением, даже если ссылка не используется. Сейчас по умолчанию эта проверка разрешающая, так как могут быть ложные срабатывания, но после улучшений в 1.73 она станет ошибкой.

Стабилизированные API​



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



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


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


Изменения минимально поддерживаемой версии Windows​


В будущем выпуске мы планируем поднять минимально поддерживаемую версию Windows до 10. Принятое в компиляторе предложение MCP 651 заключается в том, что Rust 1.75 будет последней версией, официально поддерживающей Windows 7, 8, и 8.1. Когда в феврале 2024 года выйдет Rust 1.76, он будет поддерживать только Windows 10 и более поздние версии как целевые платформы первого уровня поддержки.

 
Сверху