Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные новшества:
- Добавлена возможность указания нескольких выражений «let» внутри условных блоков «if» и «while» с использованием для их объединения оператора «&&» (логическое И). Выражения «let» могут комбинироваться с булевыми условными выражениями. Переменные, объявленные в let-выражениях, можно использовать в последующих условных выражениях, а также внутри блоков «if» и «while».
if let Channel::Stable(v) = release_info() && let Semver { major, minor, .. } = v && major == 1 && minor == 88 {
- Добавлена поддержка написания «голых» функций, помечаемых атрибутом «#[unsafe(naked)]» и содержащих внутри один вызов «naked_asm!». У созданных подобным образом функций отсутствует эпилог и пролог, сгенерированный компилятором, что позволяет разработчику полностью контролировать служебный ассемблерный код, прикрепляемый к функции («голая» функция содержит только ассемблерные инструкции, указанные разработчиком и не включает специальные обработчики аргументов и возвращаемых значений, добавляемые компилятором).
«Голые» функции рассматриваются как более удобная альтернатива функциям, определяемым в блоке «global_asm!».#[unsafe(naked)] pub unsafe extern "sysv64" fn wrapping_add(a: u64, b: u64) -> u64 { core::arch::naked_asm!( "add rax, rdi, rsi", "ret" ); }
- В язык предикатов, применяемый в атрибутах условной компиляции «cfg» и «cfg_attr» (позволяют включать или отключать части кода в зависимости от заданных условий), добавлена поддержка
булевых литералов «true» и «false», которые отождествлены с конфигурациями, которые всегда включены или всегда отключены. Данные литералы также можно использовать в макросе «cfg!» и таблицах «[target]» в манифестах и конфигурациях для Cargo. Выражения cfg(true) и cfg(false) могут применяться вместо cfg(all()) и cfg(any()) для более явного выражения своих намерений. - В пакетном менеджере Cargo включён автоматический запуск сборщика мусора для очистки кэша в домашнем каталоге пользователя. Ранее сохраняемые в кэше пакеты с загружаемыми зависимостями не очищались, что приводило к постоянному росту потребления дискового пространства. Включённый механизм сборки мусора будет автоматически удалять загруженные извне crate-файлы, к которым не было обращений более 3 месяцев, и локально установленные crate-файлы, к которым не обращались более месяца. Очиска кэша не запускается при использовании в crage опций «—offline» или «—frozen».
- В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
Cell::update
impl Default for *const T
impl Default for *mut T
mod ffi::c_str
HashMap::extract_if
HashSet::extract_if
hint::select_unpredictable
proc_macro::Span::line
proc_macro::Span::column
proc_macro::Span::start
proc_macro::Span::end
proc_macro::Span::file
proc_macro::Span::local_file
‹[T]›::as_chunks
‹[T]›::as_rchunks
‹[T]›::as_chunks_unchecked
‹[T]›::as_chunks_mut
‹[T]›::as_rchunks_mut
‹[T]›::as_chunks_unchecked_mut
- Признак «const» применён в функциях:
- Удалён первый уровень поддержки целевой платформы i686-pc-windows-gnu.
Дополнительно можно отметить связанные с Rust события:
- Проект Munal OS развивает экспериментальную операционную систему, написанную на Rust и основанную на концепции unikernel. В Munal OS не применяется вытесняющая многозадачность, маппинг страниц памяти и виртуальное адресное пространство (используется раскладка памяти от UEFI). Ядро и приложения выполняются в одном адресном пространстве с применением модели безопасности на базе sandbox-изоляции WASM (в состав входит движок wasmi для запуска приложений в форме байткода WebAssembly).
Операционная система оснащена графическим интерфейсом и поддерживает управление через клавиатуру и мышь. Для разработки графических приложений используется собственный тулкит с библиотекой виджетов. Для сетевого взаимодействия предлагаются TCP-стек и драйвер сетевого устройства. Среди доступных для Munal OS приложений: web-браузер с базовой поддержкой HTML и HTTPS, текстовый редактор и терминал для выполнения кода на Python. Код открыт под лицензией MIT.
- Состоялся выпуск ядра Asterinas 0.15.2, написанного на Rust и предоставляющего ABI, совместимый с ядром Linux. Ядро поддерживает архитектуры x86-64 и RISC-V, и реализует 206 из 368 системных вызовов Linux. В развитии ядра принимают участи 45 разработчиков, в основном из различных китайских университетов. Ядро построено с использованием архитектуры «framekernel», в которой компоненты ядра размещаются в общем адресном пространстве, а безопасность достигается на уровне логического разделения безопасного кода и кода, в котором не исключено возникновение проблем с безопасностью. Все системные вызовы, файловые системы и драйверы реализуются на уровне OS Services и не могут включать unsafe-блоки. Код распространяется под лицензией MPL 2.0.
- Для ядра Linux подготовлена утилита rsched, позволяющая анализировать статистику о работе планировщика задач. На практике утилита позволяет оценивать решения планировщика, связанные с предоставлением ресурсов процессам, а также отслеживать возникающие при планировании задержки. Для сбора данных в ядре используется подсистема BPF, а работающий в пространстве пользователя инструментарий написан на Rust. Автором утилиты является Крис Мейсон (Chris Mason), создатель и главный архитектор файловой системы Btrfs.
- Компания Collabora сообщила о разработке варианта инструментария Coccinelle для языка Rust. Coccinelle изначально предназначен для автоматизации поиска и преобразования кода на языке Си в ядре Linux. Преобразования задаются в форме правил, напоминающих абстрагированные патчи, не привязанные к конкретной позиции в коде.
- Разработчики GNOME представили библиотеку для загрузки изображений glycin, написанную на языке Rust и обеспечивающую декодирование изображений с применением sandbox-изоляции. Поддерживается отдача декодированного контента через gdk::Textures и извлечение метаданных.
Предоставляются обвязки для использования glycin в GTK4, а также бэкенд для задействования glycin в библиотеке GdkPixbuf, применяемой в GNOME для загрузки изображений. Glycin уже задействован в просмотрщике изображений Loupe, предлагаемом в GNOME по умолчанию. При этом бэкенд для GdkPixbuf даёт возможность использовать glycin в GNOME Shell, генераторах миниатюр и произвольных приложениях GNOME, без внесения изменений в эти программы.
Источник: http://www.opennet.ru/opennews/art.shtml?num=63485