Objava Rust 1.81. Prepreke u promociji Rust-a u Linux jezgru

Objavljen je izdanja programskog jezika opće namjene Rust 1.81, koji je započet kao projekt Mozille, a sada se razvija pod okriljem neovisne neprofitne organizacije Rust Foundation. Jezik se fokusira na sigurnu obradu memorije i pruža sredstva za postizanje visokog paralelizma u izvršavanju zadataka, pritom se oslanjajući na minimalnu inicijalizaciju i podršku standardnoj biblioteci, bez korištenja sakupljača smeća i runtime-a.

Metode manipulacije memorijom u Rustu oslobodile su programere od grešaka prilikom rukovanja pokazivačima i štite od problema koji proizlaze iz niskorazredne obrade memorije, poput pristupanja memoriji nakon što je oslobođena, dereferenciranja nul pokazivača, izlaska iz granica bafera itd. Za distribuciju biblioteka, osiguranje izgradnje i upravljanje ovisnostima, projekat se razvija putem upravitelja paketa Cargo. Za pohranu biblioteka podržava se repozitorij crates.io.

Sigurna manipulacija memorijom osigurava se u Rustu tijekom kompilacije provjerom referenci, praćenjem vlasništva nad objektima, uzimanjem u obzir vremena života objekata (opseg vidljivosti) i ocjenom točnosti pristupa memoriji tijekom izvršavanja koda. Rust također pruža sredstva za zaštitu od cjelobrojnih prekoračenja, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivosti (immutable) referenci i varijabla kao zadano te nudi snažnu statičku tipizaciju za minimiziranje logičkih grešaka.

Glavne novine:

  • Stabiliziran je tip core::error::Error, koji definira opise grešaka. Ova promjena omogućava korištenje jedinstvenog tipa Error u različitim knjižnicama, neovisno o okruženju, uključujući i knjižnice koje nisu vezane uz standardnu biblioteku, a koriste atribut „#![no_std]”.
  • Stabilne i nestabilne funkcije sortiranja u standardnoj biblioteci su prevedene na korištenje novih algoritama koji pokazuju veću brzinu rada i manje vrijeme kompajliranja. U implementaciji novih algoritama sortiranja osigurana je detekcija nepravilno definiranih tipova Ord i ispis grške informacije (panic) u tim slučajevima umjesto slučajno grupiranih podataka.
  • U linteru je implementirana nova razina provjere „expect” („#[expect(lint)]”), koja omogućava potvrdu izvršenja provjere i ispis upozorenja ako provjera nije provedena (zbog greške u implementaciji ili isključivanja provjere). Na primjer, prilikom prijelaza kodne baze na korištenje provjere undocumented_unsafe_blocks putem Clippy-ja, moguće je navesti „#[expect(clippy::undocumented_unsafe_blocks)]” kako bi se osiguralo da će tijekom prijelaza svi unsafe-blokovi biti dokumentirani. U Clippy-ju su također implementirane provjere clippy::allow_attributes i clippy::allow_attributes_without_reason, koje olakšavaju zamjenu atributa „#[allow]” sa „#[expect(lint)]”.
  • Omogućeno je dokumentiranje razloga zamjene razina provjerenog (lint), pružajući novim programerima informacije o razlozima dodavanja određene provjere, koje se ispisuju u obliku poruke kompajlera. Na primjer: #![deny(clippy::float_arithmetic, reason = „no hardware float support”)]
  • U stabilne verzije prebačen je novi set API-ja, uključujući stabilizirane metode i implementacije tipa:
    • 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

    Znak «const», koji određuje mogućnost korištenja u bilo kojem kontekstu umjesto konstanti, primijenjen je u funkcijama:

    • char::from_u32_unchecked (funkcija)
    • char::from_u32_unchecked (metoda)
    • CStr::count_bytes
    • CStr::from_ptr

    Tip std::panic::PanicInfo preimenovan je u std::panic::PanicHookInfo (staro ime ostaje, ali će njegovo korištenje od sljedeće verzije uzrokovati ispis upozorenja). U međuvremenu, core::panic::PanicInfo ostat će nepromijenjen, ali će se razvijati kao poseban tip. Razdvajanje tipova omogućit će implementaciju različitih metoda specifičnih za kontekste snd i no_std.

  • Završen je prijelaz na ABI C-unwind (‘extern «C-unwind»‘), koji se razlikuje od ABI bez sufiksa «-unwind» (‘extern «C»‘) očuvanjem sigurnog ponašanja (safe), ako proces «razmotavanja» (unwinding), pokrenut u slučaju izvanrednog završetka programa ili generiranja iznimke u stilu C++, pređe granicu ABI (npr. kada iznimka koja nastaje u kodu jednog programskog jezika tijekom razmotavanja zahvaćena stog povezan s kodom drugog programskog jezika). Počevši od izdanja Rust 1.81, u ABI ‘extern «C»‘ uključeno je izvanredno završavanje pri neuhvaćenoj razmoti.
  • Implementirana je treća razina podrške za platforme i686-unknown-redox, xtensa-esp32-none-elf, xtensa-esp32s2-none-elf, xtensa-esp32s3-none-elf, xtensa-esp32-espidf, xtensa-esp32s2-espidf, xtensa-esp32s3-espidf. Treća razina podrazumijeva osnovnu podršku, ali bez automatiziranog testiranja, objavljivanja službenih izdanja i provjere mogućnosti sastavljanja koda.
  • Implementirana je druga razina podrške za ciljne platforme loongarch64-unknown-linux-musl i arm64ec-pc-windows-msvc. Druga razina podrške jamči sastavljanje.
  • Za Linux sustave na platformi LoongArch osigurani su puni alati i profiler.
  • Otklonjena je ranjivost (CVE-2024-43402) u std::process::Command, koja se pojavljuje samo na Windows platformi i uklanja zaobilaženje ranije ispravljene ranjivosti BatBadBut, povezane s obradom specijalnih znakova pri korištenju poziva Command::arg i Command::args, koji su namijenjeni izravnom proslijeđivanju argumenata procesu, bez njihove obrade od strane komandnog interpreter-a. U praksi, prilikom pokretanja bat- i cmd-skripti, pokrenut je proces cmd.exe, koji ima vlastitu logiku razdvajanja argumenata. Zaobilaženje zaštite se temelji na tome što Windows uklanja vodeće praznine i točke u putanjama, tj. datoteka s ekstenzijom „.bat. .“ obrađuje se kao „.bat“.

Osim toga, spominje se odlazak Wedsona Almeide Filha sa pozicije vođe projekta Rust for Linux, koji se bavi integracijom alata za razvoj na jeziku Rust u Linux kernel. Nakon odlaska Wedsona, projektu su ostala još dva voditelja — Miguel Ojeda, autor i glavni razvijač projekta Rust-for-Linux, i Alex Gaynor, bivši direktor organizacije Python Software Foundation, koji se prebacuje na promociju Rusta. Odlazni vođa, koji se pridružio projektu prije 4 godine, zaposlenik je kompanije Microsoft i autor eksperimentalnog drajvera s implementacijom EXT2 datotečnog sistema, napisanog na jeziku Rust. U posljednje vrijeme Almeida je radio na razvoju alata za razvoj datotečnih sistema na jeziku Rust. Ove godine je Almeida u repozitorij Rust-for-Linux dao 17 commit-a (za usporedbu, Miguel Ojeda je dodao 53 commita).

Kao razlog odlaska spominje se nedostatak snage i entuzijazma koji su nekada postojali za reagiranje na određene besmislice netehničke prirode (nontechnical nonsense). Prema Almeida, programeri su prisiljeni trošiti mnogo snage na rasprave o nebitnim pitanjima koja umanjuju važniji globalni cilj. Almeida i dalje vjeruje da je budućnost kernela u korištenju jezika koji osiguravaju sigurnu manipulaciju memorijom, a ako zajednica developera Linuxa to ne shvati, Linux će biti potisnut nekim drugim kernelom, kao što se nekada dogodilo s Unix-om.

Pristaše projekta Rust-for-Linux suočile su se s potrebom da prevaziđu otpor iskusnih starih programera jezgre, koji ne vide potrebu za učenjem novog jezika. U svom pismu o ostavci, Almeida kao primjer navodi raspravu koja se odigrala tokom njegovog i Kent Overstreetovog nastupa na konferenciji "Linux Storage, Filesystem, Memory-Management, and BPF Summit", posvećenu korištenju Rust-a za razvoj datotečnih sistema. Aktivnosti na implementaciji Rust-a kritikovao je Ted Ts’o, autor datotečnih sistema ext2/ext3/ext4, koji je usporedio inicijativu Rust-for-Linux s pokušajem da se sve prisili da prihvate religiju Rust.

U odgovoru na Almeidaovu namjeru da stvori omotač oko sučelja datotečnih sistema napisanih na jeziku C za korištenje u kodu na jeziku Rust, Ted Ts’o je istaknuo da će takav omotač neizbježno dovesti do problema, jer svaka izmjena C-sučeva i provođenje refaktorizacije zahtijeva promjenu omotača za Rust. On ne želi preuzeti dodatnu odgovornost za rješavanje nastalih problema u kodu na Rust-u i praćenje stanja Rust-omotača. Kod na C-u se stalno razvija, a ako njegova promjena poremeti rad omotača za Rust, to će rezultirati kvarom svih datotečnih sistema koji se oslanjaju na taj omotač.

Ted također smatra da će omotač za Rust ostati sporedan u bliskoj budućnosti i da će pojavljivanje problema u povezivanjima biti glavobolja samo za programere Rust-for-Linux, a ne za zajednicu programera datotečnih sistema u jezgru. Istaknuto je da se ne planiraju svi programeri baviti učenjem Rust-a, te stoga nakon promjena koje utiču na drugi kod, neće moći ažurirati kod koji se oslanja na C, ali neće moći ispraviti Rust-omotače, jer ne poznaju Rust. Raspravi se također pridružio James Bottomley, održavatelj SCSI podsustava, koji je rekao da što više semantike bude kodirano u omotačima, to će oni postati lomljiviji s aspekta osiguravanja sinhronizacije.

U međuvremenu, kompanija Google, koja je prošle godine prepravila firmware pvmfm napisan na jeziku Rust, koristi u virtualnim mašinama, pokrenutih na platformi Android, podijelili su iskustvo postepenog uključivanja koda na jeziku Rust u postojeće firmware, izvorno napisane na C ili C++. Pokazano je kako se može značajno povećati sigurnost firmvera stvaranjem funkcionalno identičnih zamjenskih komponenti, napisanih na jeziku Rust. Glavna pažnja prilikom implementacije Rusta predlaže fokusiranje na korištenje Rusta za novi kod i kod koji obavlja funkcije kritične za sigurnost (na primjer, kod za obradu vanjskih podataka, dobivenih iz nepouzdanih izvora). Za integraciju koda na Rust i C predlaže se korištenje slojeva (shim) koji prevode pozive između API-ja na Rust i C (C API se izvozi za korištenje u kodu na Rustu i obrnuto), što omogućava postupno prepisivanje elemenata API-ja na Rust.

Izvor: opennet.ru

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster