Rust 1.96.0

Опубликован релиз 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 больше не выдаёт lintmissing_doc_code_examplesдля элементов внутриimpl, а в боковой панели документации методы и ассоциированные функции разделяются отдельно. -
Возможные несовместимости. В релизе есть несколько изменений, которые могут проявиться на нетипичном коде: исправлена раскладка некоторых
#[repr(Int)]enum в крайних случаях, запрещены некоторые бесполезные unsize-приведения вPin, WebAssembly-сборки теперь падают при неопределённых символах, случайно стабилизированный атрибут#![reexport_test_harness_main]снова закрыт feature gate«ом, удалён параметр-Csoft-float, а минимальная версия внешнего LLVM повышена до 21. Для AVR изменён типc_doubleнаf32, поскольку на этих целях Cdoubleпо умолчанию является 32-битным.
>>> Источник
