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 :
Code : | Sélectionner tout |
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 |
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