Annonce de Rust 1.96.0
(blog.rust-lang.org)- Rust 1.96.0 peut être installé avec
rustup update stable, et il est possible de participer à la validation des futures versions via les canaux beta/nightly - Les nouveaux types
core::range::Range*implémentent IntoIterator au lieu deIterator, ce qui permet d’implémenterCopyet en fera à terme les types par défaut de la syntaxe de plage - assert_matches! et
debug_assert_matches!affichent aussi la représentationDebugde la valeur quand le motif ne correspond pas, ce qui facilite le diagnostic des échecs de test - Les cibles WebAssembly ne transmettent plus
--allow-undefinedpar défaut, donc les symboles non définis provoquent désormais une erreur de l’éditeur de liens au lieu de devenir des imports - Cargo inclut des correctifs pour CVE-2026-5223 et
CVE-2026-5222destinés aux utilisateurs de registres tiers ; les utilisateurs de crates.io ne sont pas concernés
Principaux changements de Rust 1.96.0
-
Mise à jour et canaux de test
- Les utilisateurs ayant installé Rust avec
rustuppeuvent obtenir Rust 1.96.0 avecrustup update stable - Si
rustupn’est pas installé, il peut être récupéré sur la page d’installation derustupdu site de Rust, et les notes de version détaillées de la 1.96.0 sont également disponibles - Pour participer à la validation des futures versions, il est possible d’utiliser les canaux beta/nightly avec
rustup default betaourustup default nightly, et les bugs peuvent être signalés sur l’issue tracker Rust
- Les utilisateurs ayant installé Rust avec
-
Nouveaux types
Range*- Le
Rangeexistant et les types associés decore::opsétaient souvent supposés êtreCopypar de nombreux utilisateurs, mais ils n’implémentaient pasCopycar ils implémentent directementIterator - Implémenter à la fois
IteratoretCopysur un même type est un footgun signalé par Clippy, ce qui expliquait pourquoi cette approche était évitée - La RFC3550 propose des types de plage alternatifs qui implémentent
IntoIteratorau lieu deIterator, ce qui permet aussi à ces types d’implémenterCopy - La bibliothèque standard stabilise
core::range::Range,core::range::RangeFrom,core::range::RangeInclusiveainsi que les itérateurs associés - Dans une prochaine version de Rust,
core::range::RangeFulletcore::range::RangeTo, réexportés depuiscore::ops, seront ajoutés, tout commecore::range::legacy::*, qui deviendra le nouvel emplacement des types de plage actuels - La syntaxe de plage comme
0..1crée actuellement des types legacy, mais passera aux typescore::rangedans une future édition - Grâce à cette stabilisation, il est désormais possible de stocker des accesseurs de slice dans des types
Copysans séparerstartetend - Exemple :
use core::range::Range; #[derive(Clone, Copy)] pub struct Span(Range<usize>); impl Span { pub fn of(self, s: &str) -> &str { &s[self.0] } } - Le nouveau
RangeInclusiveexpose ses champs publiquement, puisqu’il n’est plus nécessaire d’éviter, comme avec la version legacy, de révéler l’état d’un itérateur épuisé - Comme les nouveaux types doivent d’abord être convertis avant de commencer une itération, leurs champs publics ne posent pas de problème
- Les auteurs de bibliothèques devraient envisager d’utiliser
impl RangeBoundsdans leurs API publiques afin d’accepter à la fois les types de plage legacy et les nouveaux types - Lorsqu’un type concret est nécessaire, il est recommandé de privilégier les nouveaux types de plage, qui deviendront les types par défaut à l’avenir
- Le
-
Macros d’assertion de pattern matching
- Les nouvelles macros
assert_matches!etdebug_assert_matches!vérifient qu’une valeur correspond à un motif donné et, sinon, déclenchent un panic avec la représentationDebugde cette valeur - Ces deux macros sont essentiellement équivalentes à
assert!(matches!(..))etdebug_assert!(matches!(..)), mais la valeur affichée en cas d’échec améliore la capacité de diagnostic - Elles n’ont pas été ajoutées au prélude standard, car cela pourrait entrer en conflit avec des crates tierces populaires qui fournissent des macros du même nom
- Il faut donc les importer explicitement depuis
coreoustdavant utilisation - Exemple :
use core::assert_matches; /// [Random Number](https://xkcd.com/221/) fn get_random_number() -> u32 { // chosen by a fair dice roll. // guaranteed to be random. 4 } fn main() { assert_matches!(get_random_number(), 1..=6); }
- Les nouvelles macros
-
Changement pour les cibles WebAssembly
- Les cibles WebAssembly ne transmettent plus
--allow-undefinedà l’éditeur de liens - Lors de l’édition de liens, les symboles non définis ne sont plus transformés en imports WebAssembly du module
"env", mais provoquent une erreur de l’éditeur de liens - Si tous les symboles liés ne sont pas définis, le module n’est pas lié, ce qui permet de détecter les bugs plus tôt et d’éviter des problèmes accidentels liés, par exemple, aux noms de symboles
- Des symboles liés non définis indiquent généralement un bug de build ou une erreur de configuration
- Si l’ancien comportement était intentionnel, il peut être rétabli avec
RUSTFLAGS=-Clink-arg=--allow-undefined, ou bien#[link(wasm_import_module = "env")]peut être utilisé dans le bloc qui définit les symboles dans le code source - Ce changement est appliqué dans Rust 1.96 à la suite d’une précédente annonce sur le blog
- Les cibles WebAssembly ne transmettent plus
API stabilisées et correctifs de sécurité
-
API stabilisées
-
Deux avis de sécurité Cargo
- Rust 1.96 inclut des correctifs pour deux vulnérabilités Cargo concernant les utilisateurs de registres tiers
- CVE-2026-5223 est une vulnérabilité de gravité moyenne liée à l’extraction de tarballs de crates contenant des liens symboliques
- CVE-2026-5222 est une vulnérabilité de faible gravité liée à l’authentification via des URL normalisées
- Les utilisateurs de crates.io ne sont concernés par aucune de ces deux vulnérabilités
-
Changements supplémentaires
1 commentaires
Avis sur Lobste.rs
J’ai souvent envie d’avoir
assert_matches, mais à chaque fois j’hésite entre ajouter une nouvelle crate ou le réimplémenter moi-mêmeDonc je suis content que ça entre dans la bibliothèque standard
J’aime bien l’étape qui consiste à faire des plages des types
CopyJ’ai parfois été surpris de devoir cloner une plage, et ça correspond aussi mieux à l’intuition selon laquelle
12..34devrait être une donnée petite et copiableCela dit, s’il y a plusieurs types portant le même nom, j’ai un peu peur que VS Code importe le mauvais type la prochaine fois qu’il ajoutera automatiquement une déclaration
usePour la plupart des utilisateurs, l’avantage des nouveaux types est faible, donc ils pourront simplement continuer à utiliser les types existants, et les nouveaux types seront utilisés automatiquement à la prochaine frontière d’édition
J’imagine que ce sont surtout les auteurs de bibliothèques qui voudront prendre explicitement en charge les deux versions qui importeront ces types
On peut modifier le prélude sans casser les projets existants