Rust 1.45.0 est disponible avec la correction du problème de la conversion entre des entiers et des flottants
et de nombreuses fonctionnalités
L’équipe de développement de Rust a publié mercredi une nouvelle mise à jour pour le langage. Rust 1.45.0 est livré avec très peu de nouvelles fonctionnalités, mais plusieurs améliorations et correctifs de bogues. Il y a également dans cette version la stabilisation de certaines API. Voici en quelques lignes ce dont il s’agit.
Correction des défauts de solidité des casts
Le compilateur Rust dans Rust 1.44.0 et les anciennes versions du langage produirait un LLVM-IR qui ressemble à ceci :
Ce fptoui implémente le cast, c'est l'abréviation de “floating point to unsigned integer”. Mais selon l’équipe Rust, il y a un problème à cela. D'après la documentation du langage, l'instruction “fptoui” convertit son opérande à virgule flottante en la valeur entière non signée la plus proche (arrondie à zéro). Si la valeur ne peut pas tenir dans ty2, le résultat est une valeur “empoisonnée”. Cela signifie que si vous transformez un nombre à virgule flottante qui est grand en un nombre entier qui est petit, vous obtenez un comportement indéfini.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 define i8 @_ZN10playground4cast17h1bdf307357423fcfE(float %x) unnamed_addr #0 { start: %0 = fptoui float %x to i8 ret i8 %0 }
Ce comportement n’est par exemple pas défini :
Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 fn cast(x: f32) -> u8 { x as u8 } fn main() { let f = 300.0; let x = cast(f); println!("x: {}", x); }
Avec Rust 1.44.0, il se trouve que cela imprime “x : 0”, mais il pourrait imprimer n'importe quoi, ou faire n'importe quoi. C'est un comportement indéfini. Mais il n’y a pas de code “unsafe” ici. On appelle cela un bogue de “solidité”, c'est-à-dire un bogue où le compilateur fait quelque chose d’inattendu. Cela dit, le problème est maintenant résolu. Selon l’équipe, ce bogue a pris beaucoup de temps à être résolu, car elle n’était pas du tout sûre de la bonne marche à suivre. Finalement, il a été décidé qu’il vous faudra ajouter un nouveau casting unsafe si vous vouliez sauter les contrôles.
Selon l’équipe, cela ressemble beaucoup à l'accès aux tableaux. Par exemple, array[i] vérifiera que le tableau comporte au moins i + 1 éléments. Vous pouvez donc utiliser unsafe { array.get_unchecked(i) } pour sauter la vérification. Toutefois, elle a mis en garde contre cette méthode. « Mais comme toujours, vous ne devez utiliser cette méthode qu'en dernier recours. Tout comme pour l'accès aux tableaux, le compilateur peut souvent optimiser les vérifications, rendant les versions sûres et non sécurisées équivalentes lorsque le compilateur peut le prouver », a-t-elle déclaré.
Stabilisation des macros procédurales de type fonctionnel dans les expressions, les modèles et les énoncés
Dans Rust 1.45.0, des fonctions comme les macros procédurales peuvent maintenant être utilisées dans les positions d'expression, de modèle et de déclaration. Cela signifie que vous pouvez maintenant utiliser une macro procédurale de type fonction partout où vous pouvez utiliser une macro déclarative (macro_rules !). Rust 1.45.0 introduit aussi d’autres améliorations au niveau du compilateur, dont :
- il est désormais possible de remplacer les entités cibles individuelles via l'indicateur target-feature. Par exemple, -C target-feature=+avx2 -C target-feature=+fmaest maintenant équivalent à -C target-feature=+avx2,+fma ;
- ajout du drapeau force-unwind-tables. Cette option permet à rustc de toujours générer des tables de déroulement, quelle que soit la stratégie de panique ;
- ajout du drapeau embed-bitcode. Cet indicateur de codegen permet à rustc d'inclure le bitcode LLVM dans les rlibs générés (c'est activé par défaut) ;
- ajout de la valeur tiny à l'indicateur codegen code-model ;
- ajout du support de niveau 3 pour la cible mipsel-sony-psp ;
- ajout du support de niveau 3 pour la cible thumbv7a-uwp-windows-msvc.
En outre, à partir de cette version, Rust prend désormais en charge le code barré dans Markdown. Enfin, plusieurs API sont stabilisées dans Rust 1.45.0, notamment :
- Arc::as_ptr ;
- BTreeMap::remove_entry ;
- Rc::as_ptr ;
- rc::Weak::as_ptr ;
- rc::Weak::from_raw ;
- rc::Weak::into_raw ;
- str::strip_prefix ;
- str::strip_suffixe ;
- sync::Weak::as_ptr ;
- sync::Weak::from_raw ;
- sync::Weak::into_raw ;
- char::UNICODE_VERSION ;
- Span::resolved_at ;
- Span::located_at ;
- Span::mixed_site ;
- unix::process::CommandExt::arg0.
Source : Note de version de Rust 1.45.0, Page GitHub de Rust
Et vous ?
Que pensez-vous des nouveautés apportées dans Rust 1.45.0 ?
Voir aussi
Rust 1.43.0 est disponible avec de nouvelles API stabilisées, des améliorations de performances du compilateur et une petite fonctionnalité liée aux macros
Rust 1.44.0 est disponible et apporte la commande cargo tree à Cargo pour l'impression d'un graphe arborescent des dépendances
Rust 1.42.0 : Pin::{map_unchecked, map_unchecked_mut} ne nécessite plus le type de retour pour implémenter Sized, Error::description est désormais obsolète
Rust et WebAssembly - Tour d'horizon des points philosophiques régissant son développement, par Anthony Defranceschi
Partager