Выпуск Rust 1.41.1: корректирующий выпуск

в 16:11, , рубрики: cargo, clippy, open source, release, Rust, rustc, rustdoc, rustfix, rustfmt, stable, выпуск версий, Компиляторы, новости технологий, перевод, Программирование, системное программирование, стабильная версия, языки программирования

Команда Rust опубликовала новый корректирующий выпуск Rust, 1.41.1. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.

Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.41.1 вам достаточно выполнить следующую команду:

rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта

Что вошло в стабильную версию 1.41.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 и PR, который её исправил.

Реализация 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, что и выше. Компиляция программы теперь выдаёт следующую ошибку:


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.

Участники 1.41.1

Множество людей собрались вместе, чтобы создать Rust 1.41.1. Мы не смогли бы сделать это без всех вас, спасибо!

От переводчиков

С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов.

Автор: RustLangRu

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js