Выпуск Rust 1.91

Опубликован релиз языка программирования Rust 1.91, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).

Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.

Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.

Основные новшества:

  • Улучшена поддержка 64-разрядных ARM-систем с ОС Windows. Целевая платформа “aarch64-pc-windows-msvc” переведена со второго на первый уровень поддержки. Обеспечен второй уровень поддержки для архитектур aarch64-pc-windows-gnullvm и x86_64-pc-windows-gnullvm. Первый уровень поддержки подразумевает формирование бинарных сборок, проведение досконального тестирования и предоставление наивысшей гарантии поддержки платформы – каждое изменение в компиляторе проверяется выполнением полного тестового набора. Второй уровень поддержки включает формирование бинарных сборок и гарантию сборки, но не гарантирует прохождение тестового набора. Третий уровень охватывает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
  • Добавлено lint-предупреждение “dangling_pointers_from_locals” для выявления возвращения функциями висячих raw-указателей (dangling raw pointer), указывающих на данные, хранящиеся в локальных переменных, определённых в вызванной функции. Подобные переменные удаляются после завершения функции, а raw-указатели на связанные с этими переменными данные, становятся висячими, т.е. указывающими на освобождённую память. Последующее разыменование подобного указателя приводит к неопределённому поведению. fn f() -> *const u8 { let x = 0; &x // warning: a dangling pointer will be produced because the local variable “x” will be dropped }
  • Добавлено lint-предупреждение “integer_to_ptr_transmutes”, информирующее о преобразовании целых чисел в указатели с помощью функции std::mem::transmute.
  • В пакетном менеджере Cargo стабилизирована поддержка параметра “build.build-dir”, определяющего каталог для хранения временных сборочных артефактов, создаваемых cargo и rustc на этапе сборки.
  • Для ABI sysv64, win64, efiapi и aapcs стабилизирована поддержка объявления функций с переменным числом аргументов в стиле Си.
  • Стабилизирована поддержка inline-ассемблера для архитектуры LoongArch32.
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
    • Path::file_prefix
    • AtomicPtr::fetch_ptr_add
    • AtomicPtr::fetch_ptr_sub
    • AtomicPtr::fetch_byte_add
    • AtomicPtr::fetch_byte_sub
    • AtomicPtr::fetch_or
    • AtomicPtr::fetch_and
    • AtomicPtr::fetch_xor
    • {integer}::strict_add
    • {integer}::strict_sub
    • {integer}::strict_mul
    • {integer}::strict_div
    • {integer}::strict_div_euclid
    • {integer}::strict_rem
    • {integer}::strict_rem_euclid
    • {integer}::strict_neg
    • {integer}::strict_shl
    • {integer}::strict_shr
    • {integer}::strict_pow
    • i{N}::strict_add_unsigned
    • i{N}::strict_sub_unsigned
    • i{N}::strict_abs
    • u{N}::strict_add_signed
    • u{N}::strict_sub_signed
    • PanicHookInfo::payload_as_str
    • core::iter::chain
    • u{N}::checked_signed_diff
    • core::array::repeat
    • PathBuf::add_extension
    • PathBuf::with_added_extension
    • Duration::from_mins
    • Duration::from_hours
    • impl PartialEq for PathBuf
    • impl PartialEq for PathBuf
    • impl PartialEq for Path
    • impl PartialEq for Path
    • impl PartialEq for String
    • impl PartialEq for String
    • impl PartialEq for str
    • impl PartialEq for str
    • Ipv4Addr::from_octets
    • Ipv6Addr::from_octets
    • Ipv6Addr::from_segments
    • impl Default for Pin> where Box: Default, T: ?Sized
    • impl Default for Pin> where Rc: Default, T: ?Sized
    • impl Default for Pin> where Arc: Default, T: ?Sized
    • Cell::as_array_of_cells
    • u{N}::carrying_add
    • u{N}::borrowing_sub
    • u{N}::carrying_mul
    • u{N}::carrying_mul_add
    • BTreeMap::extract_if
    • BTreeSet::extract_if
    • impl Debug for windows::ffi::EncodeWide<‘_>
    • str::ceil_char_boundary
    • str::floor_char_boundary
    • impl Sum for Saturating
    • impl Sum<&Self> for Saturating
    • impl Product for Saturating
    • impl Product<&Self> for Saturating
  • Признак “const” применён в функциях:
    • <[T; N]>::each_ref
    • <[T; N]>::each_mut
    • OsString::new
    • PathBuf::new
    • TypeId::of
    • ptr::with_exposed_provenance
    • ptr::with_exposed_provenance_mut
  • Компилятор обновлён до ветки LLVM 21.
Release. Ссылка here.