UtgÄvan av Rust 1.96. Bedömning av Rusts lÀmplighet för att skapa firmware för mikrokontroller.

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
Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster