Skip to content

Rust 1.99 : les fonctions variadiques C arrivent

Rust 1.99 stabilise les fonctions variadiques extern "C", de nouvelles API mémoire et prépare la fin des outils hôtes sur Windows 32 bits.

Publié le 3 min de lecture
Rust 1.99 : les fonctions variadiques C arrivent

Avec Rust 1.99, le langage sait enfin écrire ce qu'il savait seulement appeler. Publiée le 1er octobre 2026 par l'équipe de release, cette version stabilise la définition de fonctions variadiques compatibles avec l'ABI C, précise les règles de calcul de la taille des valeurs derrière des pointeurs bruts et ajoute une série d'API à la bibliothèque standard. Un second billet annonce par ailleurs un changement de statut pour Windows 32 bits à partir de Rust 1.100.

Des fonctions variadiques écrites en Rust

Jusqu'ici, Rust pouvait appeler des fonctions externes à nombre d'arguments variable, comme printf, mais pas en définir. Rust 1.99 lève cette limite pour les ABI "C" et "C-unwind" : une fonction unsafe extern "C" peut désormais déclarer une liste d'arguments ....

Le type de cette liste est VaList, que l'équipe présente comme compatible avec le va_list du C sur toutes les cibles. Les arguments se lisent un à un avec next_arg::<T>(), et le trait VaArgSafe détermine quels types peuvent être extraits. L'opération reste unsafe : c'est à l'appelant de garantir que le nombre et le type des arguments correspondent. L'intérêt est surtout pour l'interopérabilité, par exemple pour réimplémenter en Rust une bibliothèque C qui expose ce type d'interface.

Taille et alignement depuis un pointeur brut

Deuxième chantier : les exigences de sûreté pour obtenir la taille et l'alignement d'une valeur derrière un pointeur brut sont désormais définies, y compris pour les types non Sized. Trois fonctions sont stabilisées en conséquence : Layout::for_value_raw, mem::size_of_val_raw et mem::align_of_val_raw.

Un avertissement sur Box::leak

La version ne change pas la sémantique du langage, mais la documentation de Box::leak déconseille désormais de libérer plus tard une mémoire volontairement « fuitée ». Selon l'équipe, ce motif pose problème avec les optimisations actuelles et futures du compilateur, et le sujet prendra de l'importance avec la stabilisation à venir des allocateurs personnalisés. Les alternatives recommandées sont Box::into_raw et Box::into_non_null.

Les API stabilisées

La liste comprend notamment :

  • Box::into_non_null et Box::from_non_null ;
  • Vec::into_parts et Vec::from_parts ;
  • IntoIterator pour Box<[T; N]> et ses références ;
  • VecDeque::retain_back ;
  • String::from_utf8_lossy_owned et FromUtf8Error::into_utf8_lossy ;
  • std::fs::set_times et std::fs::set_times_nofollow.

Les changements propres à Cargo et Clippy sont renvoyés à leurs journaux de modifications respectifs. Pour mettre à jour une installation existante, la commande reste rustup update stable.

Windows 32 bits perd ses outils hôtes avec Rust 1.100

Dans un billet publié le 2 octobre, l'équipe annonce qu'à partir de Rust 1.100, la cible i686-pc-windows-msvc passera en Tier 1 « sans outils hôtes » et i686-pc-windows-gnu en Tier 2 « sans outils hôtes ». La bibliothèque standard précompilée restera distribuée, mais pas le compilateur : il ne sera plus possible d'installer une chaîne d'outils Rust sur un hôte Windows 32 bits.

L'équipe justifie ce choix par l'âge du matériel concerné, la fin du support général de Windows 32 bits en octobre 2025 et des difficultés techniques pour construire ces chaînes d'outils. Les binaires 32 bits pourront toujours être produits par compilation croisée, par exemple depuis une chaîne d'outils Windows 64 bits. Les autres plateformes 32 bits ne sont pas concernées.

Côté écosystème, ce rythme de versions régulières rappelle celui d'autres langages que nous suivons, de Python 3.15 à Java 27.

Articles liés

Python 3.15 arrive avec imports paresseux, frozendict, UTF-8 par défaut et un JIT amélioré. Ce qu'il faut tester avant de migrer.
PostgreSQL 19 : release candidate le 15 octobre, version finale visée le 29. REPACK, autovacuum revu et fonctions retirées avant la sortie.
Java 27 généralise le ramasse-miettes G1, active les en-têtes d'objets compacts et ajoute un échange de clés TLS post-quantique. Le point sur ses 9 JEP.