Rust 1.96.0

good-penguin.png

Опубликован релиз 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 для AssertUnwindSafe, LazyCell и LazyLock, а также новые типы и итераторы диапазонов из 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, WebAssembly-сборки теперь падают при неопределённых символах, случайно стабилизированный атрибут #![reexport_test_harness_main] снова закрыт feature gate«ом, удалён параметр -Csoft-float, а минимальная версия внешнего LLVM повышена до 21. Для AVR изменён тип c_double на f32, поскольку на этих целях C double по умолчанию является 32-битным.

>>> Источник

©  Linux.org.ru