Sortie du langage de programmation Rust 1.74. Audit RustVMM. Réécriture du classeur dans Rust

La sortie du langage de programmation polyvalent Rust 1.74, fondé par le projet Mozilla, mais maintenant développé sous les auspices de l'organisation indépendante à but non lucratif Rust Foundation, a été publiée. Le langage se concentre sur la sécurité de la mémoire et fournit les moyens d'atteindre un parallélisme élevé des tâches tout en évitant l'utilisation d'un ramasse-miettes et d'un temps d'exécution (le temps d'exécution est réduit à l'initialisation et à la maintenance de base de la bibliothèque standard).

Les méthodes de gestion de la mémoire de Rust évitent au développeur les erreurs lors de la manipulation des pointeurs et protègent contre les problèmes qui surviennent en raison de la gestion de la mémoire de bas niveau, comme l'accès à une zone mémoire après qu'elle a été libérée, le déréférencement des pointeurs nuls, les dépassements de mémoire tampon, etc. Pour distribuer les bibliothèques, fournir des builds et gérer les dépendances, le projet développe le gestionnaire de packages Cargo. Le référentiel crates.io est pris en charge pour l'hébergement de bibliothèques.

La sécurité de la mémoire est fournie dans Rust au moment de la compilation grâce à la vérification des références, au suivi de la propriété des objets, au suivi des durées de vie des objets (portées) et à l'évaluation de l'exactitude de l'accès à la mémoire pendant l'exécution du code. Rust fournit également une protection contre les débordements d'entiers, nécessite une initialisation obligatoire des valeurs de variables avant utilisation, gère mieux les erreurs dans la bibliothèque standard, applique le concept de références et de variables immuables par défaut, propose un typage statique fort pour minimiser les erreurs logiques.

Principales nouveautés :

  • Ajout de la possibilité de configurer des contrôles de charpie via le fichier Cargo.toml avec le manifeste du gestionnaire de packages. Pour définir les paramètres de lint, tels que le niveau de réponse (interdire, refuser, avertir, autoriser), de nouvelles sections « [lints] » et « [workspace.lints] » sont proposées, dont les modifications sont prises en compte lors de la prise de décision concernant reconstitution. Par exemple, au lieu de spécifier les indicateurs « -F », « -D », « -W » et « -A » lors de l'assemblage ou de l'ajout des éléments « #![forbid(unsafe_code)] » et « #![deny(clippy :" attributs du code) :enum_glob_use)]" peuvent désormais être utilisés dans le manifeste Cargo : [lints.rust] unsafe_code = "forbid" [lints.clippy] enum_glob_use = "deny"
  • Le gestionnaire de packages Crate a ajouté la possibilité de s'authentifier lors de la connexion à un référentiel. La distribution de base inclut la prise en charge du placement des paramètres d'authentification dans les magasins d'informations d'identification Linux (basés sur libsecret), macOS (Keychain) et Windows (Windows Credential Manager), mais le système a été initialement rendu modulaire et vous permet d'organiser le travail avec divers fournisseurs pour le stockage et générant des jetons, par exemple, un plugin a été préparé pour utiliser le gestionnaire de mots de passe 1Password. L'authentification peut être requise par le référentiel pour toute opération, pas seulement pour confirmer que les packages ont été publiés. ~/.cargo/config.toml [registre] global-credential-providers = ["cargo:token", "cargo:libsecret"]
  • La prise en charge des projections de type de retour (impl_trait_projections) a été stabilisée, permettant à Self et T::Assoc d'être mentionnés dans les types de retour tels que "async fn" et "->impl Trait". struct Wrapper<'a, T>(&'a T); // Types de retour opaques qui mentionnent `Self` : impl Wrapper<'_, ()> { async fn async_fn() -> Self { /* … */ } fn impl_trait() -> impl Iterator { /* … */ } } trait Trait<'a> { type Assoc; fn new() -> Self::Assoc; } impl Trait<'_> for () { type Assoc = (); fn new() {} } // Types de retour opaques qui mentionnent un type associé : impl<'a, T: Trait<'a>> Wrapper<'a, T> { async fn mk_assoc() -> T::Assoc { /* … */ } fn a_few_assocs() -> impl Itérateur { /* … */ } }
  • Une nouvelle partie de l'API a été déplacée vers la catégorie stable, dont les méthodes et les implémentations des traits ont été stabilisées :
  • L'attribut « const », qui détermine la possibilité de l'utiliser dans n'importe quel contexte à la place de constantes, est utilisé dans les fonctions :
    • core :: mem :: transmute_copy
    • str::is_ascii
    • [u8] ::is_ascii
    • core::num::Saturation
    • impl De pour std :: process :: Stdio
    • impl De pour std :: process :: Stdio
    • impl De pour std :: process :: Child {Stdin, Stdout, Stderr}
    • impl De pour std :: process :: Child {Stdin, Stdout, Stderr}
    • std :: ffi :: OsString :: from_encoded_bytes_unchecked
    • std :: ffi :: OsString :: into_encoded_bytes
    • std :: ffi :: OsStr :: from_encoded_bytes_unchecked
    • std :: ffi :: OsStr :: as_encoded_bytes
    • std :: io :: Erreur :: autre
    • impl TryFrom pour les U16
    • implicite De<&[T; N]>pour Vec
    • implicite De<&mut [T; N]>pour Vec
    • implicite De<[T; N]> pour Arc<[T]>
    • implicite De<[T; N]> pour Rc<[T]>
  • Le compilateur, la boîte à outils, la bibliothèque standard et les exécutables d'application générés ont des exigences accrues pour les plates-formes Apple, nécessitant désormais au moins macOS 10.12 Sierra, iOS 10 et tvOS 10 sortis en 2016 pour fonctionner.
  • Le troisième niveau de support a été implémenté pour la plateforme i686-pc-windows-gnullvm. Le troisième niveau implique un support de base, mais sans tests automatisés, sans publication de versions officielles ni vérification si le code peut être construit.
  • Le deuxième niveau de support pour la plateforme cible loongarch64-unknown-none a été implémenté. Le deuxième niveau de prise en charge concerne une garantie de montage.

De plus, deux événements liés au langage Rust peuvent être notés :

  • L'OSTIF (Open Source Technology Improvement Fund), créé pour renforcer la sécurité des projets open source, a publié les résultats d'un audit du projet RustVMM, qui fournit des composants pour créer des hyperviseurs spécifiques à des tâches et des moniteurs de machines virtuelles (VMM). Des sociétés telles qu'Intel, Alibaba, Amazon, Google, Linaro et Red Hat participent au développement du projet. Les hyperviseurs Intel Cloud Hypervisor et Dragonball sont en cours de développement sur la base de RustVMM. L'audit a confirmé la haute qualité de la base de code et l'utilisation de techniques dans l'architecture et la mise en œuvre visant à atteindre une sécurité maximale. Lors de l'audit, 6 problèmes ont été identifiés qui n'avaient pas d'impact direct sur la sécurité.
  • Google a introduit une nouvelle implémentation du mécanisme de communication interprocessus Binder, réécrit en langage Rust, dans la liste de diffusion des développeurs du noyau Linux. La refonte a été réalisée dans le cadre d'un projet visant à renforcer la sécurité, à promouvoir des techniques de programmation sécurisées et à augmenter l'efficacité de l'identification des problèmes lors du travail avec la mémoire sous Android (environ 70 % de toutes les vulnérabilités dangereuses identifiées dans Android sont causées par des erreurs lors du travail avec la mémoire. ). L'implémentation de Binder dans Rust a atteint la parité de fonctionnalité avec la version originale en langage C, réussit tous les tests AOSP (Android Open-Source Project) et peut être utilisée pour créer des éditions fonctionnelles de firmware. Les performances des deux implémentations sont à peu près au même niveau (écarts compris entre -1.96 % et +1.38 %).

Source: opennet.ru

Ajouter un commentaire