Aller au contenu

Rust 1.99.1 corrige la mauvaise compilation des bool FFI et deux bugs d'édition de liens

Rust 1.99.1 corrige trois régressions de 1.99.0, dont des fonctions FFI sur x86_64 qui pouvaient renvoyer des valeurs bool autres que 0 ou 1. Mettez à jour avec rustup.

Par Tech AI Wire Team

3 min de lecture

XLinkedIn
Capture d'écran du billet du Rust Blog « Announcing Rust 1.99.1 », daté du 15 octobre 2026, de la Rust Release Team, montrant la commande rustup update stable.

La Rust Release Team a publié Rust 1.99.1 le 15 octobre 2026, deux semaines après Rust 1.99.0. Cette version corrective règle trois régressions, c'est-à-dire des choses qui fonctionnaient dans les versions précédentes puis ont cessé de fonctionner. La plus grave faisait que certaines fonctions qui renvoient un bool à du code C rendaient, sur x86_64, des valeurs autres que 0 ou 1, sans aucun avertissement à la compilation.

Les trois corrections

L'annonce du blog Rust liste une correction pour la bibliothèque standard, une pour le compilateur et une pour l'éditeur de liens.

BugQui était touchéLa correctionIssue
Symbole wcslen manquantCertaines cibles, UEFI en particulierwcslen ajouté à compiler-builtins comme solution de repli#163614
Retour bool FFI mal compiléx86_64Type de retour de nouveau marqué pour l'extension par zéros#163911
rust-lld ne peut pas charger libLLVMmacOS, sans le proxy rustuprust-lld compilé avec un rpath vers libLLVM.dylib#163947

Mettez à jour avec rustup update stable. Le blog suggère aussi de tester les toolchains beta et nightly afin que des régressions comme celles-ci soient repérées avant une version.

Le bug des bool sur x86_64

La FFI, l'interface de fonctions étrangères (foreign function interface), est la façon dont Rust appelle du code C et dont C appelle Rust. Un bool doit arriver exactement sous la forme 0 ou 1. Sur x86_64, les règles d'appel imposent qu'un bool renvoyé soit étendu par des zéros, c'est-à-dire que les bits de poids fort inutilisés du registre sont mis à zéro.

Dans 1.99.0, les bits 1 à 7 du registre de retour n'étaient pas spécifiés, selon le blog, si bien qu'un appelant pouvait voir des valeurs autres que 0 ou 1. La correction marque de nouveau le type de retour pour l'extension par zéros, « comme l'exige l'ABI ». Un signalement a relevé la valeur 16, selon Linux Compatible.

Linux Compatible fait remonter la cause à une modification antérieure, la PR #142389, qui a supprimé l'extension par zéros des types de retour scalaires sur x86_64. Le problème n'est apparu qu'au moment où une modification ultérieure a retiré un filet de sécurité. Le site indique qu'aarch64 et loongarch64 n'étaient pas concernés. PBXScience juge ce bug le plus grave des trois, car il échouait silencieusement.

Les bugs de wcslen et de l'éditeur de liens sur macOS

wcslen est une fonction C qui mesure une chaîne de caractères larges. Une passe d'optimisation de LLVM peut y insérer des appels, mais certaines cibles ne la fournissent pas. Sur UEFI, la couche de firmware qui démarre un PC, tout projet utilisant std était cassé, indique le blog.

Linux Compatible ajoute que l'erreur n'apparaissait que dans les builds de release. En attendant la mise à jour, le site indique un contournement : définir RUSTFLAGS="-C llvm-args=-disable-loop-idiom-wcslen" pour désactiver la passe.

Le troisième bug touchait macOS. Lorsque rust-lld, l'éditeur de liens fourni avec Rust, était lancé sans le proxy rustup, il ne trouvait pas libLLVM.dylib. Un rpath est un chemin de recherche de bibliothèques intégré à un programme, et 1.99.1 en inclut désormais un. Linux Compatible signale le plantage sur Apple Silicon. Le site indique que les toolchains installées avec fenix étaient touchées, car elles ne passent pas par le proxy de rustup.

Cette version fait suite à Rust 1.99.0, sorti le 1er octobre, qui a stabilisé les définitions de fonctions C-variadic et est passé à LLVM 23. PBXScience note que Rust 1.100.0 est en beta et doit sortir le 12 novembre.

Ce que cela signifie pour les développeurs

Mettez à jour maintenant si du code Rust renvoie un bool à C sur x86_64. Les valeurs erronées ne provoquent pas de plantage à elles seules. Un appelant C qui teste == 1 ou utilise la valeur comme index de tableau peut prendre la mauvaise branche sans bruit. Recompilez et redéployez chaque bibliothèque compilée avec 1.99.0 qui expose une telle fonction.

Vérifiez vos journaux et vos résultats de tests des deux dernières semaines pour repérer un comportement FFI inhabituel. Un test qui ne vérifie que des résultats « truthy » n'aurait pas détecté des valeurs comme 16.

Si vous compilez pour UEFI ou des cibles embarquées en mode release, 1.99.1 devrait corriger les erreurs d'édition de liens liées à wcslen. Retirez le contournement RUSTFLAGS une fois la mise à jour faite, pour que l'optimisation s'exécute de nouveau.

Sur macOS, fenix et les autres configurations qui appellent rustc directement, sans rustup, retrouvent un rust-lld fonctionnel. Cela inclut les builds WebAssembly qui passent par lui pour l'édition de liens.

Épinglez la version de votre toolchain dans la CI. Un fichier rust-toolchain.toml fait du passage de 1.99.0 à 1.99.1 un changement explicite et vérifiable en revue.

Sources

  1. Announcing Rust 1.99.1 - Rust Blog
  2. Rust 1.99.1 Released: Three Critical Bugs Fixed in Record Two-Week Turnaround - Linux Compatible
  3. Rust 1.99.1 Released: Three Regressions Fixed - PBXScience

Articles liés

Five dark gray squares in a row that lighten from left to right, ending in a single solid red square.
Programmation

Le type never de Rust, expliqué

Le type never de Rust, écrit !, est le type du code qui ne produit jamais de valeur. Il est stable dans Rust 1.100 après dix ans, et il change le repli de type.