Reescritura de Bun en Rust: "la base de código falla verificaciones básicas de Miri y permite UB en Rust seguro"
(github.com/oven-sh)- Este issue está actualmente en estado Open, y la conversación fue bloqueada por desviarse del tema y limitada a colaboradores; además, se vincularon las correcciones relacionadas #30728 y #30876
- La persona que reportó el problema mostró que un valor creado con
PathString::initpuede seguir llamando aslice()incluso después de que elBoxoriginal haya sidodropped, por lo que Miri reportaUndefined Behaviorbasado en una dangling reference - El código de reproducción consistía en pasar un búfer creado con
Box::new(*b"Hello World")aPathString::init(&*test), y luego llamar ainit.slice()después dedrop(test); Miri arroja el error encore::slice::from_raw_parts - robobun confirmó que el problema se reproduce y resumió que
PathString::inites una función safe, pero aun así borra el slice lifetime, lo que permite crear un&[u8]colgante - El #30728 vinculado apunta a convertir en unsafe fn los huecos paralelos de
PathString::initydir_iterator::next(), y a añadir comentariosSAFETYen unas 70 llamadas para dejar explícita la asignación de respaldo - También se explica que esa misma corrección incluye un compile_fail doctest que obliga a requerir la palabra clave
unsafeen tres firmas, además de una corrección a la fuga de fd por error dereaddiren el resolver - AwesomeQubic añadió además que
PathString::initborra la provenance y que también falla conMIRIFLAGS=-Zmiri-strict-provenance - JavaDerg explicó que
inittoma el lifetime implícito de&[u8], lo borra mediante una operación unsafe y devuelve unSelfque parece'static, permitiendo use-after-free e invalid aliasing - JavaDerg advirtió que, dentro del modelo de seguridad de Rust, el UB puede causar problemas en lugares inesperados; por ello hace falta revisar el uso generalizado de
unsafe, y no es adecuado traducir 1:1 a Rust las estrategias de manejo de memoria de otros lenguajes - robobun añadió como commits relacionados las pruebas de
PathString::initsignature stays unsafe ydir_iterator: make next() unsafe; audit call sites - SimonReiff señaló que el resultado de hacer grep de
unsafeen los archivos Rust del repositorio, excluyendo comentarios, es de 13255 líneas, y exigió revertirlo de inmediato y discutir la política y los procedimientos sobre el uso de código generado por IA - Jarred-Sumner indicó que el port actual a Rust tomó como punto de partida un mapeo 1:1 lo más cercano posible al código original en Zig, y que sigue mejorándose; además pidió que se sigan reportando en nuevos issues los bugs o comportamientos no sólidos del código Rust
1 comentarios
Comentarios en Hacker News
Lo que primero me interesó de Bun fue que estaba escrito en Zig, y lo que me atrajo de Zig fue que confiaba en las decisiones y el criterio de Andrew Kelley
Después, las razones por las que Bun me fue interesando más también terminaron siendo elecciones que me parecían respetables, y hasta después de la adquisición por Anthropic intenté mantener un optimismo cauteloso
Pero este movimiento parece una decisión en la que cuesta confiar; no es que Rust sea el problema, sino que si Anthropic va a manejar Bun de esta manera, ya no se siente como algo por lo que pueda apostar como componente confiable de mi caja de herramientas
No solo hay que confiar en el código, sino también en la forma de pensar que hay detrás, y ahora parece más una herramienta de uso interno de Anthropic
Esta dirección podría ser una forma de corregir eso, así que habrá que ver
Como viejo fan de Deno, Bun me parecía una versión menos ambiciosa de Deno, y como no quería aprender Zig, era poco probable que me pusiera a tocar Bun por hobby
Pero en los últimos años, tratando de mantener una base de código TypeScript bastante grande de una forma menos atada al runtime, me fui abriendo cada vez más a Bun, y aunque no quería hacer de un runtime específico de TypeScript un requisito, Bun seguía dando razones como Postgres, SQLite, S3, websockets, almacenamiento local de secretos, bundling, compilación y velocidad
Ahora estoy convirtiendo varios servidores API y servidores de apps frontend en un único ejecutable con
bun build --compile --bytecodepara ejecutarlo e implementarlo casi en cualquier lugarAun así, no creo que esta forma de trabajar sea común, y si este port basado en LLM falla, estoy en una posición perfecta para arrepentirme de todas mis decisiones relacionadas con Bun
Pero si no falla, es interesante. Sería un caso que muestra lo que se puede hacer con LLM, y que Bun se desarrolle en Rust a futuro me parece una ventaja
Y si falla, igual es información importante. Bun es uno de los runtimes principales de TS/JS, y Anthropic tiene recursos enormes, acceso a los modelos más recientes y un presupuesto prácticamente ilimitado, así que si ellos no pueden hacerlo, casi significa que de verdad todavía es imposible
Si iban a mover Zig a Rust inseguro, no entiendo por qué no hicieron una herramienta de traducción
Podrían haber obtenido una conversión determinista mapeando las estructuras del lenguaje uno a uno y hardcodeando los patrones de la base de código; como dijo un amigo, hasta habría sido posible algo como “conectar
zig translate-cac2rust”El resultado actual es incluso menos confiable que la entrada. La entrada no era memory-safe, pero era código escrito por humanos; la salida no solo no es memory-safe, sino que además fue hecha con vibe coding y ni siquiera parece que un humano la haya revisado bien
No entiendo cuál es el sentido de abusar de una IA agéntica para este uso
Termina imitando la semántica insegura de punteros de C con una biblioteca de funciones inseguras en Rust, así que el resultado es terrible
Hace algunos años, mientras revisaba un bug de OpenJPEG, alguien intentó convertirlo con c2rust, y el Rust inseguro resultante daba segmentation fault exactamente en el mismo punto que el código en C
Es compatible, pero no seguro
La clave es no hacer manipulación de strings en C o en Rust inseguro. Es una herramienta totalmente inadecuada para ese trabajo
zig translate-cac2rust” no funciona tan bien como pareceEstas herramientas tienen muchos errores y generan código muy verboso y difícil de razonar
Puede servir para apps pequeñas, pero no para una reescritura completa
Más que traducir Zig a Rust, me parece mejor escribir un parser JPEG en Python estático y luego bajarlo a Zig y Rust con estructuras idiomáticas para cada lenguaje
Para eso hice un parser de un dialecto de Python pensado para este propósito, y quiero adoptar algunas capacidades de Rust/Zig que faciliten la traducción manteniendo compatibilidad con la mayor parte del código Python
El parser JPEG también está incluido como ejemplo
https://github.com/py2many/static-python-skill
https://github.com/py2many/spy-ast
Este issue lleva a confusión
El problema no es la mera existencia de undefined behavior que miri puede detectar, sino haber expuesto una API que puede provocar undefined behavior desde código seguro. miri también solo lo detecta si escribes un test que lo demuestre
Que esto pase durante un port inicial desde un lenguaje inseguro no es del todo irracional
El equipo de Bun también parece estar revisando después si las funciones que envuelven código inseguro son correctas
Marcar temporalmente algunas funciones inseguras como seguras durante la etapa de port no es en sí un gran problema, pero sí es un poco raro haberlas fusionado así al repositorio principal
El problema real sería liberar código en ese estado
Lo lamentable es que no configuraron desde el inicio la ejecución de tests con miri, porque los LLM responden bien a buenos tests
No lo digo por este issue de GitHub, sino porque otro test [1] sí invoca en la práctica undefined behavior que miri detectaría. Aun así, el código bajo prueba no parece usarse en ninguna parte, así que el impacto real no parece grande
Como esto es el inicio del port, quizá luego lo arreglen, e incluso pueden eliminar código inseguro que en realidad no hace falta
[1] https://github.com/oven-sh/bun/blob/4d443e54022ceeadc79adf54... - los punteros derivados de la primera referencia mutable quedan invalidados cuando se crean nuevas referencias mutables al mismo objeto. En términos de C, se puede pensar en una “referencia mutable” como una “referencia
restrictsobre la que se hace una modificación trivial”Para hacerlo bien, todos los punteros deberían derivarse de la misma referencia mutable, pero simplemente no lo hicieron así
Si van en masa a GitHub a inundarlo, solo van a hacer menos probable que la gente trabaje en público. Ojalá no lo hagan
Y convendría reservar el juicio hasta que esté en un estado publicable. Evaluar trabajo intermedio no es justo ni muy interesante
mainsiempre funcionePorque CI/CD casi parte de la premisa de que todos los commits deberían funcionar
Código en progreso que no funciona, como una reescritura completa, debería ir en una rama
Así también puedes mantener un
mainfuncional cuando haga falta, por ejemplo, una corrección de seguridadEste resultado no sorprende porque lo que se pidió fue casi un port literal
Tal vez tenga sentido mover primero Bun a un lenguaje con un sistema de tipos más fuerte y luego usar ese sistema como base para mejoras posteriores
Parece mejor que exigir perfección desde la primera etapa
Están resolviendo los issues que van entrando
Lo decepcionante es que la API del código Rust pueda provocar undefined behavior sin estar marcada como
unsafeSi yo hiciera una traducción así, sería conservador y al principio marcaría todo o casi todo como
unsafeLuego ya se puede verificar gradualmente la seguridad de cada parte
Sinceramente, me sorprendió un poco que dijeran que quedó totalmente funcional en solo una semana
Mi proyecto paralelo https://tsz.dev tiene una ambición parecida, pero no puedo decir que haya tenido éxito
Sigo agregando tests para comprobar el comportamiento, y aun después de pasar todos los tests del propio TypeScript sigo encontrando bugs, como era de esperarse
El estándar de igualar el comportamiento de
tsces realmente altísimohttps://github.com/type-challenges/type-challenges
No estoy en contra de escribir mucho código con LLM, pero ahora que se puede producir código a esta velocidad, la validación tiene que ser 100 veces más sólida
No estoy en contra de usar agentes, pero apresurar algo así y sorprender de golpe a la comunidad se ve muy amateur
Es el tipo de comportamiento que uno esperaría de un ingeniero junior demasiado entusiasta
Esto es excelente. TypeScript necesita más cosas así, y ojalá se conozca más para que Microsoft incluso lo adopte
Eso sí, habría que tener cuidado con llamarlo sound mode
La frase “no es una prueba de soundness en el sentido matemático, y no hace verdaderos los archivos
.d.tsde terceros” mezcla dos cosas completamente distintasPrimero, la soundness es un concepto matemático. Si algo es sound, realmente lo es, y significa que puedes confiar en el compilador sin tener que revisar los detalles manualmente
Si hay bugs de implementación, puede fallar, pero eso se puede corregir; la soundness significa que no hay fallas teóricas en la especificación o en el sistema de tipos mismo
Segundo, es totalmente razonable y esperable que un lenguaje real necesite capacidades no verificadas en las que se confía en que la gente use correctamente. Como
unsafeCoerceen Haskell osun.misc.unsafeen JavaEl problema real es cuando el sistema de tipos se rompe incluso sin usar esas capacidades
Solo miré el código unos minutos, pero parece que se va a romper fuerte apenas actives optimizaciones
Además del gran test suite existente, debían tener herramientas para paralelizar agentes y un presupuesto de tokens prácticamente ilimitado, así que tampoco hay que desanimarse demasiado
Hay un libro [0] que me cambió mucho la manera de pensar sobre la atención y los medios
El libro en sí no es tan bueno, pero sí señala algo relevante aquí
Hay una enorme asimetría entre el alcance de un anuncio grande y llamativo, por ejemplo “Bun fue reescrito en Rust memory-safe en unas pocas semanas”, y el alcance de la corrección, por ejemplo una nota al pie en un artículo viejo o un issue de GitHub
Esta asimetría es algo que la industria del marketing y PR entiende muy bien y explota activamente
[0] https://en.wikipedia.org/wiki/Trust_Me,_I%27m_Lying
Por ahora, la mayoría se ve bastante superficial
Fusionar un port grande asistido por LLM fue sin duda una decisión muy audaz, pero no veo mucho de lo que la gente señala sobre el resultado real que me parezca peor que otros ports en progreso
Cada issue que aparece se está inflando de más
En todas las discusiones sobre este tema aparecieron decenas de comentarios diciendo que la base de código hecha con vibe coding iba a explotar por bloques
unsafeno auditados, y que parecía haber gente revisándola por encima sin entender RustIncluso a veces parecía que se enojaban con la mera idea de que haya que entender cualquier lenguaje de programación
La gente suele recordar el artículo o titular original, pero no llega a ver la corrección
El port todavía está en curso, así que no hubo ningún gran anuncio llamativo, y todavía no está terminado ni liberado
Lo que sí veo como anuncio llamativo son las burlas oportunistas sobre código en progreso, y los intentos de insinuar que el equipo dijo que ya estaba terminado o perfecto
La reescritura era una traducción de código para usarla como punto de partida
El equipo de Bun nunca anunció a lo grande que el código ahora fuera memory-safe, y siempre dejó claro que era un punto de partida
O sea, esperar que fuera perfecto de inmediato y que resolviera todos los problemas de memoria del código original en Zig es pelear con un anuncio imaginario, no con lo que el equipo de Bun realmente dijo
También me pregunto si alguien ha intentado mapear si este problema de memoria ya existía en la base de código original
Este tipo de errores era previsible
Para la gente que necesita estabilidad, dejaron la versión estable en Zig, y supongo que con el tiempo esos errores se van a corregir
El ecosistema Rust tiene herramientas bien conocidas para detectar este tipo de errores, y aunque no atrapen todo el undefined behavior causado por equivocaciones en bloques
unsafe, ejecutarlas se considera una buena prácticaLo que más me preocupa es la metaconversación
Al principio vi de forma crítica a los mantenedores que cerraron este issue de GitHub por considerarlo fuera de tema
Pero la interfaz de GitHub estaba auto-plegando en masa mensajes sin ningún valor informativo, y esos mensajes parecían venir en oleadas desde foros o el Discord de la comunidad
Esto pone a todos en una situación perdedora
Alguien que encuentra un problema importante que preocuparía a buena parte de una comunidad tiene razones de sobra para difundirlo lo más ampliamente posible
Es un pedido sustancial sobre cambios recientes, y cuestionar el tono no hace desaparecer la veracidad
El problema es que la atención extra literalmente mató la discusión
Del lado de los mantenedores, eso también puede servir de escudo para quien tome decisiones más emocionales o cercanas a una psicosis por IA
Un proyecto con mentalidad de asedio que bloquea e ignora las críticas puede descarrilar muy rápido
Por otro lado, en un proyecto que no protege a sus mantenedores de la ansiedad y las patologías alrededor de la IA, el burnout de los mantenedores es inevitable
Esta reescritura de Bun se siente como un posible evento pensado para el marketing de Mythos
El ruido y la publicidad hasta ahora vinieron sobre todo de la reacción negativa de gente contraria a la IA
En mi opinión, también se mezcla mucho con una percepción negativa creciente sobre la propia Anthropic por algunas de sus decisiones recientes
Da la impresión de que las necesidades de Anthropic son la única prioridad y que todo lo demás no les importa
Luego hacen mucho ruido y escriben un post de blog diciendo “Claude Code permitió al equipo de Bun reescribir más de un millón de líneas de Zig a Rust”, y los VC se relamen
Falla en chequeos básicos
Dejan que Mythos haga pedazos la base de código y quién sabe cuánto más gastan
Escriben otro post aparte
Estafadores y gente ingenua aplauden y lo defienden contra la “multitud delirante anti-IA”
Los VC se emocionan todavía más
Así es como se gana dinero
Y de ahí se pasa a que ahora también hay que deshacerse de los ingenieros de software
Si ya hay una base de código en un lenguaje inseguro y además bindings a otro lenguaje inseguro, no sé por qué alguien asumiría que iba a verse perfectamente implementado de inmediato