La version 1.99 du langage de programmation Rust a été publiée. Initialement développé par Mozilla, il est désormais soutenu par la Rust Foundation, une organisation indépendante à but non lucratif. Le langage se concentre sur une gestion sécurisée de la mémoire et offre des outils pour atteindre un haut niveau de parallélisme dans l'exécution des tâches, tout en se passant d'un ramasse-miettes et d'un runtime (le runtime se limite à une initialisation de base et à la gestion de la bibliothèque standard).
Les méthodes de gestion de la mémoire dans Rust visent à éliminer les erreurs lors de la manipulation des pointeurs et à protéger contre les problèmes liés à une gestion de la mémoire à bas niveau, tels que l'accès à une zone mémoire après sa libération, la déréférence de pointeurs nuls, les débordements de tampon, etc. Pour la distribution de bibliothèques, la construction et la gestion des dépendances, un gestionnaire de paquets nommé Cargo est développé. Un dépôt crates.io est maintenu pour l'hébergement des bibliothèques.
La sécurité de la mémoire dans Rust est assurée au moment de la compilation grâce à la vérification des références, au suivi de la propriété des objets, à la prise en compte de la durée de vie des objets (portée) et à l'évaluation de l'accès mémoire pendant l'exécution du code. Rust offre également des outils pour se protéger contre les débordements d'entiers, exige l'initialisation obligatoire des valeurs des variables avant leur utilisation, gère mieux les erreurs dans la bibliothèque standard, applique le concept d'immuabilité (immutable) pour les références et les variables par défaut, et propose une forte typage statique pour minimiser les erreurs logiques.
Les principales nouveautés :
- Il est désormais possible de créer des fonctions en Rust avec un nombre variable d'arguments (variadic), qui peuvent être exportées pour être appelées depuis des projets en C (C ABI). Le dernier élément de la liste des paramètres dans ces fonctions peut être spécifié par la construction «…», qui est traitée en Rust par un type spécial VaList, fonctionnant de manière analogue à va_list en C. unsafe extern «C» fn sum(mut args: …) -> i32 { let a = unsafe { args.next_arg::() }; let b = unsafe { args.next_arg::() }; a + b } fn foo() -> i32 { unsafe { sum(0i32, 2i32) } }
- Les fonctions Layout::for_value_raw, mem::size_of_val_raw et mem::align_of_val_raw ont été stabilisées, permettant de déterminer de manière sécurisée la taille et l'alignement à partir de pointeurs bruts (raw pointer), y compris lors de l'utilisation de types à taille dynamique, comme les tranches, sans nécessiter la création de références vers les données.
- La documentation a été mise à jour avec une recommandation pour éviter de libérer de la mémoire à laquelle une référence statique avec une durée de vie illimitée (&'static) a été obtenue via l'appel de Box::leak (round-trip unleaking), car cela pourrait entraîner des problèmes de compatibilité avec de futures optimisations du compilateur et des mécanismes de gestion de la mémoire connectés. Au lieu de créer une référence statique pour un transfert temporaire de propriété, il est recommandé d'utiliser des pointeurs bruts, par exemple via l'appel à Box::into_non_null.
- Une nouvelle série d'API a été stabilisée dans la catégorie des API stables, notamment des méthodes et des implémentations de traits stabilisées :
- IntoIterator pour Box
- IntoIterator pour &Box
- IntoIterator pour &mut Box
- VecDeque::retain_back
- core::ffi::VaList
- Box::into_non_null
- Box::from_non_null
- Vec::into_parts
- Vec::from_parts
- core::mem::size_of_val_raw
- core::mem::align_of_val_raw
- core::alloc::Layout::for_value_raw
- String::from_utf8_lossy_owned
- string::FromUtf8Error::into_utf8_lossy
- FusedIterator pour StepBy
- std::fs::set_times
- std::fs::set_times_nofollow
- Le gestionnaire de paquets cargo a intégré un nouveau profil intégré « debug », similaire au profil « dev » (à l'avenir, les fonctionnalités de débogage et de développement devraient être séparées). Lors de la compilation dans CI, la compilation incrémentale est désactivée par défaut.
- La plateforme cible riscv64-unknown-linux-musl a été mise à niveau vers un deuxième niveau de support, ce qui implique une garantie de compilation, mais pas de garanties lors du passage du test.
De plus, on peut noter les projets et événements récemment annoncés liés à Rust :
- Microsoft a classé Rust parmi les langages de premier ordre et assurera son plein support à toutes les étapes de développement au sein de l'entreprise. Auparavant, le premier niveau de support était accordé aux langages C++, C# et TypeScript. Il est noté que Rust est déjà utilisé dans plus de 100 dépôts de Microsoft. Entre autres, des composants Rust sont déjà appliqués dans des produits comme Microsoft 365 et Copilot, et un backend distinct rustc_codegen_utc pour Rust, basé sur le compilateur rustc, a été préparé pour le compilateur MSVC.
L'objectif principal de l'application de Rust chez Microsoft est d'améliorer la sécurité du code, critique pour la sécurité. Selon le directeur technique de Microsoft Azure, environ 70 % des vulnérabilités de Windows sont causées par des problèmes de gestion de la mémoire, qui peuvent être évités en utilisant Rust.
- Google a supprimé de l ядро Linux l'ancienne implémentation du mécanisme de communication inter-processus Binder, écrit en C, au profit d'un nouveau pilote Binder IPC, réécrit en Rust. Il est noté qu'au cours des 15 ans d'existence de l'ancien pilote, une dette technique significative et de nombreuses complications s'étaient accumulées, rendant la recherche de bogues, la maintenance et l'ajout de nouvelles fonctionnalités difficiles. Le pilote Binder IPC en Rust est maintenant reconnu comme la principale implémentation et n'est plus présenté comme un développement expérimental.
- La version 2.7.0 d'Arti, l'implémentation de l'outil Tor écrite en Rust, a été publiée. Lorsque le code Arti atteindra un niveau capable de remplacer entièrement la version en C, les développeurs de Tor prévoient de donner à Arti le statut d'implémentation principale de Tor et de cesser progressivement la maintenance de l'implémentation en C. La nouvelle version a introduit le développement de fonctionnalités pour les relais. serveurs un annuaire (Directory Authority), lié au parsing de documents, au support du mirroring des serveurs d'annuaire et au traitement du trafic DNS. Une implémentation RPC a été ajoutée pour modifier et vérifier la configuration. Plusieurs vulnérabilités ont été corrigées — il est recommandé aux administrateurs des services onion de mettre à jour leurs systèmes sans délai.
Source : opennet.ru
