Bylo zveřejněno vydání programovacího jazyka Rust 1.96, které bylo původně založeno projektem Mozilla, ale nyní je rozvíjeno pod záštitou nezávislé neziskové organizace Rust Foundation. Jazyk se zaměřuje na bezpečné využití paměti a poskytuje prostředky pro dosažení vysokého paralelismu vykonávání úloh, přičemž se obejde bez použití garbage collectoru a runtime (runtime se omezuje na základní inicializaci a správu standardní knihovny).
Metody manipulace s pamětí v Rustu se zaměřují na eliminaci chyb při manipulaci s ukazateli a poskytují ochranu proti problémům vyplývajícím z nízkoúrovňové práce s pamětí, jako je přístup k uvolněné oblasti paměti, dereference nulových ukazatelů, přetečení bufferu atd. Pro distribuci knihoven, zajištění sestavení a správu závislostí se vyvíjí balíčkový manažer Cargo. Pro ukládání knihoven je podporován repozitář crates.io.
Bezpečné manipulace s pamětí jsou v Rustu zajištěny během kompilace prostřednictvím kontroly referencí, sledování vlastnictví objektů, zohlednění doby života objektů (viditelnosti) a hodnocení správnosti přístupu k paměti při vykonávání kódu. Rust také poskytuje prostředky pro ochranu proti přetečení celých čísel, vyžaduje povinnou inicializaci hodnot proměnných před použitím, lépe zpracovává chyby ve standardní knihovně, aplikuje koncept neměnnosti (immutable) referencí a proměnných ve výchozím nastavení a nabízí silnou statickou typizaci pro minimalizaci logických chyb.
Hlavní novinky:
- Byl přidán modul range s implementací nových typů, které se vyvíjejí na místo zastaralých typů Range, RangeInclusive, RangeToInclusive a RangeFrom, a umožňují uchovávat rozsahy ve Copy-strukturách. Typ Range definuje rozsahy omezené minimální a maximální povolenou hodnotou (ale nenahrazující ji), typ RangeFrom určuje čísla začínající na dané hodnotě, a typ RangeInclusive — hodnoty v daném rozsahu s oběma jeho hranicemi. V budoucích verzích navíc přibudou typy RangeFull a RangeTo, stará implementace bude přesunuta do core::range::legacy::*, a syntaxe „N..M“ bude převedena na nový variant typů.
Nové typy se liší tím, že místo typáže Iterator implementují typáž IntoIterator, tedy místo zabudovaného iterátoru definují, jak přetvořit typ na iterátor. Tento přístup umožňuje použít u nových typů operaci kopírování (typáž Copy, která ukazuje, že hodnoty typu lze duplikovat jednoduchým kopírováním), což dříve nebylo možné kvůli nekompatibilitě s typy se zabudovanými iterátory.
Například nové typy umožňují uchovávat hranice řezu ve struktuře, která se kompletně kopíruje bez odděleného uchování počáteční a koncové hodnoty:use core::range::Range;
#[derive(Clone, Copy)]
pub struct Span(Range);impl Span {
pub fn of(self, s: &str) -> &str {
&s[self.0]
}
} - Byly přidány makra „assert_matches!“ a „debug_assert_matches!“, které kontrolují shodu hodnoty se zadaným vzorem a program ukončují při nesrovnalosti. Nová makra se od výrazů „assert!(matches!(..))“ a „debug_assert!(matches!(..))“ liší tím, že poskytují ladicí informace o hodnotách, které způsobily chybu. Aby se předešlo kolizím s externími makry dodávanými se stejnými názvy, nová makra vyžadují explicitní import knihovny „core::assert_matches“.
use core::assert_matches;
fn get_random_number() -> u32 {
4
}fn main() {
assert_matches!(get_random_number(), 1..=6);
} - Při sestavování pro cílovou platformu WebAssembly byla zastavena předání linkeru volby „—allow-undefined“, která povolovala propojování při přítomnosti nedefinovaných symbolů, které se přetvářely na import z modulu „env“. Při sestavování pro WebAssembly musí být všechny symboly související s propojováním nyní ve výchozím nastavení definovány. Pro navrácení starého chování lze použít proměnnou prostředí „RUSTFLAGS=-Clink-arg=—allow-undefined“ nebo výrazu ‘#[link(wasm_import_module = „env“)]’ v kódu.
- Nová sada API byla převedena do stabilního stavu, včetně stabilizovaných metod a implementací typů:
- assert_matches!
- debug_assert_matches!
- From for AssertUnwindSafe
- From for LazyCell
- From for LazyLock
- core::range::RangeToInclusive
- core::range::RangeToInclusiveIter
- core::range::RangeFrom
- core::range::RangeFromIter
- core::range::Range
- core::range::RangeIter
- V balíčkovém správce Cargo byla odstraněna zranitelnost CVE-2026-5223, která může být využita k přepsání zdrojového kódu jiného crate-balíčku v lokálním cache balíčků ze stejného repozitáře prostřednictvím manipulace se symbolickými odkazy uvnitř crate balíčků. Zranitelnost se projevuje pouze při práci s externími repozitáři balíčků a netýká se uživatelů repozitáře crates.io, protože nahrávání balíčků se symbolickými odkazy je v crates.io zakázáno.
Dále lze zmínit publikaci (PDF) výsledků analýzy vhodnosti jazyka Rust pro vývoj firmwaru pro mikrořadiče a vestavěné systémy s omezenými zdroji.
Studie byla prováděna společností STMicroelectronics za účasti několika evropských univerzit. Dvě izolované týmy vývojářů měly úkol realizovat stejný firmware pro mikrořadiče STM32U585AI s jádrem Arm Cortex-M33. První tým vytvářel firmware v C, zatímco druhý v Rust.
Testování provedené práce neodhalilo významné výhody používání jazyka C oproti Rustu při vývoji firmwaru pro mikrokontroléry, pokud jde o spotřebu paměti a výkon. Navíc zapojení system runtime napsaného v Rustu z otevřeného projektu Ariel OS umožnilo dosáhnout nižší spotřeby paměti v projektu v Rustu než v implementaci v jazyce C, která využívala tradiční zásobník pro vývoj firmwaru založeného na knihovně newlib.
Velikost výsledného firmwaru činila 84100 bajtů v projektu Rust a 76744 bajtů v projektu C (o 10% méně), ale spotřeba operační paměti v firmwaru na Rust byla výrazně níže — 24640 bajtů proti 42608 bajtům. Pokud jde o výkon, při testování počátečních prototypů, které byly vyvinuty během 6 týdnů, implementace v Rustu dvakrát převyšovala implementaci v C, ale obě realizace značně zaostávaly za vypočítaným maximálním výkonem. Po 4 týdnech věnovaných optimalizaci dosáhly obě realizace přibližně stejných výsledků blízkých teoretickému maximu.

Zdroj: opennet.ru
