Avaldati üldotstarbelise programmeerimiskeele Rust 1.81 väljaanne, mis põhineb Mozilla projektist, kuid mida arendatakse praegu sõltumatu mittetulundusühingu Rust Foundationi toetusel. Keel on keskendunud mälu turvalisele kasutamisele ja pakub võimalusi kõrge tööde paralleelsuse saavutamiseks, vältides samas prügikoristajat ja runtime'i (runtime piirdub baasi initsialiseerimise ja standardraamatukogu hooldamisega).
Rustis olevad mäluhaldusmeetodid vabastavad arendajad probleemidest, mis on seotud osutitega, ning kaitsevad madala taseme mälutöötlusest tulenevate probleemide, nagu vabanenud mälu alale juurdepääs, nullosutite de-referentseerimine, mälupiiride ületamine jne. Raamatukogude levitamiseks, projekti koostamise ja sõltuvuste haldamiseks arendatakse pakihaldurit Cargo. Raamatukogude paigutamiseks toetatakse repo crates.io.
Rust tagab turvalise mälutöötluse kompilatsiooni ajal, kontrollides viiteid, jälgides objektide omandit, arvestades objektide elutsüklit (nähtavust) ja hinnates mälule juurdepääsu õigsust koodi käitamise ajal. Rust pakub ka meetmeid enamike täisarvude ületamiste vältimiseks, nõuab muutujate väärtuste algväärtustamist enne kasutamist, käsitleb vigasid paremini oma standardraamatukogus, rakendab immutamatuse (immutable) kontseptsiooni viidetes ja muutujates vaikimisi ning pakub tugevat staatilist tüüpimist loogiliste vigade minimeerimiseks.
Põhilised uuendused:
- Stabiliseeriti tüüp core::error::Error, mis määratleb väljundite vigade kirjeldused. Muudatus võimaldab kasutada ühte tüüpi Error erinevates teekides sõltumata keskkonnast, sealhulgas teekides, mis ei ole seotud standardraamatukoguga, mis kasutavad atribuuti "#![no_std]".
- Standardses ja ebastabiilsed järjestusfunktsioonid on tõlgitud uute algoritmide kasutamisele, mis näitavad kõrgemat töötlemiskiirus ja lühemat kompileerimisaega. Uute järjestusalgoritmide rakenduses on tagatud, et vale määratlemise korral Ord tüüpidest väljastatakse viga (panic) asemel juhuslikult rühmitatud andmete kuvamine.
- Linteris on rakendatud uus kontrollimise tase 'expect' ('#[expect(lint)]'), mis võimaldab kinnitada kontrollimise täitmist ja anda hoiatuse, kui kontroll ei toimu (või seadistuste tõttu on kontroll keelatud). Näiteks, kui kirjeldusbaas on muudetud, et kasutada undocumented_unsafe_blocks kontrollimist Clippy kaudu, saab märkida '#[expect(clippy::undocumented_unsafe_blocks)]', et veenduda, et kõik unsafe-blokid dokumenteeritakse ülemineku käigus. Clippy-s on rakendatud ka kontrollimised clippy::allow_attributes ja clippy::allow_attributes_without_reason, mis lihtsustavad atribuutide '#[allow]' asendamist '#[expect(lint)]'.
- Dokumentatsiooni võimalus tasemete kontrollimise (lint) põhjuse jaoks on antud, andes uutele arendajatele teavet nende kontrollide lisamise põhjuste kohta, mis on kompilaatori teatisena esitatud. Näiteks: #![deny(clippy::float_arithmetic, reason = «no hardware float support»)]
- Stabiilsete versioonide hulka on lisatud uus komplekt API-sid, sealhulgas on stabiliseeritud meetodid ja tüüpide rakendused:
- 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
Konstantse märgendiga `const`, mis määrab võimaluse kasutada konstandina igas kontekstis, on rakendatud funktsioonides:
- char::from_u32_unchecked (funktsioon)
- char::from_u32_unchecked (meetod)
- CStr::count_bytes
- CStr::from_ptr
Tüüp std::panic::PanicInfo on ümber nimetatud std::panic::PanicHookInfo-ks (vananenud nime kasutamine on säilinud, kuid järgmises versioonis viib see hoiatuse esitamiseni). Samal ajal jääb core::panic::PanicInfo selliseks, nagu on, kuid areneb eraldi tüübina. Tüüpide jaotamine võimaldab rakendada neis erinevaid meetodeid, mis on spetsiifilised snd ja no_std konteksti täitmiseks.
- Üleminek ABI C-unwind ('extern «C-unwind»') on lõpule viidud, mis erineb ilma '-unwind' sufiksita ABI-st ('extern «C»') ohutu käitumise (safe) säilitamise osas, kui 'lahtiverimise' (unwinding) protsess, mille algatas programmis esinenud viga või C++-stiilis erandi genereerimine, ületab ABI piiri (näiteks, kui erand, mis tekkis ühe programmeerimiskeele koodis, mõjutab lahtiverimisel hunnikut, mis on seotud teise programmeerimiskeele koodiga). Alates Rust 1.81 versioonist on ABI-s 'extern «C»' aktiveeritud vigade käsitlemine lahtiverimisel, mida ei ole kinni peetud.
- Kolmas taseme tugi on rakendatud i686-unknown-redox, xtensa-esp32-none-elf, xtensa-esp32s2-none-elf, xtensa-esp32s3-none-elf, xtensa-esp32-espidf, xtensa-esp32s2-espidf, xtensa-esp32s3-espidf platvormidele. Kolmas tase tähendab põhitoetust, kuid ilma automatiseeritud testimise, ametlike kogude avaldamise ja koodikogumise kontrollita.
- Teine tase toetab sihtplatvormide loongarch64-unknown-linux-musl ja arm64ec-pc-windows-msvc. Teine tase toetust tähendab kokku kogumise garantiid.
- Linuxi süsteemide jaoks, mis on LoongArch platvormil, on saadaval täielik tööriistakomplekt ja profiilide analüüsija.
- Leitud haavatavus (CVE-2024-43402) std::process::Command'is, mis esineb ainult Windowsi platvormil ja kõrvaldab eelnevalt parandatud haavatavuse BatBadBut, mis on seotud erimerkkide töötlemisega Command::arg ja Command::args'i kutsumisel, mis on ette nähtud argumentide otse edastamiseks protsessile, ilma neid käsurea tõlgendaja kaudu töötlemata. Tegelikult käivitati bat- ja cmd-skripte käivitades cmd.exe protsess, millel on oma argumentide eraldamise loogika. Kaitse ümberkäimine põhineb sellel, et Windows eemaldab teede alguses asuvad tühikud ja punktid, st fail, millel on laiend „.bat. .“, töödeldakse kui „.bat“.
Lisaks võib märkida, et Wedson Almeida Filho lahkus Rust for Linux projekti hooldaja ametist, mis tegeleb Rusti arendustööriistade integreerimisega Linuxi tuuma. Wedsoni lahkumise järel on projektil siiski kaks hooldajat — Miguel Ojeda, Rust-for-Linux projekti autor ja peamine arendaja, ning Alex Gaynor, endine Python Software Foundationi direktor, kes on nüüd Rusti toetamisele keskendunud. Lahkunud hooldaja, kes liitus projektiga neli aastat tagasi, on Microsofti töötaja ja eksperimentaalse EXT2 failisüsteemi draiveri autor, mis on kirjutatud Rustis. Hiljuti oli Almeida töö keskendunud failisüsteemide arendustööriistade loomisele Rustis. Sel aastal tegi Almeida Rust-for-Linuxi hoidlas 17 commit'i (võrdluseks, Miguel Ojeda lisas 53 commit'i).
Lahenduseks tuuakse välja tugevuse ja entusiasmi puudumine, mis kunagi aitas tegeleda mõne mittetehnilise nonsensiga. Almeida arvates peavad arendajad kulutama liiga palju energiat tühistele vaidlustele, mis varjutavad olulisemat globaalset eesmärki. Almeida usub jätkuvalt, et tulevik on tuumades, mis kasutavad mälu ohutut töötlust võimaldavaid keeli, ja kui Linuxi arendajate kogukond seda ei mõista, siis tõrjub Linux mõne muu tuuma, nagu kunagi juhtus Unixiga.
Rust-for-Linux projekti pooldajad seisavad silmitsi vanade kogenud tuumaarendajate vastupanuga, kes ei näe vajadust uue keele õppimiseks. Oma tagasiastumisvees toob Almeida näiteks arutelu, mis toimus Almeida ja Kent Overstreeti esinemise ajal konverentsil "Linux Storage, Filesystem, Memory-Management, and BPF Summit" ning mille teemaks oli Rusti kasutamine failisüsteemide arendamisel. Rusti juurutamise tegevust kritiseeris Ted Ts’o, ext2/ext3/ext4 failisüsteemide autor, kes võrdles Rust-for-Linux algatust üritusega sundida kõiki omaks võtma Rusti usku.
Almeida kavatsuse vastuseks luua C keeles kirjutatud failisüsteemide liideste ümberringkond Rusti koodi jaoks on Ted Tso märkis, et selline ümberringkond toob paratamatult kaasa probleeme, kuna iga C-liidese muudatus ja refaktoreerimine nõuab Rusti ümberringkonna muutmist. Ta ei taha võtta endale ülemäärast vastutust Rusti koodis tekkivate probleemide parandamise ja Rusti ümberringkonna oleku jälgimise eest. C kood areneb pidevalt ja kui selle muudatus rikub Rusti ümberringkonna funktsionaalsust, toob see kaasa ka kõikide sellele ümberringkonnale toetuvate failisüsteemide töö tõrke.
Ted peab samuti, et Rusti täiendused jäävad lähitulevikus teisejärguliseks ning sidumiste probleemid on peavalu ainult Rust-for-Linux arendajatele, mitte tuumafailisüsteemi arendajate kogukonnale. On mainitud, et mitte kõik arendajad ei kavatse Rusti õppida ja seetõttu, pärast koodimuudatuste rakendamist, saavad nad uuendada ainult C-s sõltuvat koodi, aga ei saa parandada Rust-sidumisi, kuna nad ei tunne Rusti. Arutelusse liitus ka James Bottomley, kes toetab SCSI alam-süsteemi, öeldes, et mida rohkem semantikat sidumistes kodeeritakse, seda haavatavamaks need muutuvad kooskõlastuse tagamise osas.
Samas on Google, kes eelmisel aastal ümber kirjutas Rusti keeles pvmfm-firmavara, mida kasutatakse virtuaalmasinatel, mis kasutatakse Android platvormil, jagati kogemusi, kuidas järk-järgult integreerida Rusti keelt olemasolevatesse püsivaramutesse, mis on algselt kirjutatud C- või C++-keeles. Näidatakse, kuidas oluliselt suurendada püsivaramute turvalisust, luues identse funktsionaalsusega asenduselemente, mis on kirjutatud Rusti keeles. Rusti rakendamisel tuleb keskenduda uue koodeksi ja kriitilise turvalisuse funktsioonide (nt väliste andmete töötlemise kood, mis saadakse usaldamatest allikatest) Rusti kasutamisele. Rusti ja C-koodi integreerimiseks soovitatakse kasutada shim-kihti, mis tõlgib kutsed Rusti ja C API-de vahel (C API eksporditakse Rusti koodis kasutamiseks ja vastupidi), võimaldades järk-järgult kirjutada API elemente Rusti keeles.
Allikas: opennet.ru
