Version du langage de programmation Rust 1.58

La version du langage de programmation à usage général Rust 1.58, fondé par le projet Mozilla, mais désormais 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, assure une gestion automatique de la mémoire et fournit les moyens d'atteindre un parallélisme élevé des tâches sans utiliser de garbage collector ou d'exécution (le temps d'exécution est réduit à l'initialisation et à la maintenance de base de la bibliothèque standard).

La gestion automatique de la mémoire de Rust élimine les erreurs lors de la manipulation des pointeurs et protège contre les problèmes résultant de la manipulation de la mémoire de bas niveau, tels que l'accès à une région mémoire après sa libération, les déréférences de pointeurs nuls, les dépassements de tampon, etc. Pour distribuer les bibliothèques, assurer l'assemblage 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.

Principales nouveautés :

  • Dans les blocs de formatage de ligne, en plus de la possibilité précédemment disponible de remplacer les variables explicitement répertoriées après une ligne par un numéro et un nom, la possibilité de remplacer des identifiants arbitraires en ajoutant l'expression « {identifier} » à la ligne est implémentée. Par exemple : // Constructions précédemment prises en charge : println!("Bonjour, {}!", get_person()); println!("Bonjour, {0}!", get_person()); println!("Bonjour, {personne}!", personne = get_person()); // vous pouvez maintenant spécifier let person = get_person(); println!("Bonjour, {personne}!");

    Les identifiants peuvent également être spécifiés directement dans les options de formatage. let (largeur, précision) = get_format(); for (nom, score) in get_scores() { println!("{name}: {score:width$.precision$}"); }

    La nouvelle substitution fonctionne dans toutes les macros prenant en charge la définition de format de chaîne, à l'exception de la macro « panique ! ». dans les versions 2015 et 2018 du langage Rust, dans lesquelles panic!("{ident}") est traité comme une chaîne normale (dans Rust 2021, la substitution fonctionne).

  • Le comportement de la structure std::process::Command sur la plateforme Windows a été modifié afin que lors de l'exécution de commandes, pour des raisons de sécurité, elle ne recherche plus de fichiers exécutables dans le répertoire courant. Le répertoire actuel est exclu car il pourrait être utilisé pour exécuter du code malveillant si les programmes sont exécutés dans des répertoires non fiables (CVE-2021-3013). La nouvelle logique de détection des exécutables implique la recherche dans les répertoires Rust, le répertoire de l'application, le répertoire système Windows et les répertoires spécifiés dans la variable d'environnement PATH.
  • La bibliothèque standard a augmenté le nombre de fonctions marquées "#[must_use]" pour émettre un avertissement si la valeur de retour est ignorée, ce qui permet d'identifier les erreurs causées par l'hypothèse qu'une fonction modifiera les valeurs plutôt que de renvoyer une nouvelle valeur.
  • 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 :
    • Métadonnées ::is_symlink
    • Chemin ::is_symlink
    • {entier} ::saturating_div
    • Option ::unwrap_unchecked
    • Résultat ::unwrap_unchecked
    • Résultat ::unwrap_err_unchecked
  • 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 :
    • Durée ::nouveau
    • Durée ::checked_add
    • Durée : saturating_add
    • Durée ::checked_sub
    • Durée ::saturating_sub
    • Durée ::checked_mul
    • Durée : saturating_mul
    • Durée ::checked_div
  • Déréférencement autorisé des pointeurs "*const T" dans les contextes "const".
  • Dans le gestionnaire de packages Cargo, le champ rust_version a été ajouté aux métadonnées du package et l'option « --message-format » a été ajoutée à la commande « cargo install ».
  • Le compilateur implémente la prise en charge du mécanisme de protection CFI (Control Flow Integrity), qui ajoute des vérifications avant chaque appel indirect pour détecter certaines formes de comportement non défini pouvant potentiellement conduire à une violation de l'ordre d'exécution normal (flux de contrôle) en raison du utilisation d'exploits qui modifient les pointeurs stockés en mémoire sur les fonctions.
  • Le compilateur a ajouté la prise en charge des versions 5 et 6 du format de comparaison de couverture LLVM, utilisé pour évaluer la couverture du code lors des tests.
  • Dans le compilateur, les exigences pour la version minimale de LLVM sont élevées à LLVM 12.
  • Le troisième niveau de support pour la plateforme x86_64-unknown-none a été implémenté. 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.

De plus, on peut noter la publication par Microsoft de la sortie des bibliothèques Rust pour Windows 0.30, qui permettent d'utiliser le langage Rust pour développer des applications pour le système d'exploitation Windows. L'ensemble comprend deux packages de caisse (windows et windows-sys), via lesquels vous pouvez accéder à l'API Win dans les programmes Rust. Le code pour la prise en charge de l'API est généré dynamiquement à partir des métadonnées décrivant l'API, ce qui vous permet d'implémenter la prise en charge non seulement pour les appels d'API Win existants, mais aussi pour les appels qui apparaîtront dans le futur. La nouvelle version ajoute la prise en charge de la plate-forme cible UWP (Universal Windows Platform) et implémente les types Handle et Debug.

Source: opennet.ru

Ajouter un commentaire