Utgivningen av programmeringssprÄket Rust 1.81, som ursprungligen utvecklades av Mozilla men nu drivs av den oberoende ideella organisationen Rust Foundation, har publicerats. SprÄket fokuserar pÄ sÀker minneshantering och tillhandahÄller verktyg för hög grad av parallell exekvering av uppgifter, utan att anvÀnda skrÀpinsamlare eller runtime (runtime Àr begrÀnsat till grundlÀggande initialisering och underhÄll av standardbiblioteket).
Minneshanteringsmetoderna i Rust skyddar utvecklare frÄn att göra fel vid manipulering av pekare och skyddar mot problem som uppstÄr vid lÄg nivÄ minnesarbete, sÄsom att komma Ät minnesomrÄden efter att de har frigjorts, dereferera nullpekare, buffer overflow, etc. För distribution av bibliotek, byggande och hantering av projektberoenden utvecklas paketförvaltaren Cargo. För lagring av 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:
- Typen core::error::Error har stabiliserats och definierar de felbeskrivningar som skrivs ut. Denna Àndring gör det möjligt att anvÀnda en enhetlig typ av Error i olika bibliotek, oavsett miljö, inklusive bibliotek som inte Àr kopplade till standardbiblioteket och anvÀnder attributet «#![no_std]».
- Stabila och ostabila sorteringsfunktioner i standardbiblioteket har översatts till att anvÀnda nya algoritmer som visar högre prestanda och kortare kompilerings tid. I implementeringen av de nya sorteringsalgoritmerna sÀkerstÀlls det att felaktigt definierade typer av Ord identifieras och att fel (panic) i sÄdana fall rapporteras istÀllet för att data grupperas slumpmÀssigt.
- I lint-programmet har en ny nivÄ av kontroll «expect» («#[expect(lint)]») implementerats, vilket gör att man kan försÀkra sig om att kontrollen utförs och att ett varningsmeddelande visas om kontrollen inte uppfylls (till följd av ett fel i implementeringen eller avstÀngning av kontrollen). Till exempel, vid övergÄngen av kodbasen till att anvÀnda kontrollen undocumented_unsafe_blocks via Clippy kan man ange «#[expect(clippy::undocumented_unsafe_blocks)]» för att sÀkerstÀlla att alla unsafe-block dokumenteras under övergÄngen. Clippy har ocksÄ infört kontrollerna clippy::allow_attributes och clippy::allow_attributes_without_reason, vilket förenklar byte av attributen «#[allow]» till «#[expect(lint)]».
- Möjligheten att dokumentera orsaken till Àndringar av kontrollnivÄer (lint) har tillhandahÄllits, vilket ger nya utvecklare information om orsaken till att en viss kontroll har lagts till och som skrivs ut som ett meddelande frÄn kompilatorn. Till exempel: #![deny(clippy::float_arithmetic, reason = «no hardware float support»)]
- En ny uppsÀttning API har blivit stabiliserad, inklusive stabilisering av metoder och implementeringar av traits:
- core::error
- hint::assert_unchecked
- fs::exists
- AtomicBool::fetch_not
- Duration::abs_diff
- IoSlice::advance
- IoSlice::advance_slices
- IoSliceMut::advance
- IoSliceMut::advance_slices
- PanicHookInfo
- PanicInfo::message
- PanicMessage
Beteckningen «const», som definierar möjligheten att anvÀnda det i vilken kontext som helst istÀllet för konstanter, anvÀnds i funktioner:
- char::from_u32_unchecked (funktion)
- char::from_u32_unchecked (metod)
- CStr::count_bytes
- CStr::from_ptr
Typen std::panic::PanicInfo har omdöpts till std::panic::PanicHookInfo (den gamla namnet Àr fortfarande i bruk, men frÄn nÀsta version kommer anvÀndningen att resultera i en varning). Samtidigt kommer core::panic::PanicInfo att förbli oförÀndrat, men utvecklas som en separat typ. Typdelning möjliggör implementering av olika metoder specifika för att köra i kontexten av snd och no_std.
- ĂvergĂ„ngen till ABI C-unwind (âextern «C-unwind»â) har slutförts, vilket skiljer sig frĂ„n ABI utan suffixet «-unwind» (âextern «C»â) genom att bevara sĂ€kert beteende (safe) om processen av âunwindingâ, som initieras vid programkrasch eller undantag i C++-stil, korsar ABI-grĂ€nsen (t.ex. nĂ€r ett undantag som intrĂ€ffat i koden pĂ„ ett sprĂ„k pĂ„verkar stacken relaterad till koden pĂ„ ett annat sprĂ„k). FrĂ„n och med Rust-version 1.81 utlöses en programkrasch i ABI âextern «C»â vid icke fĂ„ngad âunwindingâ.
- Tredje nivÄ av stöd har implementerats för plattformarna i686-unknown-redox, xtensa-esp32-none-elf, xtensa-esp32s2-none-elf, xtensa-esp32s3-none-elf, xtensa-esp32-espidf, xtensa-esp32s2-espidf, xtensa-esp32s3-espidf. Tredje nivÄn innebÀr grundlÀggande stöd men utan automatiserad testning, publicering av officiella byggen och verifiering av möjligheten att bygga koden.
- Andra nivÄn av stöd har implementerats för de mÄlplattformarna loongarch64-unknown-linux-musl och arm64ec-pc-windows-msvc. Den andra nivÄn av stöd garanterar byggprocessen.
- För Linux-system pÄ LoongArch-plattformen har komplett verktygssats och profileringsverktyg tillhandahÄllits.
- En sÄrbarhet (CVE-2024-43402) i std::process::Command, som endast upptrÀder pÄ Windows-plattformen, har ÄtgÀrdats och eliminerar en attackvektor för utnyttjande av tidigare ÄtgÀrdad sÄrbarhet BatBadBut, relaterad till hantering av specialtecken vid anvÀndning av anrop av Command::arg och Command::args, avsedda för direkt överföring av argument till processen utan bearbetning av kommandotolk. Vid körning av bat- och cmd-skript kördes processen cmd.exe, vilken har sin egen logik för att separera argument. SkyddsomgÄngen baseras pÄ att Windows tar bort ledande blanksteg och punkter i sökvÀgar, dvs. en fil med förlÀngning «.bat. .» behandlas som «.bat».
Dessutom kan man notera att Wedson Almeida Filho har lĂ€mnat sin post som projektledare för Rust for Linux, som syftar till att införa verktyg för utveckling av Rust i Linux-kĂ€rnan. Efter Wedsions avhopp finns det tvĂ„ kvarvarande projektledare â Miguel Ojeda, skapare och huvudutvecklare av Rust-for-Linux-projektet, och Alex Gaynor, tidigare chef för Python Software Foundation, som nu fokuserar pĂ„ att frĂ€mja Rust. Den avgĂ„ende projektledaren, som gick med i projektet för fyra Ă„r sedan, Ă€r anstĂ€lld hos Microsoft och författare till en experimentell drivrutin som implementerar EXT2-filsystemet, skriven i Rust. PĂ„ senare tid har Almeida fokuserat pĂ„ att skapa utvecklingsverktyg för filsystem i Rust. I Ă„r har Almeida bidragit med 17 commits till Rust-for-Linux-repoet (till jĂ€mförelse har Miguel Ojeda lagt till 53 commits).
Som orsak till sin avgÄng nÀmner han brist pÄ energi och entusiasm, som en gÄng var nödvÀndig för att bemöta viss icke-teknisk nonsens. Enligt Almeida tvingas utvecklarna lÀgga ner mycket kraft pÄ argumentation kring ovÀsentliga frÄgor som gör att de mer viktiga globala mÄlen gÄr förlorade. Almeida fortsÀtter att tro att framtiden för kÀrnor ligger i anvÀndningen av sprÄk som möjliggör sÀkert minneshantering, och om Linux-utvecklarsamhÀllet inte förstÄr detta, kommer Linux att konkurreras ut av en annan kÀrna, precis som Unix en gÄng blev.
Stödet för Rust-for-Linux-projektet har stött pÄ motstÄnd frÄn etablerade utvecklare av kÀrnan som inte ser behovet av att lÀra sig ett nytt sprÄk. I sitt avgÄngsbrev nÀmner Almeida ett exempel frÄn en diskussion som Àgde rum under hans och Kent Overstreets presentation vid konferensen "Linux Storage, Filesystem, Memory-Management, and BPF Summit", som handlade om att anvÀnda Rust för utveckling av filsystem. Ted Ts'o, skaparen av ext2/ext3/ext4-filsystemen, kritiserade initiativet att implementera Rust, och jÀmförde det med att försöka tvinga alla att anta Rust som en religion.
Som svar pÄ Almeida's avsikt att skapa ett wrapper för de C-sprÄksbaserade filsystemens grÀnssnitt för att anvÀndas i Rust-kod, pÄpekade Ted Tso att en sÄdan wrapper oundvikligen skulle leda till problem, eftersom varje förÀndring av C-grÀnssnitten och refaktoriseringen skulle krÀva en förÀndring av wrappern för Rust, och han vill inte ta pÄ sig det extra ansvaret för att ÄtgÀrda uppkomna problem i Rust-koden och för att övervaka tillstÄndet för Rust-wrappern. C-koden utvecklas stÀndigt, och om dess förÀndring stör wrappern för Rust, skulle det leda till problem för alla filsystem beroende av denna wrapper.
Ted anser ocksÄ att en wrapper för Rust under överskÄdlig framtid kommer att förbli sekundÀr och att problem i bindningarna kommer att vara ett huvudvÀrk endast för Rust-for-Linux-utvecklare, snarare Àn för gemenskapen av filsystemutvecklare i kÀrnan. Det pÄpekas att inte alla utvecklare Àr villiga att lÀra sig Rust och dÀrför, efter att ha gjort förÀndringar som pÄverkar annan kod, bara kan uppdatera den beroende C-koden, men inte kan ÄtgÀrda Rust-wrappern eftersom de inte kÀnner till Rust. Diskussionen inkluderade ocksÄ James Bottomley, som stöder SCSI-underavsnittet, som sa att ju mer semantik som kodas i wrappers, desto mer ömtÄliga blir de nÀr det gÀller att sÀkerstÀlla synkronisering.
Under tiden har Google, som förra Äret omskrev pvmfm-firmware i Rust, som anvÀnds i virtuella maskiner, som körs pÄ Android-plattformen, delade med sig av erfarenheter kring gradvis integrering av kod skriven i Rust i befintliga firmware, som ursprungligen skrevs i C eller C++. Det visades hur man kan avsevÀrt öka sÀkerheten i firmware genom att skapa funktionellt identiska komponent-byten, skrivna i Rust. Huvudfokus vid införandet av Rust bör ligga pÄ att anvÀnda Rust för ny kod och kod som utför kritiska funktioner ur sÀkerhetssynpunkt (till exempel kod för hantering av externa data som kommer frÄn osÀkra kÀllor). För integration av Rust- och C-kod föreslÄs det att anvÀnda shim-lager som översÀtter anrop mellan Rust- och C-API (C-API exporteras för anvÀndning i Rust-kod och vice versa), vilket möjliggör en gradvis omskrivning av API-element till Rust.
KĂ€lla: opennet.ru
