Rust 1.96.0

Opublikowano wydanie Rust 1.96.0 — kolejnej stabilnej wersji języka programowania Rust. Aktualizacja została wydana 28 maja 2026 roku; można ją zainstalować standardowym poleceniem rustup update stable. Główne zmiany to nowe typy zakresów w core::range, stabilizacja makr do sprawdzania zgodności z wzorcami, zacieśnienie zachowania kompilacji WebAssembly oraz poprawki dwóch luk w Cargo.

Główne zmiany

  • Nowe typy zakresów core::range::Range*.
    W standardowej bibliotece stabilizowane są nowe warianty zakresów: core::range::Range, RangeFrom, RangeInclusive oraz związane z nimi iteratory. W przeciwieństwie do starych typów z core::ops, nowe zakresy nie implementują Iterator bezpośrednio, lecz przekształcane są w iterator przez IntoIterator. Dzięki temu takie zakresy mogą być Copy, co jest wygodne, na przykład w przypadku przechowywania zakresu jako pola struktury. Składnia jak 0..1 nadal tworzy stare typy zakresów, ale w przyszłej edycji języka planuje się ją przekształcić na nowe typy.

  • Dodano assert_matches! i debug_assert_matches!.
    Nowe makra pozwalają sprawdzać, czy wartość odpowiada danym wzorcem. W sensie przypomina to assert!(matches!(…)), ale w przypadku błędu wyświetla się reprezentacja Debug wartości, co ułatwia diagnostykę. W prelude nie dodano makr, aby nie kolidowały z popularnymi zewnętrznymi crate'ami, dlatego muszą być one importowane jawnie z core lub std.

  • Zmieniło się zachowanie celów WebAssembly.
    Rust nie przekazuje już linkerowi —allow-undefined dla kompilacji WebAssembly. Teraz nieokreślone symbole podczas linkowania są traktowane jako błąd, a nie są automatycznie przekształcane w importy z modułu "env". Powinno to wcześniej wykrywać błędy kompilacji i nieprawidłowe nazwy symboli. Stare zachowanie można przywrócić przez RUSTFLAGS=-Clink-arg=—allow-undefined lub jawnie wskazać importowany moduł wasm przez #[link(wasm_import_module = "env")].

  • Cargo otrzymało poprawki bezpieczeństwa.
    W Rust 1.96.0 zamknięto dwie luki, które dotyczyły użytkowników zewnętrznych rejestrów. CVE-2026-5223 jest związana z obsługą symlink w tar-archiwach crate: złośliwy pakiet z zewnętrznego rejestru mógł nadpisać pamięć podręczną innego pakietu z tego samego rejestru. Od Rust 1.96.0 Cargo odrzuca archiwa crate z symlink. CVE-2026-5222 jest związana z normalizacją URL sparse registry i w rzadkich warunkach mogła prowadzić do wysłania tokena Cargo do złośliwego rejestru. Użytkownicy crates.io, według zespołu Rust, nie są dotknięci tymi problemami.

  • Zmiany w języku.
    Do wydania trafiły Kilka punktowych poprawek i rozszerzeń: zezwolono na przekazywanie zmiennych makrosów expr w cfg, skorygowano konwersję never-type w wyrażeniach krotkowych, poprawiono rzadkie przypadki nieprawidłowych wskazówek dotyczących wyjściowych typów dla argumentów funkcji, dodano wsparcie dla wektorowych rejestrów s390x w inline assembly, a także ponownie zezwolono na używanie stałych typu ManuallyDrop jako szablonów — to naprawia regresję, która pojawiła się w Rust 1.94.0.

  • Zmiany w kompilatorze i platformach.
    Dla celów Linux na LoongArch dodano wsparcie dla link relaxation — optymalizacji łączenia, która umożliwia uproszczenie niektórych przejść i odwołań po umiejscowieniu kodu. Dla riscv64gc-unknown-fuchsia zaktualizowano podstawową konfigurację do profilu RVA22 z wsparciem dla rozszerzeń wektorowych.

  • Aktualizacje standardowej biblioteki.
    Dodano wsparcie dla iteracji po zakresach liczb całkowitych NonZero. Poprawiono również opóźnione przetwarzanie adresów hosta w SGX za pośrednictwem ToSocketAddr, a w dokumentacji i wewnętrznych kontraktach doprecyzowano definicję pamięci "dozwolonej do odczytu/zapisu": wskaźnik zerowy został wykluczony z ogólnej definicji, a wyjątki określają osobno dla konkretnych metod.

  • Stabilizowane API.
    Wśród stabilizowanych interfejsów znajdują się assert_matches!, debug_assert_matches!, implementacje From dla AssertUnwindSafe, LazyCell i LazyLock, a także nowe typy i iteratory zakresów z core::range, w tym Range, RangeFrom, RangeToInclusive i ich iteratory.

  • Cargo: zmiany dotyczące zależności i dokumentacji.
    Teraz zależność może jednocześnie wskazywać repozytorium Git i alternatywny rejestr: lokalnie będzie używana wersja Git, a w przypadku publikacji — wersja z rejestru, podobnie jak w przypadku crates.io. Dodano również wsparcie dla target.’cfg(..)’.rustdocflags w konfiguracji Cargo.

  • Rustdoc zaczął lepiej obsługiwać dokumentację.
    Notatki o deprecated API są teraz renderowane jak zwykła dokumentacja, bez wcześniejszego specjalnego przetwarzania przez white-space: pre-wrap. Ponadto, rustdoc już nie wydaje lint missing_doc_code_examples dla elementów wewnątrz impl, a w bocznej części dokumentacji metody i powiązane funkcje są oddzielane osobno.

  • Możliwe niekompatybilności.
    W wydaniu wprowadzono kilka zmian, które mogą ujawnić się w nietypowym kodzie: naprawiono rozkład niektórych #[repr(Int)] enum w skrajnych przypadkach, zablokowano pewne niepotrzebne przekształcenia unsize w Pin, kompilacje WebAssembly teraz kończą się błędem przy nieokreślonych symbolach, przypadkowo ustabilizowany atrybut #![reexport_test_harness_main] ponownie został zamknięty przez bramkę funkcji, usunięto parametr -Csoft-float, a minimalna wersja zewnętrznego LLVM została podwyższona do 21. Dla AVR zmieniono typ c_double na f32, ponieważ w tych celach domyślnie C double ma 32 bity.

Źródło: linux.org.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster