La version 1.93 du langage de programmation Rust a été publiée. À l'origine un projet de Mozilla, il est désormais développé sous les auspices de l'organisation à but non lucratif Rust Foundation. Ce langage se concentre sur la sécurité de la mémoire et offre des outils pour assurer un haut niveau de parallélisme dans l'exécution des tâches, sans recourir à un ramasse-miettes et à un runtime (le runtime se limite à l'initialisation de base et à l'accompagnement de la bibliothèque standard).
Les méthodes de gestion de la mémoire en Rust éliminent les erreurs lors de la manipulation des pointeurs et protègent contre les problèmes liés à la gestion bas niveau de la mémoire, tels que l'accès à une zone mémoire après sa libération, la déréférence de pointeurs nuls, le dépassement de tampon, etc. Pour faciliter la diffusion des bibliothèques, assurer la compilation et gérer les dépendances, un gestionnaire de paquets nommé Cargo est en développement. Un dépôt pour le déploiement des bibliothèques, crates.io, est également supporté.
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 :
- La bibliothèque C standard Musl, livrée avec Rust et utilisée lors de la compilation statique pour les plateformes cibles «*-linux-musl» (aarch64-unknown-linux-musl, x86_64-unknown-linux-musl, powerpc64le-unknown-linux-musl, etc.) sur les systèmes sans Musl, a été mise à jour vers la version 1.2.5. La version minimale prise en charge de Musl lors de la compilation dynamique a également été relevée à la version 1.2.5. Auparavant, Rust utilisait la version 1.2.3 de Musl, qui présentait des problèmes avec l'implémentation du résolveur DNS. Dans la version 1.2.4 de Musl, la possibilité d'envoyer une requête par TCP en cas d'échec d'une requête par UDP a été ajoutée au résolveur DNS, ce qui a résolu le problème de demande de grands enregistrements DNS et a amélioré la compatibilité avec les serveurs DNS récursifs ne prenant pas en charge le retour partiel des résultats dans des réponses UDP tronquées. Dans la version 1.2.5 de Musl, le résolveur DNS gère maintenant les réponses avec de longues séquences CNAME et a résolu le problème qui faisait que certaines grandes réponses transmises par TCP étaient rejetées.
- La bibliothèque standard a été retravaillée pour résoudre des problèmes de réentrance lors de son utilisation avec des allocateurs de mémoire globaux écrits en Rust, le macro std::thread_local! et la fonction std::thread::current, qui provoquaient une récursivité infinie. Pour éviter la situation où std::thread_local! et std::thread::current appelaient le même allocateur utilisé lors de la tentative d'allocation de mémoire, le mécanisme d'allocation système est maintenant appliqué directement.
- L'utilisation d'attributs «cfg» à l'intérieur des blocs «asm!» avec du code assembleur est désormais autorisée, ce qui permet par exemple de gérer l'activation des ensembles d'instructions CPU étendus dans le contexte d'expressions individuelles à l'intérieur d'un bloc asm (auparavant, les attributs «cfg» ne pouvaient être spécifiés que pour l'ensemble du bloc asm). asm!( // ou global_asm! ou naked_asm! «nop», #[cfg(target_feature = «sse2»)] «nop», // … #[cfg(target_feature = «sse2»)] a = const 123, // utilisé uniquement sur sse2 );
- 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 :
- <[MaybeUninit]>::assume_init_drop
- <[MaybeUninit]>::assume_init_ref
- <[MaybeUninit]>::assume_init_mut
- <[MaybeUninit]>::write_copy_of_slice
- <[MaybeUninit]>::write_clone_of_slice
- String::into_raw_parts
- Vec::into_raw_parts
- ::unchecked_neg
- ::unchecked_shl
- ::unchecked_shr
- ::unchecked_shl
- ::unchecked_shr
- ::as_array
- ::as_array_mut
- ::as_array
- ::as_mut_array
- VecDeque::pop_front_if
- VecDeque::pop_back_if
- Duration::from_nanos_u128
- char::MAX_LEN_UTF8
- char::MAX_LEN_UTF16
- std::fmt::from_fn
- std::fmt::FromFn
- La plateforme cible «riscv64a23-unknown-linux-gnu» a été portée à un deuxième niveau de support, qui implique une garantie de compilation, mais pas de garanties lors du passage des tests.
On peut également noter plusieurs projets liés à Rust :
- Pour le noyau Linux, un framework appelé Rex est en cours de développement, permettant de créer des modules pour le noyau Linux en Rust, qui peuvent être utilisés pour étendre les fonctionnalités du noyau plutôt qu'eBPF. Rex fournit les mêmes garanties de sécurité qu'eBPF, mais utilise les opportunités du langage Rust et un Runtime léger pour l'isolation et la sécurité. Pour ces programmes, aucun vérificateur n'est utilisé, et les programmes sont compilés en code natif par le compilateur Rust.
Dans les programmes Rex, un sous-ensemble du langage Rust garantissant la sécurité est autorisé. Actuellement, 5 types de programmes eBPF sont pris en charge : kprobe, perf_event, tracepoint, xdp et tc. Il est possible d'appeler des fonctions auxiliaires eBPF, d'interagir avec des structures de données de type map eBPF, de gérer les ressources du noyau, de traiter des exceptions et d'utiliser des wrappers et des abstractions sur les structures du noyau.
- La version Fjall 3 est disponible, un stockage embarqué écrit en Rust, travaillant avec des données au format clé-valeur. Le stockage des données est réalisé sous la forme d'un journal utilisant un arbre LSM (Log-Structured-Merge), tout comme dans RocksDB, où les modifications sont enregistrées en ajoutant des données à la fin du fichier. Un API de style BTreeMap est proposé pour accéder à la base de données. Des fonctionnalités telles que des espaces de noms, des recherches directes et inverses par intervalle, une compression intégrée, des transactions sérialisables, un stockage distinct des clés et de leurs valeurs très volumineuses, ainsi qu'un entretien automatisé de la base de données en arrière-plan sont prises en charge. Le code est ouvert sous la licence Apache 2.0.
- Le projet Tor a publié la version Arti 1.9.0, une implémentation de l'outil Tor, écrite en langage Rust. Lorsque le code d'Arti atteindra un niveau capable de remplacer entièrement la version en C, les développeurs de Tor prévoient de faire d'Arti l'implémentation principale de Tor et de cesser progressivement le support de l'implémentation en C. La nouvelle version continue d'implémenter des fonctionnalités pour les relais et serveurs les autorités de répertoire (Directory Authority), améliore la prise en charge des ports assignés dynamiquement (proxy.socks_listen = «auto»), et ajoute une API expérimentale pour gérer les clés des services onion.
Source : opennet.ru
