Sortie de Rust 1.53. Google financera l'ajout du support de Rust dans le noyau Linux

La version 1.53 du langage de programmation système Rust a été publiée. Développé à l'origine par Mozilla, il est désormais soutenu par l'organisation à but non lucratif Rust Foundation. Ce langage se concentre sur la sécurité de la mémoire, offre une gestion automatique de la mémoire et fournit des outils pour atteindre un haut niveau de parallélisme des tâches, le tout sans nécessiter de ramasse-miettes ni d'exécution au moment de l'exécution (l'exécution se limite à l'initialisation de base et à la maintenance de la bibliothèque standard).

La gestion automatique de la mémoire dans Rust libère le développeur des erreurs associées à la manipulation des pointeurs et le protège des problèmes causés par un travail à bas niveau sur la mémoire, tels que l'accès à la mémoire après sa libération, la déréférencement de pointeurs nuls, les dépassements de tampon, etc. Un gestionnaire de paquets, Cargo, est développé pour faciliter la distribution des bibliothèques, la construction et la gestion des dépendances du projet. Le dépôt crates.io est utilisé pour héberger les bibliothèques.

Les principales nouveautés :

  • Pour les tableaux, le trait IntoIterator a été mis en œuvre, permettant d'itérer sur les éléments d'un tableau par leurs valeurs : for i in [1, 2, 3] { .. }

    Il est également désormais possible de passer des tableaux à des méthodes qui acceptent des itérateurs, par exemple : let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Auparavant, IntoIterator n'était implémenté que pour les références de tableaux, donc pour itérer sur les valeurs, il était nécessaire d'utiliser des références («&[1, 2, 3]») ou «[1, 2, 3].iter()». Les implémentations de IntoIterator pour les tableaux étaient entravées par des problèmes de compatibilité, causés par la transformation précédemment ajoutée dans le compilateur de la méthode array.into_iter() en (&array).into_iter(). Ces problèmes ont été contournés — le compilateur continuera à transformer array.into_iter() en (&array).into_iter(), comme si l'implémentation du trait IntoIterator n'existait pas, mais uniquement lors de l'appel de la méthode en utilisant la syntaxe «.into_iter()» et sans toucher aux appels sous la forme «in [1, 2, 3]», «iter.zip([1, 2, 3])», «IntoIterator::into_iter([1, 2, 3])».

  • Il est maintenant possible d'utiliser l'expression «|» (opération logique OU) à n'importe quelle partie du modèle, par exemple, au lieu de «Some(1) | Some(2)», on peut écrire «Some(1 | 2)» : match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } }
  • L'utilisation de caractères non-ASCII dans les identifiants est autorisée, y compris tous les caractères nationaux définis dans la spécification Unicode UAX 31, à l'exception des symboles emoji. Lors de l'utilisation de caractères différents, mais ressemblants, le compilateur émettra un avertissement. const BLÅHAJ: &str = «🦈»; struct 人 { 名字: String, } let α = 1; let sos = 2; avertissement: la paire d'identifiants est considérée comme confusible entre ‘s’ et ‘s’
  • Une nouvelle série d'API a été traduite dans la catégorie stable, y compris les éléments stabilisés :
    • array::from_ref
    • array::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::retain
    • BTreeMap::retain
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Duration::ZERO
    • Duration::MAX
    • Duration::is_zero
    • Duration::saturating_add
    • Duration::saturating_sub
    • Duration::saturating_mul
    • f32::is_subnormal
    • f64::is_subnormal
    • IntoIterator pour les tableaux
    • {integer}::BITS
    • io::Error::Unsupported
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • Option::insert
    • Ordering::is_eq
    • Ordering::is_ne
    • Ordering::is_lt
    • Ordering::is_gt
    • Ordering::is_le
    • Ordering::is_ge
    • OsStr::make_ascii_lowercase
    • OsStr::make_ascii_uppercase
    • OsStr::to_ascii_lowercase
    • OsStr::to_ascii_uppercase
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • Peekable::peek_mut
    • Rc::increment_strong_count
    • Rc::decrement_strong_count
    • slice::IterMut::as_slice
    • AsRef<[T]> pour slice::IterMut
    • impl SliceIndex pour (Bound<usize>, Bound<usize>)
    • Vec::extend_from_within
  • Un troisième niveau de support a été mis en œuvre pour la plateforme wasm64-unknown-unknown. Le troisième niveau suppose un support de base, mais sans test automatisé, publication de versions officielles et vérification de la capacité à construire du code.
  • Le gestionnaire de paquets Cargo utilise par défaut le nom «main» pour la branche principale du dépôt Git (HEAD). Pour les dépendances hébergées dans des dépôts utilisant le nom main au lieu de master, il n'est plus nécessaire de le spécifier dans les paramètres branch = «main».
  • Dans le compilateur, les exigences relatives à la version minimale de LLVM ont été élevées à LLVM 10.

Il convient également de noter le financement de l'intégration des outils de développement de composants en langage Rust dans le noyau Linux. Ce travail sera effectué dans le cadre du projet Prossimo sous l'égide de l'organisation ISRG (Internet Security Research Group), qui est à l'origine du projet Let’s Encrypt et soutient la promotion de HTTPS et le développement de technologies pour améliorer la sécurité d'Internet. Les fonds seront fournis par Google, qui paiera le travail de Miguel Oheda, l'auteur du projet Rust-for-Linux. Auparavant, ISRG et Google ont déjà financé la création d'une alternative HTTP pour l'outil curl et le développement d'un nouveau module TLS pour le serveur http Apache.

Selon les entreprises Microsoft et Google, environ 70 % des vulnérabilités sont causées par une gestion non sécurisée de la mémoire. L'utilisation du langage Rust pour développer des composants du noyau, comme les pilotes de périphériques, devrait réduire le risque de vulnérabilités liées à une gestion non sécurisée de la mémoire et éliminer des erreurs telles que l'accès à une zone de mémoire après sa libération et le dépassement de tampon.

La sécurité de la mémoire est assurée dans Rust au moment de la compilation par la vérification des références, le suivi de la propriété des objets et la prise en compte de la durée de vie des objets (portée), ainsi que par l'évaluation de l'accès à la mémoire lors de l'exécution du code. Rust fournit également des moyens de protection contre les débordements d'entiers, exige l'initialisation obligatoire des variables avant leur 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, et propose une forte typage statique pour minimiser les erreurs logiques.

Source : opennet.ru

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster