Karat 1.41.1 Rilis: Rilis Korektif

Tim Rust telah menerbitkan rilis korektif baru Rust, 1.41.1. Rust adalah bahasa pemrograman yang memungkinkan semua orang membuat perangkat lunak yang andal dan efisien.


Jika Anda menginstal versi Rust menggunakan alat sebelumnya rustup, maka untuk meningkatkan ke versi 1.41.1 Anda hanya perlu menjalankan perintah berikut:


rustup update stable

Jika Anda belum menginstalnya rustup, Anda dapat menginstalnya dari halaman yang sesuai di situs web kami


Apa yang termasuk dalam versi stabil 1.41.1


Rust 1.41.1 didedikasikan untuk dua regresi kritis yang muncul di Rust 1.41.0: ketidaktepatan dalam masa hidup statis dan kompilasi yang salah yang menyebabkan kesalahan segmentasi. Kemunduran ini tidak memengaruhi rilis Rust sebelumnya, dan kami menyarankan agar pengguna Rust 1.41.0 meningkatkan secepat mungkin. Masalah lain yang terkait dengan interaksi antara masa hidup 'staticdan implementasi sifat Copyada sejak Rust 1.0 dan juga diperbaiki oleh rilis ini.


Kegagalan Verifikasi staticElemen


Dalam Karat 1.41.0, karena beberapa perubahan dalam representasi internal staticnilai, penganalisis pinjaman secara tidak sengaja menyelesaikan beberapa program yang salah. Secara khusus, penganalisa pinjaman tidak memeriksa kebenaran dari jenis staticelemen. Hal ini, pada gilirannya, memungkinkan untuk nilai-nilai sementara assign dengan seumur hidup lebih pendek dari 'staticpada staticvariabel:


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

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

Di 1.41.1, kode seperti itu tidak akan dikompilasi:


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

Anda dapat mempelajari lebih lanjut tentang kesalahan ini di # 69114 dan PR yang memperbaikinya .


Implementasi Copyseumur hidup'static


Dimulai dengan Rust 1.0, program kesalahan berikut berhasil dikompilasi:


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

Untuk Rust 1.41.1, masalah ini telah diperbaiki dengan PR yang sama seperti di atas . Mengkompilasi program sekarang menghasilkan kesalahan berikut:



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