Byla zveřejněna verze programovacího jazyka Rust 1.93, jehož projekt byl původně vyvinut Mozilla, ale v současnosti je spravován nezávislou neziskovou organizací Rust Foundation. Jazyk se soustředí na bezpečné používání paměti a poskytuje prostředky k dosažení vysokého paralelismu úloh, přičemž se obejde bez potřeby používání garbage collectoru a runtime (runtime je redukován 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:
- Standardní C knihovna Musl, která je součástí distribuce Rust a používá se při statické kompilaci pro cílové platformy „*-linux-musl“ (aarch64-unknown-linux-musl, x86_64-unknown-linux-musl, powerpc64le-unknown-linux-musl atd.) na systémech bez Musl, byla aktualizována na verzi 1.2.5. Minimálně podporovaná verze Musl při dynamické kompilaci byla rovněž zvýšena na verzi 1.2.5. V dřívějších verzích Rust byla používaná verze Musl 1.2.3, která měla problémy s implementací DNS resolveru. Ve verzi Musl 1.2.4 byla do DNS resolveru přidána možnost odesílání dotazů pomocí TCP v případě selhání dotazu pomocí UDP, což vyřešilo problém s dotazy na velké DNS záznamy a zlepšilo kompatibilitu s rekurzivními DNS servery, které nepodporují pasivní části výsledků v zkrácených UDP odpovědích. Ve verzi Musl 1.2.5 byla v DNS resolveru implementována zpracování odpovědí s dlouhými sekvencemi CNAME a vyřešen problém, kvůli kterému byly některé velké odpovědi odesílané přes TCP vynechávány.
- Standardní knihovna byla přepracována, aby vyřešila problémy s reenterabilitou při používání globálních alokátorů paměti napsaných v Rustu, makra std::thread_local! a funkce std::thread::current, které vedly k nekonečné rekurzi. Aby se vyloučila situace, kdy std::thread_local! a std::thread::current při pokusu o alokaci paměti volaly stejný alokátor, ve kterém byly použity, nyní se v nich přímo používá systémový mechanismus alokace paměti.
- V blokových konstrukcích „asm!“ s assemblerovým kódem je povoleno používat atributy „cfg“, což například umožňuje řídit aktivaci rozšířených sad instrukcí CPU v kontextu jednotlivých výrazů uvnitř asm bloku (dříve mohly být atributy „cfg“ stanovovány pouze pro celý asm blok). asm!( // nebo global_asm! nebo naked_asm! "nop", #[cfg(target_feature = "sse2")] "nop", // … #[cfg(target_feature = "sse2")] a = const 123, // pouze použito na sse2 );
- Nová sada API byla převedena do stabilního stavu, včetně stabilizovaných metod a implementací typů:
- <[MaybeUninit]>::assume_init_drop
- <[MaybeUninit]>::assume_init_ref
- <[MaybeUninit]>::assume_init_mut
- <[MaybeUninit]>::write_copy_of_slice
- <[MaybeUninit]>::write_clone_of_slice
- String::into_raw_parts
- Vec::into_raw_parts
- ::unchecked_neg
- ::unchecked_shl
- ::unchecked_shr
- ::unchecked_shl
- ::unchecked_shr
- ::as_array
- ::as_array_mut
- ::as_array
- ::as_mut_array
- VecDeque::pop_front_if
- VecDeque::pop_back_if
- Duration::from_nanos_u128
- char::MAX_LEN_UTF8
- char::MAX_LEN_UTF16
- Cílová platforma „riscv64a23-unknown-linux-gnu“ byla převedena do druhé úrovně podpory, která zaručuje sestavení, ale nezaručuje úspěch při testování.
- Dále lze zmínit několik projektů souvisejících s Rustem:
- Pro jádro Linux se vyvíjí framework Rex, který umožňuje vytváření doplňků pro jádro Linux v jazyce Rust, které lze použít k rozšíření funkcionality jádra místo eBPF. Rex poskytuje stejné bezpečnostní záruky jako eBPF, ale využívá pro izolaci a zajištění bezpečnosti možnosti jazyka Rust a lehký Runtime. Pro takové programy se nepoužívá verifikátor a programy se kompilují do nativního kódu kompilátorem Rust.
V programech Rex je povoleno používání podmnožiny jazyka Rust, která poskytuje záruky bezpečnosti. V aktuální podobě jsou podporovány 5 typy programů eBPF: kprobe, perf_event, tracepoint, xdp a tc. Je zde možnost volání pomocných funkcí eBPF, interakce se struktury map eBPF, správy zdrojů jádra, zpracování výjimek a používání obalů a abstrakcí nad strukturami jádra.
- Je k dispozici vydání Fjall 3, vestavěného úložiště napsaného v Rustu, které pracuje s daty v formátu klíč-hodnota. Úložiště dat probíhá ve formě logu s využitím LSM-stromu (Log-Structured-Merge), jako v RocksDB, kde jsou změny zapisovány prostřednictvím přidávání dat na konec souboru. Pro přístup k DB je nabízen API ve stylu BTreeMap. Podporují se možnosti jako prostory jmen, přímé a reverzní vyhledávání podle intervalů, vestavěné komprese, serializovatelné transakce, oddělené ukládání klíčů a s nimi spojených velmi velkých hodnot, automatické pozadí údržby DB. Kód je otevřen pod licencí Apache 2.0.
V Rex programech je povoleno používat podmnožinu jazyka Rust, která zaručuje bezpečnost. V současné podobě je podporováno 5 typů eBPF programů: kprobe, perf_event, tracepoint, xdp, a tc. Existuje možnost volání pomocných funkcí eBPF, interakce se mapovými strukturami eBPF, správa zdrojů jádra, zpracování chyb a použití obalů a abstrakcí nad jádrovými strukturami.
- Je dostupné vydání Fjall 3, vestavěného úložiště napsaného v Rustu, které pracuje s daty ve formátu klíč-hodnota. Ukládání dat probíhá ve formě záznamu s využitím LSM-stromu (Log-Structured-Merge), jako u RocksDB, kdy jsou změny zapisovány přidáním dat na konec souboru. Pro přístup k databázi se nabízí API ve stylu BTreeMap. Podporují se funkce jako jmenné prostory, přímé a zpětné vyhledávání podle rozmezí, vestavěné komprese, serializovatelné transakce, oddělené uchovávání klíčů a s nimi spojených velmi velkých hodnot, automatická údržba databáze na pozadí. Kód je otevřen pod licencí Apache 2.0.
- Projekt Tor zveřejnil vydání Arti 1.9.0, implementace nástrojů Tor napsané v jazyce Rust. Jakmile kód Arti dosáhne úrovně, která bude schopna zcela nahradit variantu v jazyce C, vývojáři Tor mají v úmyslu udělit Arti status hlavní implementace Tor a postupně ukončit údržbu verze v jazyce C. V nové verzi byla pokračována implementace funkcionality pro relé a servery adresáře (Directory Authority), byla zlepšena podpora práce s dynamicky přidělovanými porty (proxy.socks_listen = „auto“), byl přidán experimentální API pro správu klíčů pro onion služby.
Zdroj: opennet.ru
