Wydanie Rust 1.91

Opublikowano wydanie języka programowania Rust 1.91, opracowanego przez projekt Mozilla, ale obecnie rozwijanego pod auspicjami niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpiecznej pracy z pamięcią i zapewnia środki do osiągania wysokiego poziomu równoległości w wykonywaniu zadań, jednocześnie omijając wykorzystanie garbage collectora i runtime (który ogranicza się do podstawowej inicjalizacji i wsparcia dla standardowej biblioteki).

Metody zarządzania pamięcią w Rust eliminują błędy związane z manipulowaniem wskaźnikami oraz chronią przed problemami wynikającymi z niskopoziomowej obsługi pamięci, takimi jak dostęp do pamięci po jej zwolnieniu, dereferencjonowanie wskaźników zerowych, wychodzenie poza granice bufora itp. Dla rozprowadzania bibliotek, zapewnienia budowy i zarządzania zależnościami, rozwijany jest menedżer pakietów Cargo. Dla publikacji bibliotek wspierany jest repozytorium crates.io.

Bezpieczne zarządzanie pamięcią w Rust jest zapewnione podczas kompilacji poprzez kontrolę referencji, śledzenie własności obiektów, uwzględnianie czasu życia obiektów (zakresu widoczności) oraz ocenę prawidłowości dostępu do pamięci w czasie wykonywania kodu. Rust oferuje również narzędzia do ochrony przed przepełnieniami liczbowymi, wymaga obowiązkowej inicjalizacji wartości zmiennych przed użyciem, lepiej obsługuje błędy w standardowej bibliotece, stosuje koncepcję niemutowalności (immutable) referencji i zmiennych domyślnie oraz oferuje silne statyczne typowanie w celu minimalizacji błędów logicznych.

Główne nowości:

  • Ulepszono wsparcie dla 64-bitowych systemów ARM z systemem Windows. Docelowa platforma „aarch64-pc-windows-msvc” została przeniesiona z drugiego na pierwszy poziom wsparcia. Zapewniono drugi poziom wsparcia dla architektur aarch64-pc-windows-gnullvm i x86_64-pc-windows-gnullvm. Pierwszy poziom wsparcia oznacza tworzenie binarnych zestawów, przeprowadzanie dokładnych testów i zapewnienie najwyższej gwarancji wsparcia platformy – każda zmiana w kompilatorze jest weryfikowana poprzez wykonanie pełnego zestawu testów. Drugi poziom wsparcia obejmuje tworzenie binarnych zestawów i gwarancję budowy, ale nie zapewnia przejścia zestawu testów. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatyzacji testów, publikacji oficjalnych wersji i weryfikacji możliwości kompilacji kodu.
  • Dodano ostrzeżenie lint „dangling_pointers_from_locals” w celu wykrywania zwracania przez funkcje wiszących wskaźników raw (dangling raw pointer), wskazujących na dane przechowywane w zmiennych lokalnych zdefiniowanych w wywoływanej funkcji. Takie zmienne są usuwane po zakończeniu funkcji, a wskaźniki raw na związane z tymi zmiennymi dane stają się wiszące, tj. wskazują na zwolnioną pamięć. Późniejsze dereferencjonowanie takiego wskaźnika prowadzi do zachowania nieokreślonego. fn f() -> *const u8 { let x = 0; &x // ostrzeżenie: powstanie wiszący wskaźnik, ponieważ zmienna lokalna „x” zostanie usunięta }
  • Dodano ostrzeżenie lint „integer_to_ptr_transmutes”, informujące o konwersji liczb całkowitych na wskaźniki za pomocą funkcji std::mem::transmute.
  • W menedżerze pakietów Cargo ustabilizowano wsparcie dla parametru „build.build-dir”, określającego katalog do przechowywania tymczasowych artefaktów budowy, tworzonych przez cargo i rustc w trakcie budowy.
  • Dla ABI sysv64, win64, efiapi i aapcs stabilizowano wsparcie dla deklaracji funkcji z zmienną liczbą argumentów w stylu C.
  • Stabilizowano wsparcie dla inline-assembly dla architektury LoongArch32.
  • Nowa porcja API została wprowadzona do stabilnej wersji, w tym ustabilizowane metody i implementacje traitów:
    • Path::file_prefix
    • AtomicPtr::fetch_ptr_add
    • AtomicPtr::fetch_ptr_sub
    • AtomicPtr::fetch_byte_add
    • AtomicPtr::fetch_byte_sub
    • AtomicPtr::fetch_or
    • AtomicPtr::fetch_and
    • AtomicPtr::fetch_xor
    • {integer}::strict_add
    • {integer}::strict_sub
    • {integer}::strict_mul
    • {integer}::strict_div
    • {integer}::strict_div_euclid
    • {integer}::strict_rem
    • {integer}::strict_rem_euclid
    • {integer}::strict_neg
    • {integer}::strict_shl
    • {integer}::strict_shr
    • {integer}::strict_pow
    • i{N}::strict_add_unsigned
    • i{N}::strict_sub_unsigned
    • i{N}::strict_abs
    • u{N}::strict_add_signed
    • u{N}::strict_sub_signed
    • PanicHookInfo::payload_as_str
    • core::iter::chain
    • u{N}::checked_signed_diff
    • core::array::repeat
    • PathBuf::add_extension
    • PathBuf::with_added_extension
    • Duration::from_mins
    • Duration::from_hours
    • impl PartialEq<str> for PathBuf
    • impl PartialEq<String> for PathBuf
    • impl PartialEq<str> for Path
    • impl PartialEq<String> for Path
    • impl PartialEq<PathBuf> for String
    • impl PartialEq<Path> for String
    • impl PartialEq<PathBuf> for str
    • impl PartialEq<Path> for str
    • Ipv4Addr::from_octets
    • Ipv6Addr::from_octets
    • Ipv6Addr::from_segments
    • impl<T> Default for Pin<Box<T>> where Box<T>: Default, T: ?Sized
    • impl<T> Default for Pin<Rc<T>> where Rc<T>: Default, T: ?Sized
    • impl<T> Default for Pin<Arc<T>> where Arc<T>: Default, T: ?Sized
    • Cell::as_array_of_cells
    • u{N}::carrying_add
    • u{N}::borrowing_sub
    • u{N}::carrying_mul
    • u{N}::carrying_mul_add
    • BTreeMap::extract_if
    • BTreeSet::extract_if
    • impl Debug for windows::ffi::EncodeWide<‘_>
    • str::ceil_char_boundary
    • str::floor_char_boundary
    • impl Sum for Saturating<u{N}>
    • impl Sum<&Self> for Saturating<u{N}>
    • impl Product for Saturating<u{N}>
    • impl Product<&Self> for Saturating<u{N}>
  • Wskaźnik „const” zastosowany w funkcjach:
    • <[T; N]>::each_ref
    • <[T; N]>::each_mut
    • OsString::new
    • PathBuf::new
    • TypeId::of
    • ptr::with_exposed_provenance
    • ptr::with_exposed_provenance_mut
  • Komputer został zaktualizowany do gałęzi LLVM 21.

Źródło: opennet.ru

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