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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Команда 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 вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов.

Источник: https://habr.com/ru/post/490132/


Интересные статьи

Интересные статьи

Ниже представлен перевод одной из частей серии статей Rust Crash Course от Майкла Сноймана, которая посвящена механизмам передачи параметров, итераторам и замыканиям относительно того, ка...
Разработчики графического редактора GIMP 3.0 представили версию 2.99.2, которая считается предварительной версией новой стабильной ветки GIMP 3.0. Среди основных нововведений — переход ...
Всем привет! Почти три месяца прошло с последнего выпуска новостей. От нас почти ничего не было слышно. Мы работали. После расширения команды Yii 3 я больше занимаюсь управлением, ре...
Всем привет. Когда я искал информацию о журналировании (аудите событий) в Bitrix, на Хабре не было ни чего, в остальном рунете кое что было, но кто же там найдёт? Для пополнения базы знаний...
В этой статье описывается библиотека optlib, предназначенная для решения задач глобальной оптимизации на языке Rust. На момент написания этой статьи в этой библиотеке реализован генетический алго...