De release van programmeertaal Rust 1.96 is gepubliceerd, oorspronkelijk gebaseerd op het project van Mozilla, maar nu ontwikkeld onder de vleugels van de onafhankelijke non-profitorganisatie Rust Foundation. De taal richt zich op veilige geheugenbeheer en biedt middelen om hoge parallelisatie van taken te bereiken, terwijl het geen gebruik maakt van een garbage collector en runtime (de runtime beperkt zich tot 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:
- Een range-module is toegevoegd met implementaties van nieuwe types, die zijn ontwikkeld ter vervanging van verouderde types zoals Range, RangeInclusive, RangeToInclusive en RangeFrom, en die het mogelijk maken om reeksen op te slaan in Copy-structuren. Het type Range definieert reeksen, begrensd door de minimale en maximale toegestane waarde (maar deze zijn niet inbegrepen), het type RangeFrom definieert nummers vanaf de opgegeven waarde, en het type RangeInclusive omvat de waarden van de opgegeven reeks met beide grenzen. In toekomstige uitgaven zullen ook de types RangeFull en RangeTo verschijnen, terwijl de oude implementatie zal worden verplaatst naar core::range::legacy::*, en de syntaxis „N..M” zal worden omgezet naar de nieuwe variant van types.
Nieuwe types onderscheiden zich doordat ze in plaats van de trait Iterator de trait IntoIterator implementeren, dit betekent dat in plaats van een ingebouwde iterator wordt gedefinieerd hoe een type in een iterator moet worden omgezet. Deze benadering maakt het mogelijk om met nieuwe types de copieeroperatie te gebruiken (de trait Copy, die aangeeft dat waarden van het type kunnen worden gedupliceerd door eenvoudig te kopiëren), wat eerder niet beschikbaar was vanwege incompatibiliteit met types met ingebouwde iterators.
Bijvoorbeeld, nieuwe types maken het mogelijk om de grenzen van een slice op te slaan in een structuur die volledig wordt gekopieerd zonder afzonderlijke opslag van de start- en eindwaarden:use core::range::Range;
#[derive(Clone, Copy)]
pub struct Span(Range);impl Span {
pub fn of(self, s: &str) -> &str {
&s[self.0]
}
} - Er zijn de macro's „assert_matches!” en „debug_assert_matches!” toegevoegd, die controleren of een waarde overeenkomt met een opgegeven patroon en het programma afbreken bij een discrepantie. In tegenstelling tot de uitdrukkingen „assert!(matches!(..))” en „debug_assert!(matches!(..))” onderscheiden de nieuwe macro's zich door het weergeven van debug-informatie met de waarden die de fout hebben veroorzaakt. Om overlapping met externe macro's met vergelijkbare namen te voorkomen, vereisen de nieuwe macro's een expliciete import van de bibliotheek „core::assert_matches”.
use core::assert_matches;
fn get_random_number() -> u32 {
4
}fn main() {
assert_matches!(get_random_number(), 1..=6);
} - Bij het bouwen voor het doelplatform WebAssembly is de overdracht van de optie "--allow-undefined" aan de linker stopgezet, wat het koppelen mogelijk maakte bij het bestaan van ongedefinieerde symbolen die werden omgezet naar import uit de module "env". Bij het bouwen voor WebAssembly moeten nu standaard alle aan linking gerelateerde symbolen gedefinieerd zijn. Voor het terugbrengen van het oude gedrag kan de omgevingsvariabele "RUSTFLAGS=-Clink-arg=--allow-undefined" of de expressie ‘#[link(wasm_import_module = "env")]’ in de code worden gebruikt.
- Een nieuwe lading API's is gestabiliseerd, inclusief gestabiliseerde methoden en implementaties van traits:
- assert_matches!
- debug_assert_matches!
- From voor AssertUnwindSafe
- From voor LazyCell
- From voor LazyLock
- core::range::RangeToInclusive
- core::range::RangeToInclusiveIter
- core::range::RangeFrom
- core::range::RangeFromIter
- core::range::Range
- core::range::RangeIter
- In de pakketbeheerder Cargo is de kwetsbaarheid CVE-2026-5223 verholpen, die kan worden gebruikt voor het overschrijven van de broncode van een andere crate-pakket in de lokale pakketcache vanuit dezelfde repository door manipulatie van symbolische links binnen het crate-pakket. De kwetsbaarheid doet zich alleen voor bij het werken met externe pakketrepositories en heeft geen invloed op gebruikers van de repository crates.io, aangezien het uploaden van pakketten met symbolische links in crates.io is verboden.
Daarnaast kan de publicatie (PDF) van de geschiktheidsanalyse van de programmeertaal Rust voor de ontwikkeling van firmware voor microcontrollers en embedded systemen met beperkte middelen worden opgemerkt.
Het onderzoek is uitgevoerd door STMicroelectronics in samenwerking met verschillende Europese universiteiten. Twee geïsoleerde ontwikkelteams kregen de taak om dezelfde firmware te implementeren voor de STM32U585AI microcontrollers met een Arm Cortex-M33 kern. Het eerste team creëerde de firmware in C, terwijl het tweede team dit in Rust deed.
De test van het voltooide werk toonde geen significante voordelen aan bij het gebruik van de programmeertaal C in plaats van Rust bij de ontwikkeling van firmware voor microcontrollers, vergeleken met het geheugengebruik en de prestaties. Sterker nog, het gebruik van de in Rust geschreven systeemruntime van het open-source project Ariel OS stelde ons in staat om het geheugengebruik in het Rust-project lager te krijgen dan in de implementatie in C die traditioneel gebruikmaakt van een stack voor de ontwikkeling van firmware op basis van de newlib-bibliotheek.
De resulterende firmware had een grootte van 84100 bytes in het Rust-project en 76744 bytes in het C-project (10% minder), maar het geheugengebruik in de firmware op Rust was aanzienlijk lager - 24640 bytes versus 42608 bytes. Wat betreft de prestaties, bij het testen van de initiële prototypes, ontwikkeld in 6 weken, was de implementatie in Rust twee keer sneller dan de implementatie in C, maar beide implementaties bleven aanzienlijk achter bij de berekende maximale prestaties. Na 4 weken optimalisatie bereikten beide implementaties ongeveer dezelfde resultaten, dicht bij het berekende maximum.

Bron: opennet.ru
