Réécriture Rust de Bun : « la base de code échoue aux vérifications miri élémentaires et autorise de l’UB en Rust sûr »
(github.com/oven-sh)- Cette issue est actuellement ouverte, et la discussion a été verrouillée comme hors sujet et limitée aux collaborateurs, avec des correctifs associés reliés à #30728 et #30876
- Le signalement explique qu’une valeur créée avec
PathString::initpeut toujours appelerslice()après ledropduBoxd’origine, ce qui amène Miri à signaler unUndefined Behaviorfondé sur une référence pendante - Le code de reproduction passait un tampon créé avec
Box::new(*b"Hello World")àPathString::init(&*test), puis appelaitinit.slice()aprèsdrop(test); Miri renvoyait une erreur au niveau decore::slice::from_raw_parts - robobun a confirmé que le problème se reproduisait, en résumant que
PathString::initest une fonction sûre mais qu’elle efface le lifetime de la slice, ce qui permet de créer un&[u8]pendant - Le correctif lié #30728 vise à transformer en unsafe fn la faille parallèle de
PathString::initetdir_iterator::next(), et à ajouter sur environ 70 sites d’appel des commentairesSAFETYexplicitant l’allocation de support - Il est aussi précisé que ce correctif inclut un compile_fail doctest imposant la présence du mot-clé
unsafedans trois signatures, ainsi qu’une correction d’une fuite de descripteur de fichier sur erreurreaddirdans le resolver - AwesomeQubic ajoute que
PathString::initefface également la provenance et échoue aussi avecMIRIFLAGS=-Zmiri-strict-provenance - JavaDerg explique que
initreçoit le lifetime implicite de&[u8], l’efface via une opération unsafe, puis retourne unSelfqui semble'static, autorisant ainsi use-after-free et invalid aliasing - JavaDerg avertit que, dans le modèle de sûreté de Rust, l’UB peut provoquer des problèmes à des endroits inattendus, qu’un examen plus large de l’usage de
unsafeest nécessaire, et qu’il n’est pas approprié de traduire à l’identique en Rust les approches de gestion mémoire d’autres langages - robobun a ajouté comme commits associés les tests
PathString::initsignature stays unsafe etdir_iterator: make next() unsafe; audit call sites - SimonReiff indique qu’un
grepdeunsafedans les fichiers Rust du dépôt, hors commentaires, retourne 13255 lignes, et demande un retour arrière immédiat ainsi qu’une discussion sur la politique et les procédures d’usage du code généré par IA - Jarred-Sumner explique que le port Rust part actuellement d’un mapping 1:1 aussi proche que possible du code Zig d’origine et qu’il est en cours d’amélioration, tout en demandant de continuer à signaler via de nouvelles issues les bugs ou comportements non sûrs du code Rust
1 commentaires
Commentaires sur Hacker News
Si je me suis intéressé à Bun au départ, c’est parce qu’il était écrit en Zig, et si Zig m’attirait, c’est parce que je faisais confiance aux décisions et au goût d’Andrew Kelley
Si Bun m’a ensuite davantage intéressé, c’est aussi parce que les autres raisons relevaient finalement de choix que je pouvais respecter, et même après le rachat par Anthropic, j’essayais de rester prudemment optimiste
Mais cette fois, cela ressemble à une décision difficile à approuver ; le problème n’est pas Rust en soi, mais si Anthropic gère Bun de cette manière, il devient difficile de continuer à parier dessus comme composant fiable de sa boîte à outils
Il faut faire confiance non seulement au code, mais aussi à la manière de penser derrière, et pour l’instant cela donne l’impression d’un outil réservé à l’usage interne d’Anthropic
Cette orientation peut être une manière d’y remédier, donc à voir
En tant qu’ancien fan de Deno, Bun me semblait être un Deno moins ambitieux, et comme je n’avais pas envie d’apprendre Zig, j’avais peu de chances de toucher à Bun lui-même, même comme hobby
Mais au fil des dernières années, en essayant de maintenir un assez gros codebase TypeScript de manière moins dépendante du runtime, je me suis progressivement ouvert à Bun, et même si je ne voulais pas faire d’un runtime TypeScript particulier une exigence, Bun continuait à offrir des raisons que Deno offrait aussi : Postgres, SQLite, S3, WebSocket, stockage local de secrets, bundling, compilation, vitesse
Aujourd’hui, je transforme plusieurs serveurs API et serveurs d’apps frontend en exécutables uniques
bun build --compile --bytecode, que je peux lancer et déployer presque partoutCela dit, je ne pense pas que cette approche soit courante, et si ce portage piloté par LLM échoue, je suis dans une position idéale pour regretter toutes mes décisions liées à Bun
Mais si ça ne rate pas, c’est intéressant. Ce sera un bon exemple de ce qu’il est possible de faire avec les LLM, et le fait que Bun soit désormais développé en Rust est, pour moi, un plus
Et même si ça échoue, ce sera une information importante. Bun est l’un des principaux runtimes TS/JS, et Anthropic dispose de ressources énormes, d’un accès aux derniers modèles et d’un budget quasiment illimité ; s’ils n’y arrivent pas, cela voudra presque dire que c’est encore vraiment impossible
Si le but était de déplacer Zig vers du Rust non sûr, je ne comprends pas pourquoi ils n’ont pas créé un outil de traduction
Ils auraient pu obtenir une transformation déterministe en mappant les structures des langages en un-à-un et en codant en dur les motifs du codebase ; comme disait un ami, on aurait même pu faire quelque chose du genre « brancher
zig translate-csur c2rust »Le résultat actuel est encore moins digne de confiance que l’entrée. L’entrée n’était pas memory-safe, mais c’était du code écrit par des humains ; la sortie n’est pas memory-safe non plus, elle est issue de vibe coding, et on dirait qu’aucun humain ne l’a vraiment relue
Je ne vois pas l’intérêt d’abuser d’une IA agentique pour ce type d’usage
Cela imite la sémantique des pointeurs non sûrs du C au moyen d’une bibliothèque de fonctions Rust non sûres, et le résultat est atroce
Il y a quelques années, quelqu’un a essayé de convertir avec c2rust pendant que je regardais un bug d’OpenJPEG, et le Rust non sûr généré produisait lui aussi un segmentation fault exactement au même endroit que le code C
C’est compatible, mais pas sûr
L’idée essentielle, c’est qu’il ne faut pas faire de manipulation de chaînes en C ni en Rust non sûr. Ce sont des outils totalement inadaptés à la tâche
zig translate-csur c2rust » ne marche pas aussi simplement qu’on l’imagineCes outils génèrent beaucoup d’erreurs et rendent le code très verbeux et difficile à raisonner
Ça peut convenir à de petites applis, mais pas à une réécriture complète
Plutôt que de traduire Zig vers Rust, je pense qu’il vaudrait mieux écrire un parseur JPEG en Python statique, puis l’abaisser vers Zig et Rust avec des structures idiomatiques propres à chaque langage
J’ai créé pour cela un parseur d’un dialecte Python conçu pour ce genre d’objectif, et j’essaie d’y intégrer certaines fonctionnalités Rust/Zig qui facilitent la traduction tout en gardant la compatibilité avec la plupart du code Python
Un parseur JPEG fait aussi partie des ressources d’exemple
https://github.com/py2many/static-python-skill
https://github.com/py2many/spy-ast
Cette issue prête à confusion
Le problème n’est pas l’existence même de comportement indéfini que miri peut détecter, mais le fait d’exposer une API capable de provoquer un comportement indéfini depuis du code sûr. Et miri ne peut le détecter que si l’on écrit un test qui le démontre
Pendant un portage initial depuis un langage non sûr, ce genre de chose n’est pas totalement déraisonnable
L’équipe Bun semble d’ailleurs examiner ensuite si les fonctions qui encapsulent du code non sûr sont correctes
Le fait d’avoir marqué temporairement certaines fonctions non sûres comme sûres pendant la phase de portage n’est pas en soi un énorme problème, mais les avoir fusionnées dans le dépôt principal dans cet état est un peu étrange
Le vrai problème, c’est de publier un code dans cet état
Ce qui est regrettable, c’est qu’ils n’aient pas configuré l’exécution immédiate des tests avec miri. Les LLM réagissent bien à de bons tests
Je le pense non pas à cause de cette issue GitHub, mais parce qu’un autre test [1] invoque réellement un comportement indéfini que miri détecterait. Cela dit, le code testé ne semble utilisé nulle part, donc l’impact réel ne paraît pas très important
On en est au début du portage, donc cela pourra être corrigé plus tard, et il sera peut-être même possible d’éliminer du code non sûr qui n’est en fait pas nécessaire
[1] https://github.com/oven-sh/bun/blob/4d443e54022ceeadc79adf54... - les pointeurs dérivés de la première référence mutable sont invalidés lorsqu’une nouvelle référence mutable au même objet est créée. En termes de style C, on peut voir une « référence mutable » comme une « référence
restrictsur laquelle on effectue de petites modifications »Pour faire les choses correctement, il aurait fallu dériver tous les pointeurs de la même référence mutable ; ils ne l’ont simplement pas fait
Si vous débarquez en masse sur GitHub pour spammer, cela ne fera que réduire les chances qu’ils travaillent en public. J’aimerais qu’on évite ça
Et il vaut mieux suspendre son jugement jusqu’à ce que ce soit dans un état publiable. Évaluer un travail en cours n’est ni très juste, ni très intéressant
mainfonctionne toujoursParce que le CI/CD repose au fond sur l’hypothèse que chaque commit doit fonctionner
Du code en cours de développement qui ne fonctionne pas, comme pour une réécriture complète, devrait être fait sur une branche
Cela permet aussi de garder un
mainopérationnel lorsqu’il faut, par exemple, faire un correctif de sécuritéCe résultat n’a rien de surprenant, puisque la demande était presque celle d’un portage littéral
On peut aussi considérer qu’il vaut mieux d’abord déplacer Bun vers un langage doté d’un système de types plus fort, puis s’appuyer sur ce système pour améliorer ensuite le code
Cela paraît préférable à exiger la perfection dès la première étape
Ils traitent les issues au fur et à mesure
En revanche, il est décevant que les API de ce code Rust puissent provoquer un comportement indéfini sans être marquées
unsafeSi j’avais fait ce type de traduction, j’aurais été conservateur et j’aurais d’abord marqué tout ou presque comme
unsafeEnsuite, il aurait suffi de vérifier progressivement la sûreté de chaque morceau
Honnêtement, j’ai été un peu surpris par l’affirmation selon laquelle ils l’auraient rendu complètement fonctionnel en une semaine
Mon projet perso https://tsz.dev a une ambition similaire, mais je ne peux pas prétendre avoir réussi
Je continue d’ajouter des tests pour vérifier le comportement, et même après avoir fait passer tous les tests de TypeScript lui-même, je trouve encore, comme prévu, des bugs
Le niveau d’exigence pour reproduire le comportement de
tscest vraiment extrêmement élevéhttps://github.com/type-challenges/type-challenges
Je ne suis pas opposé au fait d’écrire beaucoup de code avec des LLM, mais maintenant qu’ils permettent de produire du code à cette vitesse, la validation doit être 100 fois plus solide
Je ne suis pas opposé à l’usage d’agents, mais faire ça dans la précipitation et prendre la communauté de court donne une image extrêmement amateur
C’est le genre de comportement qu’on attendrait d’un jeune ingénieur très enthousiaste
C’est excellent. TypeScript a besoin de plus de choses de ce genre, et j’espère que cela gagnera en visibilité au point que Microsoft l’adopte
Cela dit, je serais prudent avec le nom sound mode
La phrase « ce n’est pas une preuve de solidité au sens mathématique, et cela ne rend pas vrais les fichiers
.d.tstiers » mélange deux choses totalement différentesD’abord, la solidité est un concept mathématique. Si quelque chose est sound, alors c’est réellement sound, et cela signifie qu’on peut faire confiance au compilateur sans avoir à vérifier manuellement les détails
Des bugs d’implémentation peuvent certes le faire mal fonctionner, mais ils peuvent être corrigés ; la soundness signifie qu’il n’existe pas, en théorie, de bug intrinsèque dans la spécification ou dans le système de types
Ensuite, dans les langages réels, il est parfaitement normal et attendu qu’il existe des fonctionnalités non vérifiées que l’on suppose utilisées correctement par les humains. Par exemple
unsafeCoerceen Haskell ousun.misc.unsafeen JavaLe vrai problème, c’est lorsque le système de types se brise même sans utiliser ces fonctionnalités
Je n’ai regardé le code que quelques minutes, mais on dirait qu’activer les optimisations le casserait gravement
Avec en plus une grosse suite de tests existante, des outils pour paralléliser les agents et un budget de tokens pratiquement illimité, il ne faut pas non plus se décourager trop vite
Il y a un livre [0] qui a beaucoup changé ma façon de voir l’attention et les médias
Le livre lui-même n’est pas extraordinaire, mais il met le doigt sur quelque chose de pertinent ici
Il existe une énorme asymétrie entre la portée d’une grande annonce spectaculaire, du genre « Bun a été réécrit en quelques semaines en Rust memory-safe », et la portée des rectifications, qu’on retrouve par exemple dans les notes de bas de page d’anciens articles ou au milieu d’issues GitHub
Cette asymétrie est bien comprise et activement exploitée par l’industrie du marketing et des RP
[0] https://en.wikipedia.org/wiki/Trust_Me,_I%27m_Lying
Pour l’instant, cela reste en grande partie assez superficiel
Fusionner un gros portage assisté par LLM était clairement une décision très audacieuse, mais dans ce que les gens pointent réellement dans le résultat, je ne vois pas grand-chose qui me paraisse pire que dans d’autres portages en cours
Chaque problème découvert est exagérément monté en épingle
Dans toutes les discussions sur ce sujet, il y a des dizaines de commentaires disant que le codebase vibe codé allait exploser sous le poids de blocs
unsafenon audités, et que des gens qui semblent ne pas comprendre Rust l’ont relu à la légèreOn a même parfois l’impression qu’ils s’énervent contre l’idée même qu’il faille comprendre un langage de programmation, quel qu’il soit
Les gens retiennent souvent l’article ou le titre initial, mais ne voient jamais la correction
Le portage est encore en cours, il n’y a donc pas eu de grande annonce spectaculaire, et ce n’est ni terminé ni publié
Ce que je vois, ce sont plutôt des moqueries opportunistes sur du code en cours de développement, ainsi que des tentatives de suggérer que l’équipe aurait dit que c’était terminé ou parfait
La réécriture n’était qu’une traduction de code destinée à servir de point de départ
L’équipe de Bun n’a jamais annoncé en fanfare que le code était désormais memory-safe, et elle a toujours clairement dit qu’il s’agissait d’un point de départ
Exiger qu’il soit immédiatement parfait et qu’il corrige tous les problèmes mémoire du code Zig d’origine, c’est se battre contre une annonce imaginée, pas contre ce que l’équipe Bun a réellement déclaré
Je me demande aussi si quelqu’un a essayé de faire la correspondance avec les problèmes mémoire existant déjà dans le codebase d’origine
Ce type d’erreurs était prévisible
Pour ceux qui ont besoin de stabilité, ils ont laissé la version stable en Zig, et j’imagine que les erreurs finiront par être corrigées
L’écosystème Rust dispose d’outils bien connus pour les détecter, et même s’ils n’attrapent pas tous les comportements indéfinis causés par des erreurs dans les blocs
unsafe, les exécuter est considéré comme une bonne pratiqueCe qui m’inquiète le plus, c’est la méta-discussion
Au départ, j’ai regardé d’un œil critique les mainteneurs qui avaient fermé cette issue GitHub comme hors sujet
Puis j’ai vu que l’interface GitHub repliait automatiquement en bloc des messages sans aucune valeur informative, qui semblaient venir en masse de forums ou d’un Discord communautaire
Cela met tout le monde dans une situation perdante
Si quelqu’un découvre un problème sérieux qui peut légitimement inquiéter une grande partie de la communauté concernée, il a de bonnes raisons de le faire savoir aussi largement que possible
Il s’agit d’une demande substantielle à propos de changements récents, et le fait de critiquer le ton n’enlève rien à la réalité des faits
Le problème, c’est qu’un surplus d’attention tue littéralement la discussion
Du côté des mainteneurs, cela peut aussi servir de bouclier à ceux qui prennent des décisions plus émotionnelles, voire proches d’une psychose liée à l’IA
Un projet dominé par une mentalité de siège, qui bloque et ignore les critiques, peut très vite dérailler
À l’inverse, dans un projet qui ne protège pas ses mainteneurs de l’anxiété et des pathologies liées à l’IA, le burnout des mainteneurs devient inévitable
Cette réécriture de Bun donne l’impression d’un événement potentiellement conçu pour le marketing de Mythos
Le battage médiatique et la publicité autour du sujet proviennent surtout, pour l’instant, des réactions négatives de personnes hostiles à l’IA
À mon avis, cela est aussi fortement lié à la perception plus négative d’Anthropic elle-même, alimentée par certaines de ses décisions récentes
On a l’impression que seuls les besoins d’Anthropic comptent et qu’ils se moquent du reste
Ensuite ils fanfaronnent, publient un billet de blog disant « Claude Code a permis à l’équipe Bun de réécrire plus d’un million de lignes de Zig en Rust », et les VC salivent
Ça échoue à des vérifications de base
On ne sait pas non plus combien d’argent ils dépensent encore pour laisser Mythos mettre le codebase en pièces
Puis ils publient un autre billet de blog
Des escrocs et des naïfs applaudissent et les défendent contre la « foule anti-IA délirante »
Les VC sont encore plus excités
Voilà comment on gagne de l’argent
Et ensuite on en arrive à l’idée qu’il faut aussi supprimer les ingénieurs logiciel
Il y a déjà des bindings vers un autre langage non sûr dans un codebase écrit dans un langage non sûr, donc je ne comprends pas pourquoi on suppose que cela allait paraître immédiatement parfaitement implémenté