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 'static
e as implementações de características estava Copy
presente desde o Rust 1.0 e também é corrigido por esta versão.
Falha na verificação do static
elemento
No Rust 1.41.0, devido a algumas alterações na representação interna dos static
valores, 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 static
elementos. Isso, por sua vez, tornou possível atribuir valores temporariamente com uma vida útil mais curta que 'static
a static
variável:
static mut MY_STATIC: &'static u8 = &0;
fn main() {
let my_temporary = 42;
unsafe {
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 Copy
para 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);
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 - .