Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные новшества:
- Переработано оформление сообщений, выдаваемых применяемым по умолчанию обработчиком аварийного завершения программы (panic). Текст, указанный в макросе «panic!» теперь показывается в отдельной строке без обрамления кавычками, что упрощает читаемость сообщения и устраняет путаницу при наличии в вложенных кавычек или разделения на несколько строк.
fn main() { let file = "ferris.txt"; panic!("oh no! {file:?} not found!"); } Было thread 'main' panicked at 'oh no! "ferris.txt" not found!', src/main.rs:3:5 Стало thread 'main' panicked at src/main.rs:3:5: oh no! "ferris.txt" not found!
Также переработан вывод сообщений, показываемых при срабатывании макросов «assert_eq» и «assert_ne».
fn main() { assert_eq!("?", "?", "ferris is not a fish"); } Было thread 'main' panicked at 'assertion failed: `(left == right)` left: `"?"`, right: `"?"`: ferris is not a fish', src/main.rs:2:5 Cтало thread 'main' panicked at src/main.rs:2:5: assertion `left == right` failed: ferris is not a fish left: "?" right: "?"
- В соответствии с RFC 3184 добавлена возможность прямой манипуляции локальными для потока (thread_local) ключами хранилища LocalKey‹Cell‹T›› и LocalKey‹RefCell‹T›› через использование методов get(), set(), take() и replace(), вместо использования замыкания «with(|inner| …)», что позволяет не выполнять дополнительный код инициализации для значений по умолчанию, указанных для новых потоков при помощи макроса «thread_local!».
thread_local! { static THINGS: Cell‹Vec‹i32›› = Cell::new(Vec::new()); } fn f() { // было THINGS.with(|i| i.set(vec![1, 2, 3])); // стало THINGS.set(vec![1, 2, 3]); // ... // было let v = THINGS.with(|i| i.take()); // стало let v: Vec‹i32› = THINGS.take(); }
- В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
- Unsigned
{integer}::div_ceil
- Unsigned
{integer}::next_multiple_of
- Unsigned
{integer}::checked_next_multiple_of
std::ffi::FromBytesUntilNulError
std::os::unix::fs::chown
std::os::unix::fs::fchown
std::os::unix::fs::lfchown
LocalKey::‹Cell‹T››::get
LocalKey::‹Cell‹T››::set
LocalKey::‹Cell‹T››::take
LocalKey::‹Cell‹T››::replace
LocalKey::‹RefCell‹T››::with_borrow
LocalKey::‹RefCell‹T››::with_borrow_mut
LocalKey::‹RefCell‹T››::set
LocalKey::‹RefCell‹T››::take
LocalKey::‹RefCell‹T››::replace
- Unsigned
- Признак «const», определяющий возможность использования в любом контексте вместо констант, применён в функциях:
- В компиляторе обеспечена запись информации о версии в секцию «.comment» по аналогии с GCC и Clang.
- Реализован третий уровень поддержки для платформ aarch64-unknown-teeos, csky-unknown-linux-gnuabiv2, riscv64-linux-android, riscv64gc-unknown-hermit, x86_64-unikraft-linux-musl и x86_64-unknown-linux-ohos. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
- Реализован второй уровень поддержки целевой платформы wasm32-wasi-preview1-threads. Второй уровень поддержки подразумевает гарантию сборки.
Источник: http://www.opennet.ru/opennews/art.shtml?num=59878