LINUX.ORG.RU

Rust 1.96.0

 


0

5

Опубликован релиз Rust 1.96.0 — очередной стабильной версии языка программирования Rust. Обновление вышло 28 мая 2026 года; установить его можно стандартной командой rustup update stable. Главными изменениями стали новые типы диапазонов в core::range, стабилизация макросов для проверки соответствия шаблонам, ужесточение поведения WebAssembly-сборок и исправления двух уязвимостей в Cargo.

Основные изменения

  • Новые типы диапазонов core::range::Range*. В стандартной библиотеке стабилизированы новые варианты диапазонов: core::range::Range, RangeFrom, RangeInclusive и связанные с ними итераторы. В отличие от старых типов из core::ops, новые диапазоны не реализуют Iterator напрямую, а преобразуются в итератор через IntoIterator. Благодаря этому такие диапазоны могут быть Copy, что удобно, например, при хранении диапазона как поля структуры. Синтаксис вроде 0..1 пока создаёт старые типы диапазонов, но в будущей редакции языка его планируют перевести на новые типы.

  • Добавлены assert_matches! и debug_assert_matches!. Новые макросы позволяют проверять, что значение соответствует заданному шаблону. По смыслу это похоже на assert!(matches!(...)), но при ошибке выводится Debug-представление значения, что упрощает диагностику. В prelude макросы не добавили, чтобы не конфликтовать с популярными сторонними crate’ами, поэтому их нужно импортировать явно из core или std.

  • Изменено поведение WebAssembly-целей. Rust больше не передаёт линкеру --allow-undefined для WebAssembly-сборок. Теперь неопределённые символы при линковке считаются ошибкой, а не превращаются автоматически в импорты из модуля "env". Это должно раньше выявлять ошибки сборки и неправильные имена символов. Старое поведение при необходимости можно вернуть через RUSTFLAGS=-Clink-arg=--allow-undefined или явно указать импортируемый wasm-модуль через #[link(wasm_import_module = "env")].

  • Cargo получил исправления безопасности. В Rust 1.96.0 закрыты две уязвимости, затрагивающие пользователей сторонних registry. CVE-2026-5223 связана с обработкой symlink внутри tar-архивов crate: вредоносный пакет из стороннего registry мог перезаписать кэш другого пакета из того же registry. Начиная с Rust 1.96.0 Cargo отвергает crate-архивы с symlink. CVE-2026-5222 связана с нормализацией URL sparse registry и в редких условиях могла привести к отправке Cargo-токена на вредоносный registry. Пользователи crates.io, по заявлению команды Rust, этими проблемами не затронуты.

  • Изменения в языке. В релиз вошли несколько точечных исправлений и расширений: разрешена передача expr-метапеременных макросов в cfg, скорректировано приведение never-type в выражениях-кортежах, исправлены редкие случаи неверных подсказок вывода типов для аргументов функций, добавлена поддержка векторных регистров s390x в inline assembly, а также снова разрешено использовать константы типа ManuallyDrop как шаблоны — это исправляет регрессию, появившуюся в Rust 1.94.0.

  • Изменения в компиляторе и платформах. Для Linux-целей на LoongArch включена поддержка link relaxation — оптимизации линковки, позволяющей упростить некоторые переходы и обращения после размещения кода. Для riscv64gc-unknown-fuchsia обновлена базовая конфигурация до профиля RVA22 с поддержкой векторных расширений.

  • Обновления стандартной библиотеки. Добавлена поддержка итерации по диапазонам NonZero-целых чисел. Также исправлена отложенная обработка адресов хоста в SGX через ToSocketAddr, а в документации и внутренних контрактах уточнено определение памяти, «допустимой для чтения/записи»: нулевой указатель исключён из общего определения, а исключения указываются отдельно для конкретных методов.

  • Стабилизированные API. Среди стабилизированных интерфейсов — assert_matches!, debug_assert_matches!, реализации From<T> для AssertUnwindSafe<T>, LazyCell<T, F> и LazyLock<T, F>, а также новые типы и итераторы диапазонов из core::range, включая Range, RangeFrom, RangeToInclusive и их итераторы.

  • Cargo: изменения для зависимостей и документации. Теперь зависимость может одновременно указывать Git-репозиторий и альтернативный registry: локально будет использоваться Git-версия, а при публикации — версия из registry, аналогично поведению с crates.io. Также добавлена поддержка target.'cfg(..)'.rustdocflags в конфигурации Cargo.

  • Rustdoc стал аккуратнее обрабатывать документацию. Заметки о deprecated API теперь рендерятся как обычная документация, без прежней специальной обработки через white-space: pre-wrap. Кроме того, rustdoc больше не выдаёт lint missing_doc_code_examples для элементов внутри impl, а в боковой панели документации методы и ассоциированные функции разделяются отдельно.

  • Возможные несовместимости. В релизе есть несколько изменений, которые могут проявиться на нетипичном коде: исправлена раскладка некоторых #[repr(Int)] enum в крайних случаях, запрещены некоторые бесполезные unsize-приведения в Pin<Foo>, WebAssembly-сборки теперь падают при неопределённых символах, случайно стабилизированный атрибут #![reexport_test_harness_main] снова закрыт feature gate’ом, удалён параметр -Csoft-float, а минимальная версия внешнего LLVM повышена до 21. Для AVR изменён тип c_double на f32, поскольку на этих целях C double по умолчанию является 32-битным.

>>> Источник

★★★★★

Проверено: cetjs2 ()
Ответ на: комментарий от Mischutka

«borrow checking»

Привычка. Да, проверки, конечно же.

LightDiver ★★★★★
()
Ответ на: комментарий от DrRulez

так можно про любую ОС сказать

Можно, а зачем? :)

Нет, серьёзно - он-то говорит про конкретную ОС, ту самую в честь которой назван данный сайт. И не просто говорит - он один из ведущих мейнтейнеров и разработчиков этой самой ОС. То есть нет никакого смысла ждать «к чему это все приведет» - просто потому что он это явно проговаривает. А поскольку он как раз один из тех кто решает к чему что идёт - не вижу повода ему не доверять.

zabbal ★★★★☆
()
Ответ на: комментарий от Camel

Cargo.toml

Т.е. просто скомпилить несколько файлов без файло-проекта никак?

drfaust ★★★★★
()
Ответ на: комментарий от Lusine

Не драматизируй, тебе в том треде даже примеры привели, когда указатель содержит не только адрес. Адрес он содержит, конечно, куда без него. Или хотя бы часть адреса. Но в том-то и дело, что это может быть только часть адреса или не только адрес, но и разная служебная информация. Есть же разные архитектуры.

Не понимаю, зачем держаться здесь за свое. Можно же учиться, постигать новое. Обидеть тебя никто не хотел. Нет вот ты начинаешь в бутылку лезть. Я тоже не все знаю. А даже если знаю, не все в состоянии правильно объяснить. Мир многогранен и тем интересен. Будь открыт новому и у тебя все получится.

hibou ★★★★★
()
Ответ на: комментарий от hibou

В документации раста есть описание того, что указатель не является ни просто числом, ни числом + тип на которое он указывает. Указатель это нечто большее, зависящее от конкретной архитектуры.

https://doc.rust-lang.org/std/ptr/index.html#provenance

И там есть четкое упоминание, что указатель без происхождения (provenance) нельзя преобразовывать в ссылку или как-то работать с памятью, на которое он указывает. Если при помощи кастов сохранить указатель в целое число, а потом восстановить его из этого числа, то указатель потеряет происхождение и пользоваться им будет нельзя в общем случае.

Т.е. такой код является UB, хотя и на x86 он работает

fn main() {
    let val: i32 = 15;
    let ptr_val = &val as *const i32;
    let num_ptr = ptr_val as usize;

    let restored_ptr = num_ptr as *const i32; // !!!!!!
    let restored_ref = unsafe { &*restored_ptr };

    print!("{}", *restored_ref); // 15
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=5d8af6fb4f94e2afe1ee058421c63e23

Если этот код запустить на playground то он соберется и отработает без ошибок. Но если запустить его при помощи Miri (на playground: Tools -> Miri), то будет четкое предупреждение

warning: integer-to-pointer cast
 --> src/main.rs:6:24
  |
6 |     let restored_ptr = num_ptr as *const i32; // !!!!!!
  |                        ^^^^^^^^^^^^^^^^^^^^^ integer-to-pointer cast
  |
  = help: this program is using integer-to-pointer casts or (equivalently) `ptr::with_exposed_provenance`, which means that Miri might miss pointer bugs in this program
  = help: see https://doc.rust-lang.org/nightly/std/ptr/fn.with_exposed_provenance.html for more details on that operation
  = help: to ensure that Miri does not miss bugs in your program, use Strict Provenance APIs (https://doc.rust-lang.org/nightly/std/ptr/index.html#strict-provenance, https://crates.io/crates/sptr) instead
  = help: you can then set `MIRIFLAGS=-Zmiri-strict-provenance` to ensure you are not relying on `with_exposed_provenance` semantics
  = help: alternatively, `MIRIFLAGS=-Zmiri-permissive-provenance` disables this warning
Darfin
()
Ответ на: комментарий от LightDiver

как раз таки у фонНеймана: теорема о построении надёжной из ненадёжных.

qulinxao3 ★☆
()
Ответ на: комментарий от unC0Rr

С99 хватит всем. Если не будет хватать, создайте другой язык с нужными возможностями. Но не так, что каждые 6 недель новый стандарт выходит.

LongLiveUbuntu ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.