Versão Rust 1.41.1: versão corretiva

A equipe do Rust publicou uma nova versão corretiva do Rust, 1.41.1. Rust é uma linguagem de programação que permite a todos criar software confiável e eficiente.


Se você instalou a versão anterior do Rust usando ferramentas rustup, para atualizar para a versão 1.41.1, basta executar o seguinte comando:


rustup update stable

Se você ainda não o instalou rustup, pode instalá-lo na página correspondente do nosso site


O que está incluído na versão estável 1.41.1


O Rust 1.41.1 é dedicado a duas regressões críticas que apareceram no Rust 1.41.0: incorreto no tempo de vida estático e compilação incorreta que causa erros de segmentação. Essas regressões não afetam as versões anteriores do Rust e recomendamos que os usuários do Rust 1.41.0 atualizem o mais rápido possível. Outro problema relacionado à interação entre a vida útil 'statice as implementações de características estava Copypresente desde o Rust 1.0 e também é corrigido por esta versão.


Falha na verificação do staticelemento


No Rust 1.41.0, devido a algumas alterações na representação interna dos staticvalores, o analisador de empréstimos resolveu acidentalmente alguns programas incorretos. Em particular, o analisador de empréstimos não verificou a exatidão do tipo de staticelementos. Isso, por sua vez, tornou possível atribuir valores temporariamente com uma vida útil mais curta que 'statica staticvariável:


static mut MY_STATIC: &'static u8 = &0;

fn main() {
    let my_temporary = 42;
    unsafe {
        //     1.41.0:
        MY_STATIC = &my_temporary;
    }
}

Em 1.41.1, esse código não compila:


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

Você pode aprender mais sobre esse erro no # 69114 e no PR que o corrigiu .


Implementação Copypara toda a vida'static


Começando com Rust 1.0, o seguinte programa de erro foi compilado com êxito:


#[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); //     .
}

Para o Rust 1.41.1, esse problema foi corrigido com o mesmo PR acima . Compilar o programa agora produz o seguinte erro:



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 - .


All Articles