Wydanie języka programowania Rust 1.58

Opublikowano wydanie języka programowania ogólnego przeznaczenia Rust 1.58, założonego przez projekt Mozilla, ale obecnie rozwijanego pod auspicjami niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpieczeństwie pamięci, zapewnia automatyczne zarządzanie pamięcią i zapewnia środki do osiągnięcia dużej równoległości zadań bez użycia modułu zbierającego elementy bezużyteczne lub środowiska wykonawczego (czas działania jest zredukowany do podstawowej inicjalizacji i konserwacji biblioteki standardowej).

Automatyczne zarządzanie pamięcią Rusta eliminuje błędy podczas manipulowania wskaźnikami i chroni przed problemami wynikającymi z manipulacji pamięcią na niskim poziomie, takimi jak dostęp do obszaru pamięci po jego zwolnieniu, wyłuskiwanie wskaźników zerowych, przepełnienie bufora itp. Aby rozpowszechniać biblioteki, zapewniać montaż i zarządzać zależnościami, w ramach projektu opracowywany jest menedżer pakietów Cargo. Repozytorium crates.io jest obsługiwane w przypadku bibliotek hostujących.

Główne innowacje:

  • W blokach formatowania linii oprócz dostępnej wcześniej możliwości podstawiania zmiennych jawnie wymienionych po linii numerem i nazwą, zaimplementowano możliwość podstawiania dowolnych identyfikatorów poprzez dodanie do linii wyrażenia „{identifier}”. Na przykład: // Wcześniej obsługiwane konstrukcje: println!("Witam, {}!", get_person()); println!("Witam, {0}!", get_person()); println!("Witam, {osoba}!", osoba = get_person()); // teraz możesz określić let person = get_person(); println!("Witam, {osoba}!");

    Identyfikatory można także określić bezpośrednio w opcjach formatowania. niech (szerokość, precyzja) = get_format(); for (nazwa, wynik) w get_scores() { println!("{name}: {score:width$.precision$}"); }

    Nowe podstawienie działa we wszystkich makrach obsługujących definicję formatu ciągu znaków, z wyjątkiem makra „panika!”. w wersjach języka Rust 2015 i 2018, w których panika!("{ident}") jest traktowana jak zwykły ciąg znaków (w Rust 2021 działa podstawienie).

  • Zachowanie struktury std::process::Command na platformie Windows zostało zmienione tak, że podczas wykonywania poleceń ze względów bezpieczeństwa nie szuka już plików wykonywalnych w bieżącym katalogu. Bieżący katalog jest wykluczony, ponieważ mógłby zostać użyty do wykonania złośliwego kodu, jeśli programy zostaną uruchomione w niezaufanych katalogach (CVE-2021-3013). Nowa logika wykrywania plików wykonywalnych obejmuje przeszukiwanie katalogów Rusta, katalogu aplikacji, katalogu systemowego Windows i katalogów określonych w zmiennej środowiskowej PATH.
  • Biblioteka standardowa rozszerzyła liczbę funkcji oznaczonych „#[must_use]”, aby generować ostrzeżenie w przypadku zignorowania zwracanej wartości, co pomaga zidentyfikować błędy spowodowane założeniem, że funkcja zmieni wartości, a nie zwróci nową wartość.
  • Nowa część API została przeniesiona do kategorii stabilnej, w tym metody i implementacje cech zostały ustabilizowane:
    • Metadane::is_symlink
    • Ścieżka::is_symlink
    • {liczba całkowita}::saturating_div
    • Opcja::unwrap_unchecked
    • Wynik::unwrap_unchecked
    • Wynik::unwrap_err_unchecked
  • Atrybut „const”, który określa możliwość użycia go w dowolnym kontekście zamiast stałych, jest używany w funkcjach:
    • Czas trwania::nowy
    • Czas trwania::checked_add
    • Czas trwania::saturating_add
    • Czas trwania::checked_sub
    • Czas trwania::nasycenie_sub
    • Czas trwania::checked_mul
    • Czas trwania::saturating_mul
    • Czas trwania::checked_div
  • Zezwolono na wyłuskiwanie wskaźników „*const T” w kontekstach „const”.
  • W menedżerze pakietów Cargo do metadanych pakietu dodano pole rust_version, a do polecenia „cargo install” dodano opcję „--message-format”.
  • Kompilator implementuje obsługę mechanizmu zabezpieczającego CFI (Control Flow Integrity), który dodaje kontrole przed każdym pośrednim wywołaniem w celu wykrycia pewnych form niezdefiniowanego zachowania, które może potencjalnie prowadzić do naruszenia normalnej kolejności wykonywania (przepływu kontroli) w wyniku wykorzystanie exploitów zmieniających wskaźniki przechowywane w pamięci funkcji.
  • Kompilator dodał obsługę wersji 5 i 6 formatu porównania pokrycia LLVM, używanego do oceny pokrycia kodu podczas testowania.
  • W kompilatorze wymagania dotyczące minimalnej wersji LLVM zostają podniesione do LLVM 12.
  • Zaimplementowano trzeci poziom wsparcia dla platformy x86_64-unknown-none. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatycznych testów, publikowania oficjalnych kompilacji i sprawdzania, czy kod da się zbudować.

Dodatkowo możemy odnotować publikację przez Microsoft wydania bibliotek Rust dla Windows 0.30, które pozwalają używać języka Rust do tworzenia aplikacji dla systemu operacyjnego Windows. W zestawie znajdują się dwa pakiety skrzyniowe (windows i Windows-sys), poprzez które można uzyskać dostęp do API Win w programach Rust. Kod obsługi API generowany jest dynamicznie z metadanych opisujących API, co pozwala na realizację obsługi nie tylko istniejących wywołań Win API, ale także tych, które pojawią się w przyszłości. Nowa wersja dodaje obsługę platformy docelowej UWP (Universal Windows Platform) oraz implementuje typy Handle i Debug.

Źródło: opennet.ru

Dodaj komentarz