Udgivet er version 1.98 af programmeringssproget Rust, der er baseret på et projekt fra Mozilla, men som nu videreføres under beskyttelse af den uafhængige, non-profit organisation Rust Foundation. Sproget fokuserer på sikker håndtering af hukommelse og giver værktøjer til at opnå høj parallel udførelse af opgaver, uden at bruge en garbage collector og runtime (runtime reduceres til grundlæggende initialisering og vedligeholdelse af standardbiblioteket).
Metoderne til hukommelseshåndtering i Rust har til formål at eliminere fejl i forbindelse med manipulation af pegepunkter og beskytte mod problemer der opstår ved lavniveau hukommelseshåndtering, såsom adgang til hukommelse efter den er frigivet, de-referering af nulpegepunkter, overskridelse af buffergrænser osv. For distribution af biblioteker, sikring af bygning og håndtering af projektafhængigheder, udvikles pakkehåndteringssystemet Cargo. For placering af biblioteker understøttes et repository på crates.io.
Sikker håndtering af hukommelse sikres i Rust under kompilering ved referencekontrol, sporing af ejerskab af objekter, hensyntagen til livstid af objekter (synlighed) og vurdering af korrekt adgang til hukommelse under kodeudførelse. Rust tilbyder også midler til beskyttelse mod heltals-overløb, kræver obligatorisk initialisering af variabelværdier før brug, håndterer fejl bedre i standardbiblioteket, anvender konceptet med uforanderlige (immutable) referencer og variabler som standard og tilbyder stærk statisk typisering for at minimere logiske fejl.
Hovednyhederne:
- For flydende punkt typerne f32 og f64 er der implementeret algebraiske metoder til addition, subtraktion, multiplikation, division og beregning af resten, der implementerer optimering, der ligner muligheden "-ffast-math" i C/C++ compilerne. Sådanne metoder tillader ændring af rækkefølgen af operationer, når det er nødvendigt for optimeringer, såsom vektorisering af loop. For eksempel ved beregning af "a + b + c + d" vil compileren ved brug af almindelig addition altid udføre beregningen i én rækkefølge "((a + b) + c) + d", mens ved brug af metoden algebraic_add kan udtrykket grupperes som "(a + b) + (c + d)" og udføre "(a + b)" og "(c + d)" parallelt ved hjælp af SIMD instruktioner. Prisen for anvendelsen af algebraiske metoder er, at resultaterne kan være ikke-deterministiske, og resultaterne kan variere inden for en fejlmargin.
- For alle primitive heltalstyper er der implementeret en indbygget metode "format_into" til konvertering af tal til strenge, som kan anvendes i stedet for itoa-pakken. Som parameter gives en buffer NumBuffer, hvis størrelse er garanteret tilstrækkelig til at skrive enhver værdi af den anvendte type i decimalform. Som output returneres en formateret streng &str, hvis livstid er knyttet til bufferen.
- Interaktionen mellem ManuallyDrop-wrapping og smart pointer Box fører nu ikke til udefineret adfærd.
- En ny batch af API'er er blevet klassificeret som stabile, herunder stabilisering af metoder og implementeringer af traits:
- str::substr_range
- [T]::subslice_range
- core::fmt::NumBuffer
- ::format_into
- Send/Sync for std::process::CommandArgs
- {fN}::algebraic_add
- {fN}::algebraic_sub
- {fN}::algebraic_mul
- {fN}::algebraic_div
- {fN}::algebraic_rem
- NonZero::from_str_radix
- String::from_utf16le
- String::from_utf16le_lossy
- String::from_utf16be
- String::from_utf16be_lossy
- [T]::strip_circumfix
- str::strip_circumfix
- Atomic::from_mut
- Atomic::get_mut_slice
- Atomic::from_mut_slice
- std::range::legacy
- De målrettede platforme thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf og thumbv8r-none-eabihf er blevet oversat til det andet supportniveau, som indebærer garantisamling, men uden garantier ved testkvoten.
- Tilføjet understøttelse af platforme powerpc64-unknown-linux-gnuelfv2 og aarch64-unknown-linux-pauthtest, som har fået dit tredje supportniveau. Det tredje niveau dækker basisunderstøttelse, men uden automatiseret testning, offentliggørelse af officielle versioner og kontrol over muligheden for at kompilere koden.
Derudover kan det nævnes, at det populære crate-pakke arrayref er blevet kompromitteret, med mere end 53 millioner downloads de sidste 90 dage og anvendt som afhængighed af 403 pakker. Angribere udgav nye pakker proc-macro1, proc-macro-en, aovine, arone, aronenao og tinymember i crates.io-repositoriet, der indeholdt ondsindet kode. Efter dette blev nye versioner af pakkerne arrayref 0.3.10, internment 0.8.7 og append-only-vec 0.1.9 offentliggjort, som indeholdt den ondsindede pakke proc-macro1 som afhængighed. Den ondsindede version af pakken arrayref blev udgivet den 20. august kl. 10:15 (MSK) og eksisterede indtil kl. 11:41, hvorefter den blev fjernet af crates.io-administratorer.
Det er endnu ikke lykkedes at kontakte udvikleren af arrayref for at få afklaret situationen, men det antages, at hans legitimationsoplysninger blev opfanget af en angriber. I pakken proc-macro1 var den ondsindede ændring til stede i build-scriptet og gjorde det muligt at downloade en udførelsesfil udefra. server. Den downloaded fil blev gemt i Unix-systemer som /tmp/rust-setup, mens det i Windows blev gemt som %TEMP%\rust-setup.ps1 eller %TEMP%\rust-setup-launch.vbs.
Kilde: opennet.ru
