Автоматическое управление памятью в Rust избавляет разработчика от ошибок при манипулировании указателями и защищает от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Основные новшества:
- Для массивов реализован типаж IntoIterator, позволяющий организовать перебор элементов массива по значениям:
for i in [1, 2, 3] { .. }Также появилась возможность передачи массивов в методы, принимающие итераторы, например:
let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }Ранее IntoIterator был реализован только для ссылок на массивы, т.е. для перебора по значениям требовалось использование ссылок («&[1, 2, 3]») или «[1, 2, 3].iter()». Реализации IntoIterator для массивов мешали проблемы с совместимостью, вызванные ранее добавленным в компилятор преобразованием метода array.into_iter() в (&array).into_iter(). Указанные проблемы удалось решить обходным путём — компилятор продолжит преобразование array.into_iter() в (&array).into_iter(), как если бы отсутствовала реализация типажа IntoIterator, но только при вызове метода с использованием синтаксиса «.into_iter()» и не касаясь вызовов в форме «in [1, 2, 3]», «iter.zip([1, 2, 3])», «IntoIterator::into_iter([1, 2, 3])».
- Предоставлена возможность указания выражений «|» (логическая операция OR) в любой части шаблона, например, вместо «Some(1) | Some(2)» теперь можно писать «Some(1 | 2)»:
match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } } - Разрешено использование не-ASCII символов в идентификаторах, в том числе любых национальных символов, определённых в спецификации Unicode UAX 31, но кроме символов emoji. При использовании разных, но похожих по начертанию символов, компилятор выведет предупреждение.
const BLÅHAJ: &str = "?"; struct 人 { 名字: String, } let α = 1; let sos = 2; warning: identifier pair considered confusable between 's' and 's' - В разряд стабильных переведена новая порция API, в том числе стабилизированы:
array::from_refarray::from_mutAtomicBool::fetch_updateAtomicPtr::fetch_updateBTreeSet::retainBTreeMap::retainBufReader::seek_relativecmp::min_bycmp::min_by_keycmp::max_bycmp::max_by_keyDebugStruct::finish_non_exhaustiveDuration::ZERODuration::MAXDuration::is_zeroDuration::saturating_addDuration::saturating_subDuration::saturating_mulf32::is_subnormalf64::is_subnormalIntoIterator для массивов{integer}::BITSio::Error::UnsupportedNonZero*::leading_zerosNonZero*::trailing_zerosOption::insertOrdering::is_eqOrdering::is_neOrdering::is_ltOrdering::is_gtOrdering::is_leOrdering::is_geOsStr::make_ascii_lowercaseOsStr::make_ascii_uppercaseOsStr::to_ascii_lowercaseOsStr::to_ascii_uppercaseOsStr::is_asciiOsStr::eq_ignore_ascii_casePeekable::peek_mutRc::increment_strong_countRc::decrement_strong_countslice::IterMut::as_sliceAsRef‹[T]› для slice::IterMutimpl SliceIndex для (Bound‹usize›, Bound‹usize›)-
Vec::extend_from_within
- Реализован третий уровень поддержки для платформы wasm64-unknown-unknown. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
- Пакетный менеджер Cargo по умолчанию переведён на использование имени «main» для основной ветки Git-репозитория (HEAD). Для зависимостей, размещённых в репозиториях, использующих имя main вместо master, больше не требуется указывать в настройках branch = «main».
- В компиляторе требования к минимальной версии LLVM подняты до LLVM 10.
Дополнительно можно отметить предоставление финансирования работы по развитию интеграции в ядро Linux средств для разработки компонентов на языке Rust. Работа будет вестись в рамках проекта Prossimo под эгидой организации ISRG (Internet Security Research Group), которая является учредителем проекта Let’s Encrypt и способствует продвижению HTTPS и развитию технологий для повышения защищённости интернета. Средства будут предоставлены компанией Google, которая оплатит работу Мигеля Охеда (Miguel Ojeda), автора проекта Rust-for-Linux. Ранее ISRG и Google уже профинансировали создание альтернативного HTTP-бэкенда для утилиты curl и разработку нового TLS-модуля для http-сервера Apache.
По данным компаний Microsoft и Google около 70% уязвимостей вызваны небезопасной работой с памятью. Предполагается, что использование языка Rust для разработки компонентов ядра, таких как драйверы устройств, позволит снизить риск появления уязвимостей, вызванных небезопасной работой с памятью, и исключить появление таких ошибок, как обращением к области памяти после её освобождения и выход за границы буфера.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами и учёт времени жизни объектов (области видимости), а также через оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Источник: http://www.opennet.ru/opennews/art.shtml?num=55349
