- PVSM.RU - https://www.pvsm.ru -
Команда Rust опубликовала новый корректирующий выпуск Rust, 1.41.1. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если вы установили предыдущую версию Rust средствами rustup
, то для обновления до версии 1.41.1 вам достаточно выполнить следующую команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его [1] с соответствующей страницы нашего веб-сайта
Rust 1.41.1 посвящён двум критическим регрессиям, появившимся в Rust 1.41.0: некорректность в статических временах жизни и неправильная компиляция, вызывающая ошибки сегментирования. Эти регрессии не затрагивают предыдущие выпуски Rust и мы рекомендуем пользователям Rust 1.40.0 обновиться настолько быстро, насколько это возможно. Другая проблема, связанная со взаимодействием между временем жизни 'static
и реализациями типажа Copy
, присутствовала ещё с Rust 1.0 и тоже исправляется данным выпуском.
static
элементов.В Rust 1.41.0, из-за некоторых изменений во внутреннем представлении static
значений, анализатор заимствований случайно разрешал некоторые ошибочные программы. В частности, анализатор заимствований не проверял правильность типа static
элементов. Это, в свою очередь, позволяло временно присваивать значения со временем жизни, меньшим чем 'static
, к static
переменной:
static mut MY_STATIC: &'static u8 = &0;
fn main() {
let my_temporary = 42;
unsafe {
// Ошибочно разрешённая операция в 1.41.0:
MY_STATIC = &my_temporary;
}
}
В 1.41.1 такой код не будет компилироваться:
error[E0597]: `my_temporary` does not live long enough
--> src/main.rs:6:21
|
6 | MY_STATIC = &my_temporary;
| ------------^^^^^^^^^^^^^
| | |
| | borrowed value does not live long enough
| assignment requires that `my_temporary` is borrowed for `'static`
7 | }
8 | }
| - `my_temporary` dropped here while still borrowed
Вы можете узнать больше об этой ошибке в #69114 [2] и PR, который её исправил [3].
Copy
для времени жизни 'static
Начиная ещё с Rust 1.0 следующая ошибочная программа успешно компилировалась:
#[derive(Clone)]
struct Foo<'a>(&'a u32);
impl Copy for Foo<'static> {}
fn main() {
let temporary = 2;
let foo = (Foo(&temporary),);
drop(foo.0); // Доступ к необходимой части `foo`.
drop(foo.0); // Индексация массива так же работает.
}
В Rust 1.41.1 эта проблема была исправлена тем же PR, что и выше [3]. Компиляция программы теперь выдаёт следующую ошибку:
error[E0597]: `temporary` does not live long enough
--> src/main.rs:7:20
|
7 | let foo = (Foo(&temporary),);
| ^^^^^^^^^^ borrowed value does not live long enough
8 | drop(foo.0);
| ----- copying this value requires that
| `temporary` is borrowed for `'static`
9 | drop(foo.0);
10 | }
| - `temporary` dropped here while still borrowed
Эта ошибка возникает из-за того, что Foo<'a>
, для некоторого времени жизни 'a
, реализует Copy
только тогда, когда 'a: 'static
. Однако temporary
переменная с некоторым временем жизни '0
не переживает 'static
и, следовательно, Foo<'0>
не является Copy
, поэтому использование drop
во второй раз должно быть ошибкой.
В некоторых случаях программы, скомпилированные Rust 1.41.0, при выделении памяти пропускали проверки границ. Это приводило к ошибкам сегментирования, если предоставлялись значения, находящиеся за пределами выделенной области памяти. Причиной этого была ошибка компиляции, вызванная изменением оптимизационного прохода LLVM, который появился в LLVM 9 и был удалён в LLVM 10.
Rust 1.41.0 использует собственную ветку LLVM 9 и мы в Rust 1.41.1 отменили те коммиты, которые были связаны с ошибкой компиляции. Подробнее об это ошибке вы можете узнать здесь: #69225 [4].
Множество людей собрались вместе, чтобы создать Rust 1.41.1. Мы не смогли бы сделать это без всех вас, спасибо [5]!
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате [6] или же в аналогичном чате для новичковых вопросов [7].
Автор: RustLangRu
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/348174
Ссылки в тексте:
[1] установить его: https://www.rust-lang.org/tools/install
[2] #69114: https://github.com/rust-lang/rust/issues/69114
[3] PR, который её исправил: https://github.com/rust-lang/rust/pull/69145
[4] #69225: https://blog.rust-lang.org/2019/12/19/Rust-1.40.0.html#borrow-check-migration-warnings-are-hard-errors-in-rust-2015
[5] спасибо: https://thanks.rust-lang.org/rust/1.41.1/
[6] русскоязычном Телеграм-чате: https://t.me/rustlang_ru
[7] чате для новичковых вопросов: https://t.me/rust_beginners_ru
[8] Источник: https://habr.com/ru/post/490132/?utm_source=habrahabr&utm_medium=rss&utm_campaign=490132
Нажмите здесь для печати.