UtgÄvan av programmeringssprÄket Rust 1.96 har publicerats, som ursprungligen utvecklades av Mozilla men numera utvecklas under ledning av den oberoende ideella organisationen Rust Foundation. SprÄket fokuserar pÄ sÀker hantering av minne och tillhandahÄller medel för att uppnÄ hög parallellism i uppgiftsexekvering, utan att anvÀnda en skrÀpares samlare och runtime (runtime begrÀnsas till grundlÀggande initiell och underhÄll av standardbiblioteket).
Minneshanteringsmetoderna i Rust syftar till att eliminera fel vid hantering av pekare och skydda mot problem som uppstÄr frÄn lÄg nivÄ minneshantering, sÄsom att referera till minnesomrÄden efter att de har frigjorts, dereferensiering av nullpekare, buffertöverskridningar, etc. För spridning av bibliotek, byggnation och hantering av beroenden utvecklas paketchefen Cargo. För att lagra 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:
- Modulen range har lagts till med implementeringen av nya typer som utvecklas för att ersÀtta de utdaterade typerna Range, RangeInclusive, RangeToInclusive och RangeFrom, och som möjliggör lagring av intervall i Copy-strukturer. Typen Range definierar intervall begrÀnsade av ett minimalt och maximalt tillÄtet vÀrde (men inklusive inte det), typen RangeFrom definierar siffror som börjar frÄn ett angivet vÀrde, medan typen RangeInclusive inkluderar vÀrdena i det angivna intervallet med bÄda grÀnserna. I framtida utgÄvor kommer ytterligare typer som RangeFull och RangeTo att introduceras, dÀr den gamla implementationen flyttas till core::range::legacy::* och syntaxen 'N..M' kommer att översÀttas till de nya typerna.
De nya typerna skiljer sig Ät genom att de implementerar typtraitet IntoIterator istÀllet för Iterator, det vill sÀga, istÀllet för den inbyggda iteratorn definierar de hur man konverterar typen till en iterator. Denna metod tillÄter anvÀndning av kopieringsoperationen (typtraitet Copy, vilket visar att vÀrden av typen kan dupliceras genom enkel kopiering), vilket tidigare var otillgÀngligt pÄ grund av inkompatibilitet med typer med inbyggda iteratorer.
Till exempel ger de nya typerna möjlighet att spara grÀnserna för en skiva i en struktur som helt kopieras utan separat lagring av start- och slutvÀrden:use core::range::Range;
#[derive(Clone, Copy)]
pub struct Span(Range);impl Span {
pub fn of(self, s: &str) -> &str {
&s[self.0]
}
} - Makron 'assert_matches!' och 'debug_assert_matches!' har lagts till, som kontrollerar om ett vÀrde matchar ett angivet mönster och avslutar exekveringen om det finns en avvikelse. De nya makron skiljer sig i att de ger ut debug-information med vÀrdena som orsakade felet, till skillnad frÄn uttrycken 'assert!(matches!(..))' och 'debug_assert!(matches!(..))'. För att undvika kollisioner med tredjepartsmakron som levereras med liknande namn, krÀver de nya makron en explicit import av biblioteket 'core::assert_matches'.
use core::assert_matches;
fn get_random_number() -> u32 {
4
}fn main() {
assert_matches!(get_random_number(), 1..=6);
} - Vid sammansĂ€ttning för mĂ„lplattformen WebAssembly har överföringen av lĂ€nkaralternativet "âallow-undefined" avbrutits, vilket tillĂ€t lĂ€nkning vid förekomsten av odefinierade symboler, som omvandlades till import frĂ„n modulen "env". Vid sammansĂ€ttning för WebAssembly mĂ„ste nu alla lĂ€nkade symboler per standard vara definierade. För att Ă„terfĂ„ det gamla beteendet kan miljövariabeln "RUSTFLAGS=-Clink-arg=âallow-undefined" eller uttrycket â#[link(wasm_import_module = "env")]â i koden anvĂ€ndas.
- En ny uppsÀttning API har blivit stabiliserad, inklusive stabilisering av metoder och implementeringar av traits:
- assert_matches!
- debug_assert_matches!
- From för AssertUnwindSafe
- From för LazyCell
- From för LazyLock
- core::range::RangeToInclusive
- core::range::RangeToInclusiveIter
- core::range::RangeFrom
- core::range::RangeFromIter
- core::range::Range
- core::range::RangeIter
- I paketförvaltaren Cargo har sÄrbarheten CVE-2026-5223 ÄtgÀrdats, vilken kan anvÀndas för att skriva över kÀllkoden för ett annat crate-paket i den lokala paketcachen frÄn samma förvar genom manipulation med symboliska lÀnkar inuti crate-paketet. SÄrbarheten upptrÀder endast vid arbete med externa paketförvar och berör inte anvÀndare av förvaret crates.io, eftersom uppladdning av paket med symboliska lÀnkar Àr förbjudet pÄ crates.io.
Ytterligare kan man nÀmna publiceringen (PDF) av resultaten frÄn en analys av Rust-sprÄkets lÀmplighet för utveckling av firmware för mikrokontroller och inbyggda system med begrÀnsade resurser.
Studien genomfördes av STMicroelectronics i samarbete med flera europeiska universitet. TvÄ isolerade utvecklarteam fick i uppdrag att implementera samma firmware för STM32U585AI mikrokontroller med Arm Cortex-M33-kÀrna. Det första teamet skapade firmware i C, medan det andra i Rust.
Testningen av det utförda arbetet visade inga pÄtagliga fördelar med att anvÀnda C istÀllet för Rust vid utveckling av firmware för mikrokontroller nÀr man jÀmförde minnesanvÀndning och prestanda. Dessutom gjorde anvÀndningen av den Rust-baserade system runtime frÄn det öppna projektet Ariel OS att minnesanvÀndningen i Rust-projektet var lÀgre Àn i C-implementeringen som anvÀnde en traditionell stack för firmwareutveckling baserad pÄ newlib-biblioteket.
Den resulterande firmware-storleken var 84100 byte i projektet pĂ„ Rust och 76744 byte i projektet pĂ„ C (10% mindre), men minnesanvĂ€ndningen i firmware pĂ„ Rust visade sig vara betydligt lĂ€gre â 24640 byte mot 42608 byte. NĂ€r det kommer till prestanda, vid testning av de första prototyperna som utvecklades under 6 veckor, övertrĂ€ffade implementationen pĂ„ Rust den pĂ„ C med tvĂ„ gĂ„nger, men bĂ„da implementationerna lĂ„g betydligt under den berĂ€knade maximala prestandan. Efter 4 veckors optimering nĂ„dde bĂ„da implementationerna ungefĂ€r samma resultat, nĂ€ra det berĂ€knade maximum.

KĂ€lla: opennet.ru
