Випуск мови програмування Rust 1.58

Опубліковано реліз мови програмування загального призначення Rust 1.58, заснованого проектом Mozilla, але нині розвивається під заступництвом незалежної некомерційної організації Rust Foundation. Мова сфокусована на безпечній роботі з пам'яттю, забезпечує автоматичне керування пам'яттю та надає засоби для досягнення високого паралелізму виконання завдань, при цьому обходячись без використання збирача сміття та runtime (runtime зводиться до базової ініціалізації та супроводу стандартної бібліотеки).

Автоматичне управління пам'яттю в Rust позбавляє розробника помилок при маніпулюванні покажчиками і захищає від проблем, що виникають через низькорівневу роботу з пам'яттю, таких як звернення до області пам'яті після її звільнення, розіменування нульових покажчиків, вихід за межі буфера і т.п. Для поширення бібліотек, забезпечення збирання та управління залежностями проектом розвивається пакетний менеджер Cargo. Для розміщення бібліотеки підтримується репозиторій crates.io.

Основні нововведення:

  • У блоках форматування рядків, на додаток до раніше доступної можливості підстановки явно перерахованих після рядка змінних за номером та ім'ям, реалізовано можливість підстановки довільних ідентифікаторів через додавання до рядка виразів «{ідентифікатор}». Наприклад: // Раніше підтримувалися конструкції: println!(«Hello, {}!», get_person()); println!(«Hello, {0}!», get_person()); println!("Hello, {person}!", person = get_person()); //тепер можна вказувати let person = get_person(); println!(«Hello, {person}!»);

    Ідентифікатори також можна вказувати безпосередньо у параметрах форматування. let (width, precision) = get_format(); for (name, score) in get_scores() { println!(«{name}: {score:width$.precision$}»); }

    Нова підстановка працює у всіх макросах, що підтримують визначення формату рядка, крім макросу «panic!» у версіях мови Rust 2015 та 2018, в яких panic!(«{ident}») обробляється як звичайний рядок (в Rust 2021 підстановка спрацьовує).

  • Змінено поведінку структури std::process::Command на платформі Windows, яка при виконанні команд з міркувань безпеки більше не шукає файли, що виконуються в поточному каталозі. Поточний каталог виключений так як може бути використаний для організації виконання коду зловмисника у разі запуску програм у каталогах, що не заслуговують на довіру (CVE-2021-3013). Нова логіка визначення виконуваних файлів має на увазі пошук у каталогах Rust, у каталозі програми, системному каталозі Windows та каталогах, зазначених у змінній оточенні PATH.
  • У стандартній бібліотеці розширено число функцій, помічених «#[must_use]» для виведення попередження у разі ігнорування значення, що повертається, що допомагає виявити помилки, викликані припущенням, що функція змінить значення, а не поверне нове значення.
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи та реалізації типажів:
    • Metadata::is_symlink
    • Path::is_symlink
    • {integer}::saturating_div
    • Option::unwrap_unchecked
    • Result::unwrap_unchecked
    • Result::unwrap_err_unchecked
  • Ознака «const», що визначає можливість використання в будь-якому контексті замість констант, застосована у функціях:
    • Duration::new
    • Duration::checked_add
    • Duration::saturating_add
    • Duration::checked_sub
    • Duration::saturating_sub
    • Duration::checked_mul
    • Duration::saturating_mul
    • Duration::checked_div
  • Дозволено розіменування покажчиків *const T у контекстах const.
  • У пакетному менеджері Cargo до метаданих пакетів додано поле rust_version, а до команди «cargo install» додано опцію «—message-format».
  • У компіляторі реалізована підтримка механізму захисту CFI (Control Flow Integrity), який додає перед кожним непрямим викликом функції перевірки виявлення деяких форм невизначеної поведінки, які потенційно можуть призвести до порушення нормального порядку виконання (control flow) в результаті застосування експлоїтів, що змінюють вказівники на функції.
  • У компіляторі додано підтримку 5 і 6 версії формату coverage-порівнянь LLVM, що використовується для оцінки охоплення коду при тестуванні.
  • У компіляторі вимоги до мінімальної версії LLVM піднято до LLVM 12.
  • Реалізовано третій рівень підтримки для платформи x86_64-unknown-none. Третій рівень передбачає базову підтримку, але без автоматизованого тестування, публікації офіційних збірок та перевірки можливості складання коду.

Додатково можна відзначити публікацію компанією Microsoft випуску бібліотек Rust for Windows 0.30, які дозволяють використовувати мову Rust для розробки програм для Windows. У набір входять два crate-пакети (windows та windows-sys), через які можна звертатися до Win API у програмах на мові Rust. Код підтримки API генерується динамічно з метаданих з описом API, що дозволяє реалізувати підтримку не тільки вже існуючих викликів Win API, але й викликів, які з'являться в майбутньому. У новій версії додано підтримку цільової платформи UWP (Universal Windows Platform), реалізовано типажі Handle та Debug.

Джерело: opennet.ru

Додати коментар або відгук