Публикувано е издание 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, не са засегнати от тези проблеми.

  • Промени в езика.
    В релизa влязоха Няколко специфични корекции и разширения: разрешена предаването на 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 за AssertUnwindSafe, LazyCell и LazyLock, като също нови типове и итератори от core::range, включително Range, RangeFrom, RangeToInclusive и техните итератори.

  • Cargo: промени за зависимости и документация.
    Сега зависимост може едновременно да посочва Git-репозитория и алтернативен регистър: локално ще се използва версията от Git, а при публикуване — версия от регистъра, подобно на поведението с 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, WebAssembly сборките сега падат при неопределени символи, случайно стабилизираната атрибуция #![reexport_test_harness_main] отново е затворена с feature gate, премахнат е параметърът -Csoft-float, а минималната версия на външния LLVM е повишена до 21. За AVR е променен типът c_double на f32, тъй като на тези цели C double по подразбиране е 32-битов.

Източник: linux.org.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster