SlÀppet av programmeringssprÄket Rust 1.93 har publicerats, som ursprungligen skapades av Mozilla men numera utvecklas under beskydd av den oberoende icke-vinstdrivande organisationen Rust Foundation. SprÄket fokuserar pÄ sÀker minneshantering och erbjuder medel för att uppnÄ hög parallellism vid körning av uppgifter, utan att anvÀnda en skrÀpsamlare och runtime (runtime begrÀnsas till grundlÀggande initialisering och underhÄll av standardbiblioteket).
Minneshanteringsmetoderna i Rust skyddar utvecklare frÄn att göra fel vid manipulering av pekare och skyddar mot problem som uppstÄr vid lÄg nivÄ minnesarbete, sÄsom att komma Ät minnesomrÄden efter att de har frigjorts, dereferera nullpekare, buffer overflow, etc. För distribution av bibliotek, byggande och hantering av projektberoenden utvecklas paketförvaltaren Cargo. För lagring av bibliotek stöds ett repository pÄ crates.io.
SÀker minneshantering sÀkerstÀlls i Rust under kompilering genom att kontrollera referenser, spÄra Àgandeskap över objekt, ta hÀnsyn till livslÀngden av objekt (synlighet) och utvÀrdera korrekt minnesÄtkomst under körning av koden. Rust erbjuder ocksÄ verktyg för att skydda mot heltalsöverflöden, krÀver obligatorisk initialisering av variabelvÀrden innan de anvÀnds, hanterar fel bÀttre i standardbiblioteket, tillÀmpar konceptet av oförÀnderliga (immutable) referenser och variabler som standard och erbjuder stark statisk typning för att minimera logiska fel.
Huvudsakliga nyheter:
- Den inbyggda standard C-biblioteket Musl, som anvÀnds vid statisk lÀnkning för mÄlplattformarna "*-linux-musl" (aarch64-unknown-linux-musl, x86_64-unknown-linux-musl, powerpc64le-unknown-linux-musl osv.) pÄ system utan Musl, har uppgraderats till version 1.2.5. Den minimalt stödja versionen av Musl för dynamisk lÀnkning har ocksÄ höjts till utgÄvan 1.2.5. Tidigare anvÀndes version 1.2.3 av Musl i Rust, dÀr det fanns problem med DNS-resolver implementeringen. I version 1.2.4 av Musl lades möjligheten till att skicka förfrÄgningar över TCP till DNS-resolvern in vid misslyckande av UDP-anrop, vilket löste problemet med förfrÄgningar av stora DNS-poster och förbÀttrade kompatibiliteten med rekursiva DNS-servrar som inte stödjer delresultat i trunkerade UDP-svar. I version 1.2.5 av Musl har hanteringen av svar med lÄnga CNAME-sekvenser implementerats i DNS-resolver och problemet dÀr vissa stora svar avvisades, överförda via TCP, har lösts.
- Standardbiblioteket har omarbetats för att lösa problem med reentransibilitet nÀr det anvÀnds i globala minnesallokerare skrivna i Rust, makrot std::thread_local! och funktionen std::thread::current, vilket ledde till oÀndlig rekursion. För att undvika situationen dÀr std::thread_local! och std::thread::current vid försök till minnesallokering anvÀnde samma allokerare som de anvÀnde, tillÀmpas nu direkt det systemiska minnesallokeringsmekanismen.
- Inom «asm!» blockar med assemblerkod Àr det tillÄtet att anvÀnda attributet «cfg», vilket exempelvis möjliggör hantering av aktivering av avancerade CPU-instruktionsuppsÀttningar inom ramen för specifika uttryck i ett asm-block (tidigare kunde attributen «cfg» endast anges för hela asm-blocket). asm!( // eller global_asm! eller naked_asm! «nop», #[cfg(target_feature = «sse2»)] «nop», // ⊠#[cfg(target_feature = «sse2»)] a = const 123, // anvÀnds endast pÄ sse2 );
- En ny uppsÀttning API har blivit stabiliserad, inklusive stabilisering av metoder och implementeringar av traits:
- <[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
- std::fmt::from_fn
- std::fmt::FromFn
- MÄlplattformen «riscv64a23-unknown-linux-gnu» har nÄtt andra stödnivÄn, vilket innebÀr att bygggarantier finns, men inga garantier för att klara testsviten.
Det kan Àven nÀmnas flera relaterade projekt med Rust:
- För Linux-kÀrnan utvecklas ramverket Rex, som möjliggör skapandet av tillÀgg för Linux-kÀrnan pÄ Rust-sprÄket, vilket kan anvÀndas för att utöka kÀrnans funktionalitet istÀllet för eBPF. Rex erbjuder samma sÀkerhetsgarantier som eBPF, men anvÀnder Rust-sprÄkets och ett lÀttviktigt runtime:s kapabiliteter för isolering och sÀkerhet. För sÄdana program tillÀmpas ingen verifierare, och programmen kompileras till nativ kod av Rust-kompilatorn.
I Rex-program tillÄts anvÀndning av en delmÀngd av Rust-sprÄket som erbjuder sÀkerhetsgarantier. För nÀrvarande stöds 5 typer av eBPF-program: kprobe, perf_event, tracepoint, xdp och tc. Det finns möjlighet att anropa hjÀlpfunktioner för eBPF, interagera med map-strukturer i eBPF, hantera kÀrnresurser, hantera undantag och anvÀnda bindningar och abstraktioner över kÀrnstrukturer.
- En ny version av Fjall 3, ett inbÀddat lagringssystem skrivet i Rust som arbetar med data i nyckel-vÀrde-format, Àr tillgÀnglig. Datainlagring sker i form av en logg med en anvÀndning av LSM-trÀd (Log-Structured-Merge), liknande RocksDB, dÀr Àndringar skrivs genom att tillÀgga data i slutet av filen. Ett API i stil med BTreeMap erbjuds för att interagera med databasen. Funktioner som namnrymder, direkt och omvÀnd sökning inom intervall, inbyggd komprimering, serialiserbara transaktioner, separat lagring av nycklar och dÀrtill kopplade mycket stora vÀrden, samt automatisk bakgrundsunderhÄll av databasen stöds.
- Tor-projektet har lanserat version 1.9.0 av Arti, en implementation av Tor-verktyget skrivet i Rust. NÀr Arti-koden nÄr en nivÄ som helt kan ersÀtta C-versionen av Tor, planerar Tor-utvecklarna att ge Arti status som den primÀra implementationen av Tor och gradvis sluta stödja C-versionen. I den nya versionen har funktionaliteten för relÀer och servrar directories (Directory Authority) förbÀttrats, med bÀttre stöd för dynamiskt tilldelade portar (proxy.socks_listen = "auto") och en experimentell API för att hantera nycklar för onion-tjÀnster har lagts till.
KĂ€lla: opennet.ru
