Byl zveřejněn release programovacího jazyka Rust 1.86, který byl původně vyvinut projektem Mozilla, ale nyní je rozvíjen pod záštitou nezávislé neziskové organizace Rust Foundation. Jazyk se zaměřuje na bezpečnou práci s pamětí a poskytuje prostředky pro dosažení vysokého paralelismus provádění úkolů, přičemž se obejde bez použití garbage collectoru a runtime (runtime se omezuje na základní inicializaci a údržbu standardní knihovny).
Metody práce s pamětí v Rustu zbavují vývojáře chyb při manipulaci s ukazateli a chrání před problémy, které vznikají z nízkoúrovňové manipulace s pamětí, jako je přístup k oblasti paměti po jejím uvolnění, dereferencování nulových ukazatelů, přetečení bufferu atd. Pro distribuci knihoven, zajištění sestavení a správu závislostí se vyvíjí balíčkový manažer Cargo. Pro hostování knihoven je k dispozici repozitář crates.io.
Bezpečné manipulace s pamětí jsou v Rustu zajištěny během kompilace prostřednictvím kontroly referencí, sledování vlastnictví objektů, zohlednění doby života objektů (viditelnosti) a hodnocení správnosti přístupu k paměti při vykonávání kódu. Rust také poskytuje prostředky pro ochranu proti přetečení celých čísel, vyžaduje povinnou inicializaci hodnot proměnných před použitím, lépe zpracovává chyby ve standardní knihovně, aplikuje koncept neměnnosti (immutable) referencí a proměnných ve výchozím nastavení a nabízí silnou statickou typizaci pro minimalizaci logických chyb.
Hlavní novinky:
- Byla přidána podpora pro přetypování (upcast) typů na základní supertyp (supertrait), což znamená, že je nyní možné přímé převádění odkazu na objekt typu na odkaz na objekt supertypu bez nutnosti vytváření speciální metody v typu, která by vracela odkaz na supertyp. Podobné operace lze provádět i s jinými druhy chytrých ukazatelů, například „Arc -> Arc“ a „*const dyn Trait -> *const dyn Supertrait“. trait Trait: Supertrait {} trait Supertrait {} fn upcast(x: &dyn Trait) -> &dyn Supertrait { x }
- Do HashMap a řezů (slice) byla přidána metoda get_disjoint_mut() pro simultánní získání několika měnících odkazů na prvky. Dříve borrow checker nedovoloval současné použití odkazů získaných pomocí metody get_mut(). let v = &mut [1, 2, 3]; if let Ok([a, b]) = v.get_disjoint_mut([0, 2]) { *a = 413; *b = 612; } assert_eq!(v, &[413, 2, 612]); if let Ok([a, b]) = v.get_disjoint_mut([0..1, 1..3]) { a[0] = 8; b[0] = 88; b[1] = 888; } assert_eq!(v, &[8, 88, 888]);
- Bylo povoleno označovat safe funkce pomocí atributu „#[target_feature]“, který udává, že funkce využívá dané schopnosti CPU. Safe funkci označenou atributem „#[target_feature]“ může jiná safe funkce bezpečně zavolat pouze za podmínky, že je také označena „#[target_feature]“ (jinak je nutné takové funkce volat v unsafe bloku). Přitom je nelze předávat do funkcí, které přijímají obecné (generic) parametry omezené typy Fn*. Dříve mohl být atribut „#[target_feature]“ aplikován pouze na funkce označené jako „unsafe“. #[target_feature(enable = "avx2")] fn requires_avx2() { // … } #[target_feature(enable = "avx2")] fn safe_callsite() { requires_avx2(); } fn unsafe_callsite() { if is_x86_feature_detected!("avx2") { unsafe { requires_avx2() }; } }
- V kompilátoru Rust je zahrnuta náhrada za ladicí kontroly (debug-assert), která zajišťuje, že ukazatel neobsahuje hodnotu NULL při čtení a zápisu nenulových velikostí, a také při opětovném půjčení (reborrow) ukazatele jako odkazu. Například při zapnutí ladicích kontrol bude následující kód nyní vyvolávat stav „panic“: let _x = *std::ptr::null::(); let _x = &*std::ptr::null::();
- Ve výchozím nastavení je povolena lint kontrola „missing_abi“, která vede k výstupu varování, pokud není po klíčovém slovu extern uveden ABI. Dříve bylo implicitní, že při absenci ABI po extern se používá ABI „C“. Nyní se doporučuje explicitně uvádět ABI „C“, například ‘extern „C“ {}’ a ‘extern „C“ fn’
- Nová sada API byla převedena do stabilního stavu, včetně stabilizovaných metod a implementací typů:
- {float}::next_down
- {float}::next_up
- ::get_disjoint_mut
- ::get_disjoint_unchecked_mut
- slice::GetDisjointMutError
- HashMap::get_disjoint_mut
- HashMap::get_disjoint_unchecked_mut
- NonZero::count_ones
- Vec::pop_if
- sync::Once::wait
- sync::Once::wait_force
- sync::OnceLock::wait
- Příznak „const“ byl použit ve funkcích:
- hint::black_box
- io::Cursor::get_mut
- io::Cursor::set_position
- str::is_char_boundary
- str::split_at
- str::split_at_checked
- str::split_at_mut
- str::split_at_mut_checked
- Byla implementována třetí úroveň podpory pro platformy {aarch64-unknown,x86_64-pc}-nto-qnx710_iosock, {aarch64-unknown,x86_64-pc}-nto-qnx800, {x86_64,i686}-win7-windows-gnu, amdgcn-amd-amdhsa, x86_64-pc-cygwin, {mips,mipsel}-mti-none-elf, m68k-unknown-none-elf, armv7a-nuttx-{eabi,eabihf}, aarch64-unknown-nuttx a thumbv7a-nuttx-{eabi,eabihf}. Třetí úroveň znamená základní podporu, ale bez automatizovaného testování, publikování oficiálních sestavení a ověřování možností sestavování kódu.
- Bylo přidáno varování o ukončení druhé úrovně podpory pro cílovou platformu i586-pc-windows-msvc v následujícím vydání (1.87). Doporučuje se použít platformu i686-pc-windows-msvc, která podporuje instrukce SSE2. Platforma i586-pc-windows-msvc ztratila význam, protože pro Windows 10 je nezbytná podpora SSE2, zatímco starší verze Windows v Rustu již nejsou podporovány.
Dále je třeba poznamenat, že společnost Ferrocene předala komunitě specifikaci pro jazyk Rust (FLS — Ferrocene Language Specification), která byla vytvořena během vývoje vlastního kompilátoru Rust pro kriticky důležité systémy a pravidelně synchronizována s aktuálním stavem hlavního kompilátoru Rust. Specifikace FLS obsahuje strukturovaného a podrobného průvodce syntaxí, sémantikou a chováním Rustu, který je vhodný pro verifikaci, hodnocení kompatibility a standardizaci.
Předané materiály budou použity k vytvoření referenční specifikace pro jazyk Rust, kterou lze využít při vývoji alternativních kompilátorů a pro testování kompilátorů v oblastech, které jsou kritické z hlediska bezpečnosti.
Zdroj: opennet.ru
