veilletech.fr
2 oct. Feed du jour
#10 RUST Article

Rust 1.99 : des fonctions variadiques écrites en Rust

Écrire printf en Rust devient possible. Vérifier l'appelant, toujours pas.

Rust 1.99 permet de définir des fonctions variadiques à l'ABI C — jusqu'ici Rust ne savait que les appeler — avec un paramètre ... de type VaList. La documentation de Box::leak déconseille désormais de libérer plus tard une mémoire fuitée, au profit de Box::into_raw ou Box::into_non_null. Dix-sept API sont stabilisées, dont Vec::into_parts et std::fs::set_times.

2 min de lectureavancévidéo 1:19
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Box::leak, et ce qu'il ne faut plus faire après
  3. Les API stabilisées
  4. Comment s'y prendre
  5. À retenir

Ce qui se passe

Rust 1.99.0 est sorti le 1er octobre. Rust savait déjà appeler une fonction C variadique comme printf ; il peut désormais en définir une, avec les ABI "C" et "C-unwind".

Rust
/// SAFETY : l'appelant doit passer au moins un i64.
unsafe extern "C" fn first(mut args: ...) -> i64 {
    unsafe { args.next_arg::<i64>() }
}

Le paramètre ... est de type VaList, compatible au niveau binaire avec le va_list du C sur toutes les cibles. Le trait VaArgSafe borne les types lisibles. Le nombre et le type des arguments restent sous la responsabilité de l'appelant, d'où le unsafe. Les fonctions variadiques nues (naked) avec d'autres ABI sont aussi stabilisées, à écrire en assembleur en ligne.

Box::leak, et ce qu'il ne faut plus faire après

La sémantique ne bouge pas, mais la documentation de Box::leak déconseille désormais de « dé-fuiter » : récupérer plus tard une mémoire volontairement fuitée pour la libérer. Ce motif se marie mal avec les optimisations du compilateur, actuelles et futures, et plus encore avec les allocateurs personnalisés qui approchent de la stabilisation. La consigne vaut pour les autres fonctions leak de la bibliothèque standard : préférer Box::into_raw ou Box::into_non_null quand la mémoire doit revenir.

Les API stabilisées

Comment s'y prendre

Terminal
rustup update stable

Puis chercher les Box::leak suivis d'un Box::from_raw sur le même pointeur.

Source : Announcing Rust 1.99.0, Rust Blog, 1er octobre 2026.