De release van de programmeertaal Rust 1.99 is gepubliceerd, ontwikkeld onder de aegis van de onafhankelijke non-profitorganisatie Rust Foundation, oorspronkelijk gestart door het Mozilla-project. De taal richt zich op veilig geheugenbeheer en biedt middelen voor hoge parallelisatie van taken, zonder gebruik te maken van een garbage collector en runtime (de runtime beperkt zich tot de basisinitialisatie en ondersteuning van de standaardbibliotheek).
De geheugenmethoden in Rust zijn gericht op het uitsluiten van fouten bij het manipuleren van pointers en het beschermen tegen problemen die voortkomen uit laagdrempelige geheugengebruik, zoals toegang tot geheugen na vrijgave, derefereren van null pointers, buffer overflows, enz. Voor de distributie van bibliotheken, het waarborgen van builds en het beheren van afhankelijkheden, wordt de package manager Cargo verder ontwikkeld. Voor het hosten van bibliotheken wordt de repository crates.io ondersteund.
Veilige geheugenwerking in Rust wordt tijdens de compilatie gegarandeerd door middel van referentiecontrole, het bijhouden van eigenaarschap van objecten, het in acht nemen van de levensduur van objecten (scope) en het evalueren van toegangsrechten tot geheugen tijdens de uitvoering van code. Rust biedt ook middelen om integer-overflows te voorkomen, vereist dat waarden van variabelen voor gebruik worden geĆÆnitialiseerd, behandelt fouten beter in de standaardbibliotheek, past het concept van onveranderlijke (immutable) referenties en variabelen als standaard toe en biedt sterke statische type-onderzoek voor het minimaliseren van logische fouten.
Belangrijkste vernieuwingen:
- Er is een mogelijkheid toegevoegd om in Rust functies te maken met een variabel aantal argumenten (variadic), die geƫxporteerd kunnen worden voor aanroep uit C-projecten (C ABI). Als laatste element in de parameterlijst van dergelijke functies kan de constructie '...' worden opgegeven, die in Rust wordt behandeld met behulp van een speciaal type VaList, dat werkt analogisch aan va_list in C. unsafe extern "C" fn sum(mut args: ...) -> i32 { let a = unsafe { args.next_arg::() }; let b = unsafe { args.next_arg::() }; a + b } fn foo() -> i32 { unsafe { sum(0i32, 2i32) } }
- De functies Layout::for_value_raw, mem::size_of_val_raw en mem::align_of_val_raw zijn gestabiliseerd, zodat ze veilig de grootte en uitlijning kunnen bepalen via rauwe pointers (raw pointers), inclusief voor types met dynamische grootte, zoals slices, zonder dat het nodig is om verwijzingen naar de gegevens te maken.
- De documentatie bevat nu de aanbeveling om het vrijgeven van geheugen te vermijden, waarvoor een statische verwijzing met onbeperkte levensduur (&'static) is verkregen via een aanroep van Box::leak (round-trip unleaking), omdat dergelijke acties mogelijk problemen kunnen veroorzaken door incompatibiliteit met toekomstige compileroptimalisaties en de aanroepmechanismen voor geheugenallocatie. In plaats van het maken van een statische verwijzing voor tijdelijke overdracht van eigendom, wordt aanbevolen om rauwe pointers te gebruiken, bijvoorbeeld door een aanroep van Box::into_non_null.
- Een nieuwe lading API's is gestabiliseerd, inclusief gestabiliseerde methoden en implementaties van traits:
- IntoIterator for Box
- IntoIterator for &Box
- IntoIterator for &mut Box
- VecDeque::retain_back
- core::ffi::VaList
- Box::into_non_null
- Box::from_non_null
- Vec::into_parts
- Vec::from_parts
- core::mem::size_of_val_raw
- core::mem::align_of_val_raw
- core::alloc::Layout::for_value_raw
- String::from_utf8_lossy_owned
- string::FromUtf8Error::into_utf8_lossy
- FusedIterator for StepBy
- std::fs::set_times
- std::fs::set_times_nofollow
- In de package manager cargo is een nieuwe ingebouwde profiel "debug" geĆÆmplementeerd, vergelijkbaar met het profiel "dev" (in de toekomst wordt verwacht dat de mogelijkheden voor debugging en ontwikkeling gescheiden worden). Bij het bouwen in CI is incrementele compilatie standaard uitgeschakeld.
- Het doelplatform riscv64-unknown-linux-musl is naar het tweede ondersteuningsniveau overgezet, wat inhoudt dat de bouw gegarandeerd is, maar er zijn geen garanties bij het doorlopen van de testset.
Daarnaast kunnen de onlangs aangekondigde projecten en evenementen die verband houden met Rust worden vermeld:
- Het bedrijf Microsoft heeft Rust naar de eerste niveau talen overgebracht en zal volledige ondersteuning bieden gedurende alle fasen van ontwikkeling binnen het bedrijf. Voorheen werd eerste niveau ondersteuning binnen het bedrijf geboden voor de talen C++, C# en TypeScript. Er wordt opgemerkt dat Rust al wordt gebruikt in meer dan 100 repositories van Microsoft. Onder andere worden componenten in Rust al toegepast in producten zoals Microsoft 365 en Copilot, en voor de MSVC-compiler is een aparte backend rustc_codegen_utc voor Rust ontwikkeld, gebaseerd op de rustc-compiler.
Als belangrijkste doel van het gebruik van Rust bij Microsoft wordt genoemd het versterken van de beveiliging van kritieke code. Volgens de technische directeur van Microsoft Azure zijn ongeveer 70% van alle kwetsbaarheden in Windows het gevolg van geheugenproblemen die vermeden kunnen worden door gebruik te maken van Rust.
- Het bedrijf Google heeft de oude implementatie van het interprocess communication mechanisme Binder, geschreven in C, uit de Linux-kernel verwijderd ten gunste van de nieuwe Binder IPC-driver, herschreven in Rust. Het wordt opgemerkt dat er in de 15 jaar dat de oude driver bestaat, aanzienlijke technische schulden en complicaties zijn opgebouwd die het moeilijk maakten om fouten op te sporen, te onderhouden en nieuwe mogelijkheden toe te voegen. De Binder IPC-driver in Rust is erkend als de primaire driver en wordt niet langer gepresenteerd als een experimentele ontwikkeling.
- De release van Arti 2.7.0 is gepubliceerd, de implementatie van de Tor-toolkit, geschreven in Rust. Zodra de Arti-code een niveau bereikt dat volledig de versie in C kan vervangen, zijn de ontwikkelaars van Tor van plan om Arti de status van primaire implementatie van Tor te geven en geleidelijk het onderhoud van de implementatie in C stop te zetten. In de nieuwe versie is de functionaliteit voor relay's uitgebreid. servers directory (Directory Authority), gerelateerd aan het parseren van documenten, het ondersteunen van het mirroren van directory-servers en het verwerken van DNS-verkeer. Er is een RPC-implementatie toegevoegd voor het wijzigen en controleren van configuraties. Meerdere kwetsbaarheden zijn verholpen ā het wordt aanbevolen dat beheerders van onion-services snel hun systemen bijwerken.
Bron: opennet.ru
