Выпуск 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‹str› for PathBuf
    • impl PartialEq‹String› for PathBuf
    • impl PartialEq‹str› for Path
    • impl PartialEq‹String› for Path
    • impl PartialEq‹PathBuf› for String
    • impl PartialEq‹Path› for String
    • impl PartialEq‹PathBuf› for str
    • impl PartialEq‹Path› for str
    • Ipv4Addr::from_octets
    • Ipv6Addr::from_octets
    • Ipv6Addr::from_segments
    • impl‹T› Default for Pin‹Box‹T›› where Box‹T›: Default, T: ?Sized
    • impl‹T› Default for Pin‹Rc‹T›› where Rc‹T›: Default, T: ?Sized
    • impl‹T› Default for Pin‹Arc‹T›› where Arc‹T›: 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‹u{N}›
    • impl Sum‹&Self› for Saturating‹u{N}›
    • impl Product for Saturating‹u{N}›
    • impl Product‹&Self› for Saturating‹u{N}›
  • Признак «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.



Источник: http://www.opennet.ru/opennews/art.shtml? num=64149

© OpenNet