Методы работы с памятью в 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_addAtomicPtr::fetch_ptr_subAtomicPtr::fetch_byte_addAtomicPtr::fetch_byte_subAtomicPtr::fetch_orAtomicPtr::fetch_andAtomicPtr::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_powi{N}::strict_add_unsignedi{N}::strict_sub_unsignedi{N}::strict_absu{N}::strict_add_signedu{N}::strict_sub_signedPanicHookInfo::payload_as_strcore::iter::chainu{N}::checked_signed_diffcore::array::repeatPathBuf::add_extensionPathBuf::with_added_extensionDuration::from_minsDuration::from_hoursimpl PartialEq‹str› for PathBufimpl PartialEq‹String› for PathBufimpl PartialEq‹str› for Pathimpl PartialEq‹String› for Pathimpl PartialEq‹PathBuf› for Stringimpl PartialEq‹Path› for Stringimpl PartialEq‹PathBuf› for strimpl PartialEq‹Path› for strIpv4Addr::from_octetsIpv6Addr::from_octetsIpv6Addr::from_segmentsimpl‹T› Default for Pin‹Box‹T›› where Box‹T›: Default, T: ?Sizedimpl‹T› Default for Pin‹Rc‹T›› where Rc‹T›: Default, T: ?Sizedimpl‹T› Default for Pin‹Arc‹T›› where Arc‹T›: Default, T: ?SizedCell::as_array_of_cellsu{N}::carrying_addu{N}::borrowing_subu{N}::carrying_mulu{N}::carrying_mul_addBTreeMap::extract_ifBTreeSet::extract_ifimpl Debug for windows::ffi::EncodeWide‹'_›str::ceil_char_boundarystr::floor_char_boundaryimpl 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» применён в функциях:
- Компилятор обновлён до ветки LLVM 21.
Источник: http://www.opennet.ru/opennews/art.shtml?num=64149
