Keluaran bahasa pengaturcaraan Rust 1.74. Audit RustVMM. Menulis Semula Pengikat dalam Karat

Bahasa pengaturcaraan tujuan umum Rust 1.74, yang diasaskan oleh projek Mozilla tetapi kini dibangunkan di bawah naungan organisasi bebas tanpa untung Rust Foundation, telah dikeluarkan. Bahasa ini memberi tumpuan kepada keselamatan ingatan dan menyediakan cara untuk mencapai keselarian kerja yang tinggi sambil mengelakkan penggunaan pengumpul sampah dan masa jalan (masa jalan dikurangkan kepada permulaan asas dan penyelenggaraan perpustakaan standard).

Kaedah pengendalian memori Rust menyelamatkan pembangun daripada ralat semasa memanipulasi penunjuk dan melindungi daripada masalah yang timbul akibat pengendalian memori peringkat rendah, seperti mengakses kawasan memori selepas ia dibebaskan, membatalkan penunjuk nol, overrun penimbal, dsb. Untuk mengedarkan perpustakaan, menyediakan binaan dan mengurus kebergantungan, projek membangunkan pengurus pakej Kargo. Repositori crates.io disokong untuk mengehos perpustakaan.

Keselamatan memori disediakan dalam Rust pada masa penyusunan melalui semakan rujukan, menjejaki pemilikan objek, menjejaki jangka hayat objek (skop) dan menilai ketepatan akses memori semasa pelaksanaan kod. Rust juga menyediakan perlindungan terhadap limpahan integer, memerlukan permulaan mandatori nilai pembolehubah sebelum digunakan, mengendalikan ralat dengan lebih baik dalam perpustakaan standard, menggunakan konsep rujukan tidak berubah dan pembolehubah secara lalai, menawarkan penaipan statik yang kuat untuk meminimumkan ralat logik.

Inovasi utama:

  • Menambahkan keupayaan untuk mengkonfigurasi semakan lint melalui fail Cargo.toml dengan manifes pengurus pakej. Untuk menentukan tetapan lint, seperti tahap tindak balas (melarang, menafikan, memberi amaran, benarkan), bahagian baharu β€œ[lints]” dan β€œ[workspace.lints]” dicadangkan, perubahan yang diambil kira semasa membuat keputusan tentang membina semula. Sebagai contoh, bukannya menyatakan bendera β€œ-F”, β€œ-D”, β€œ-W” dan β€œ-A” apabila memasang atau menambah β€œ#![forbid(unsafe_code)]” dan β€œ#![deny(clippy) :” atribut kepada kod) :enum_glob_use)]" kini boleh digunakan dalam manifes Kargo: [lints.rust] unsafe_code = "forbid" [lints.clippy] enum_glob_use = "deny"
  • Pengurus pakej Crate telah menambah keupayaan untuk mengesahkan apabila menyambung ke repositori. Pengedaran asas termasuk sokongan untuk meletakkan parameter pengesahan dalam stor bukti kelayakan Linux (berdasarkan libsecret), macOS (Keychain) dan Windows (Pengurus Kredensial Windows), tetapi sistem pada mulanya dibuat modular dan membolehkan anda mengatur kerja dengan pelbagai pembekal untuk menyimpan dan menjana token, sebagai contoh, pemalam telah disediakan untuk menggunakan pengurus kata laluan 1Password. Pengesahan mungkin diperlukan oleh repositori untuk sebarang operasi, bukan hanya untuk mengesahkan bahawa pakej telah diterbitkan. ~/.cargo/config.toml [registry] global-credential-providers = ["cargo:token", "cargo:libsecret"]
  • Sokongan untuk unjuran jenis pemulangan (impl_trait_projections) telah distabilkan, membolehkan Diri dan T::Assoc disebut dalam jenis pemulangan seperti "async fn" dan "->impl Trait". struct Wrapper<'a, T>(&'a T); // Jenis pengembalian legap yang menyebut `Self`: impl Wrapper<'_, ()> { async fn async_fn() -> Self { /* … */ } fn impl_trait() -> impl Iterator { /* … */ } } trait Trait<'a> { type Assoc; fn new() -> Diri::Assoc; } impl Trait<'_> for () { type Assoc = (); fn new() {} } // Jenis pulangan legap yang menyebut jenis yang berkaitan: impl<'a, T: Trait<'a>> Wrapper<'a, T> { async fn mk_assoc() -> T::Assoc { /* … */ } fn a_few_assocs() -> impl Iterator { /* … */ } }
  • Bahagian baharu API telah dialihkan ke kategori stabil, termasuk kaedah dan pelaksanaan ciri telah distabilkan:
  • Atribut "const", yang menentukan kemungkinan menggunakannya dalam sebarang konteks dan bukannya pemalar, digunakan dalam fungsi:
    • teras::mem::transmute_copy
    • str::is_ascii
    • [u8]::is_ascii
    • teras::num::Tepu
    • impl Dari untuk std::process::Stdio
    • impl Dari untuk std::process::Stdio
    • impl From for std::process::Child{Stdin, Stdout, Stderr}
    • impl From for std::process::Child{Stdin, Stdout, Stderr}
    • std::ffi::OsString::from_encoded_bytes_unchecked
    • std::ffi::OsString::into_encoded_bait
    • std::ffi::OsStr::from_encoded_bytes_unchecked
    • std::ffi::OsStr::as_encoded_bait
    • std::io::Ralat::lain
    • impl TryFrom untuk u16
    • impl Daripada<&[T; N]> untuk Vec
    • impl Daripada<&mut [T; N]> untuk Vec
    • impl Daripada<[T; N]> untuk Arka<[T]>
    • impl Daripada<[T; N]> untuk Rc<[T]>
  • Pengkompil, kit alat, perpustakaan standard dan aplikasi boleh laku yang dijana telah meningkatkan keperluan untuk platform Apple, kini memerlukan sekurang-kurangnya macOS 10.12 Sierra, iOS 10 dan tvOS 10 yang dikeluarkan pada 2016 untuk dijalankan.
  • Tahap ketiga sokongan telah dilaksanakan untuk platform i686-pc-windows-gnullvm. Tahap ketiga melibatkan sokongan asas, tetapi tanpa ujian automatik, menerbitkan binaan rasmi atau menyemak sama ada kod itu boleh dibina.
  • Tahap kedua sokongan untuk platform sasaran loongarch64-unknown-none telah dilaksanakan. Tahap sokongan kedua melibatkan jaminan pemasangan.

Selain itu, dua peristiwa yang berkaitan dengan bahasa Rust boleh diperhatikan:

  • OSTIF (Open Source Technology Improvement Fund), yang diwujudkan untuk mengukuhkan keselamatan projek sumber terbuka, telah menerbitkan hasil audit projek RustVMM, yang menyediakan komponen untuk mencipta hypervisor khusus tugas dan monitor mesin maya (VMM). Syarikat seperti Intel, Alibaba, Amazon, Google, Linaro dan Red Hat mengambil bahagian dalam pembangunan projek itu. Intel Cloud Hypervisor dan Dragonball hypervisor sedang dibangunkan berdasarkan RustVMM. Audit mengesahkan kualiti tinggi asas kod dan penggunaan teknik dalam seni bina dan pelaksanaan yang bertujuan untuk mencapai keselamatan maksimum. Semasa audit dijalankan, 6 masalah telah dikenal pasti yang tidak memberi kesan langsung kepada keselamatan.
  • Google memperkenalkan pelaksanaan baharu mekanisme komunikasi antara proses Binder, yang ditulis semula dalam bahasa Rust, kepada senarai mel pembangun kernel Linux. Kerja semula telah dijalankan sebagai sebahagian daripada projek untuk mengukuhkan keselamatan, menggalakkan teknik pengaturcaraan selamat dan meningkatkan kecekapan mengenal pasti masalah apabila bekerja dengan memori dalam Android (kira-kira 70% daripada semua kelemahan berbahaya yang dikenal pasti dalam Android disebabkan oleh ralat semasa bekerja dengan memori ). Pelaksanaan Binder in Rust telah mencapai pariti dalam kefungsian dengan versi asal dalam bahasa C, lulus semua ujian AOSP (Android Open-Source Project) dan boleh digunakan untuk mencipta edisi perisian tegar yang berfungsi. Prestasi kedua-dua pelaksanaan adalah lebih kurang pada tahap yang sama (penyimpangan dalam -1.96% dan +1.38%).

Sumber: opennet.ru

Tambah komen