Rust 1.93, et programmeringssprog oprindeligt baseret på Mozilla-projektet, men nu udviklet under tilsyn af den uafhængige non-profit organisation Rust Foundation, er blevet udgivet. Sproget fokuserer på sikker hukommelsesstyring og tilbyder midler til at opnå høj parallellisme i opgavernes udførelse, uden brug af en affaldssamler og runtime (runtime reduceres til grundlæggende initialisering og vedligeholdelse af standardbiblioteket).
Metoder til hukommelsesarbejde i Rust befrier udviklere fra fejl ved manipulation af pekere og beskytter mod problemer, der opstår ved lavniveau håndtering af hukommelse, såsom adgang til hukommelsesområder efter frigivelse, dereferering af nulpekere, buffer-overløb osv. For distribution af biblioteker, byggeprocesser og afhængighedsstyring udvikles pakkehåndteringssystemet Cargo. For opbevaring af biblioteker understøttes repository'et crates.io.
Sikker håndtering af hukommelse sikres i Rust under kompilering ved referencekontrol, sporing af ejerskab af objekter, hensyntagen til livstid af objekter (synlighed) og vurdering af korrekt adgang til hukommelse under kodeudførelse. Rust tilbyder også midler til beskyttelse mod heltals-overløb, kræver obligatorisk initialisering af variabelværdier før brug, håndterer fejl bedre i standardbiblioteket, anvender konceptet med uforanderlige (immutable) referencer og variabler som standard og tilbyder stærk statisk typisering for at minimere logiske fejl.
Hovednyhederne:
- Den indbyggede C-bibliotek Musl, der følger med Rust og bruges til statisk linkning for målplatforme ‘*-linux-musl’ (aarch64-unknown-linux-musl, x86_64-unknown-linux-musl, powerpc64le-unknown-linux-musl osv.) på systemer uden Musl, er blevet opdateret til version 1.2.5. Den minimum understøttede version af Musl ved dynamisk linkning er også hævet til udgave 1.2.5. Tidligere blev Musl version 1.2.3 brugt i Rust, som havde problemer med implementeringen af DNS-resolveren. I Musl version 1.2.4 blev der tilføjet mulighed for at sende forespørgsler over TCP, hvis UDP anmodningen mislykkedes, hvilket løste problemet med forespørgsler om store DNS-poster og forbedrede kompatibiliteten med rekursive DNS-servere, der ikke understøttede delvis returnering af resultater i afkortede UDP-svar. I Musl version 1.2.5 er der implementeret håndtering af svar med lange CNAME-sekvenser i DNS-resolveren, og et problem, der forhindrede nogle store svar i at blive transmitteret over TCP, er blevet løst.
- Standardbiblioteket er blevet omarbejdet for at løse problemer med reentranthed, når der bruges globale hukommelsesallokatorer skrevet i Rust, samt makroen std::thread_local! og funktionen std::thread::current, som tidligere førte til uendelig rekursion. For at eliminere situationen, hvor std::thread_local! og std::thread::current ved forsøg på hukommelsesallokering kaldte den samme allokator, som de anvendte, anvendes nu direkte det systematiske hukommelsesallokeringssystem.
- Inden for blokke ‘asm!’ med assemblerkode er brugen af attributter ‘cfg’ nu tilladt. Dette gør det muligt at styre aktiveringen af udvidede CPU-kommandoer i konteksten af individuelle udtryk inden for asm-blokken (tidligere kunne attributterne ‘cfg’ kun angives for hele asm-blokken). asm!( // eller global_asm! eller naked_asm! "nop", #[cfg(target_feature = "sse2")] "nop", // … #[cfg(target_feature = "sse2")] a = const 123, // kun brugt på sse2 );
- En ny batch af API'er er blevet klassificeret som stabile, herunder stabilisering af metoder og implementeringer af 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
- Den målrettede platform "riscv64a23-unknown-linux-gnu" er blevet oversat til andet supportniveau, som indebærer garanti for opbygning men ingen garantier for beståelse af testsættet.
Derudover kan der nævnes flere relaterede projekter med Rust:
- Der udvikles et framework, kaldet Rex, til Linux-kernen, som muliggør oprettelse af plug-ins til Linux-kernen på Rust-sprog, som kan bruges til at udvide kernen funktionalitet i stedet for eBPF. Rex giver de samme sikkerhedsgarantier som eBPF, men bruger Rust-sprogets funktioner til isolation og sikkerhed og et letvægts runtime. For sådanne programmer anvendes der ikke nogen verifier, og programmerne kompilere til native kode med Rust-kompilatoren.
I Rex-programmer er det tilladt at bruge et undertitel af Rust-sproget, der giver sikkerhedsgarantier. I sin nuværende form understøttes 5 typer af eBPF-programmer: kprobe, perf_event, tracepoint, xdp og tc. Der er mulighed for at kalde hjælpefunktioner fra eBPF, interagere med eBPF map-strukturer, styre kernelressourcer, håndtere undtagelser og bruge indpakninger og abstraktioner over kernelstrukturer.
- Udgivelsen af Fjall 3 er tilgængelig, en indlejret lagringsløsning skrevet i Rust, der arbejder med data i nøgle-værdi-format. Dataene opbevares i logform ved brug af LSM-træ (Log-Structured-Merge), som i RocksDB, hvor ændringer skrives ved at tilføje data til slutningen af filen. For at få adgang til databasen tilbydes et API i stil med BTreeMap. Der understøttes funktioner som navnerum, direkte og omvendt søgning efter intervaller, indbygget kompression, serialiserbare transaktioner, separat opbevaring af nøgler og deres meget store relaterede værdier, samt automatisk baggrundsvedligeholdelse af databasen. Koden er åben under Apache 2.0 licensen.
- Tor-projektet har offentliggjort version 1.9.0 af Arti, et værktøjssæt til Tor skrevet i Rust. Når Arti's kode når et niveau, der kan erstatte C-versionen fuldstændigt, har Tor-udviklerne til hensigt at gøre Arti til den primære implementering af Tor og gradvist stoppe vedligeholdelsen af C-versionen. Den nye version fortsætter implementeringen af funktionalitet til relæer og servere direktorier (Directory Authority), forbedret støtte til dynamisk tildelte porte (proxy.socks_listen = "auto"), og et eksperimentelt API til styring af nøgler til onion-tjenester.
Kilde: opennet.ru
