Hacker News 中文摘要

RSS订阅

Bun Rust重写:"代码库未通过基本Miri检查,安全Rust中存在未定义行为" -- Bun Rust rewrite: "codebase fails basic miri checks, allows for UB in safe rust"

文章摘要

该文章指出Bun项目的Rust代码库存在严重问题,无法通过最基本的Miri检查,导致在安全的Rust代码中出现了未定义行为(UB)。这表明代码库存在内存安全方面的隐患。

文章总结

以下是经过编辑整理后的文章主要内容:


标题:Rust代码库问题:无法通过基本Miri检查,安全Rust中存在未定义行为
来源:GitHub Issue #30719
发布时间:2026年5月14日

问题描述

用户AwesomeQubic报告称,Bun项目的Rust代码库存在严重问题,无法通过最基本的Miri检查(Rust的内存检查工具),甚至在安全Rust代码中允许未定义行为(UB)。

关键问题示例

rust fn main() { let test = Box::new(*b"Hello World"); let init = PathString::init(&*test); drop(test); // 释放内存 println!("{:?}", init.slice()); // 使用已释放的内存 } 错误信息显示:
error: Undefined Behavior: constructing invalid value of type &[u8]: encountered a dangling reference

技术分析

  1. 问题根源

    • PathString::init函数安全地接收&[u8]切片引用,但内部通过unsafe代码错误地擦除了生命周期标记,返回'static生命周期的值,导致悬垂引用。
    • 这违反了Rust的内存安全原则,可能引发释放后使用(use-after-free)等问题。
  2. 影响范围

    • 此类问题在代码库中普遍存在,可能引发难以调试的未定义行为,破坏Rust的安全保证。

社区反馈

  1. 开发者建议

    • 避免依赖AI生成Rust代码,建议聘请有经验的Rust开发者进行人工审核。
    • 所有unsafe代码块需严格审查,确保符合Rust的安全契约。
  2. 修复进展

    • 协作开发者robobun提交了修复(PR #30728),将PathString::init标记为unsafe并添加生命周期约束文档,同时审计了70余处调用点。
  3. 争议焦点

    • 部分用户批评项目从Zig到Rust的草率重写,认为AI生成的代码缺乏可靠性。
    • 对比案例:Ladybird浏览器的C++到Rust迁移耗时两周且仅生成3万行代码,而Bun的重写被指缺乏严谨性。

深层讨论

  • 语言特性:Rust的生命周期和所有权机制需显式处理,直接翻译其他语言(如Zig/C++)的代码模式容易引发问题。
  • 行业反思:有评论指出,此类事件反映了过度依赖AI生成代码的行业风险,呼吁重视人工设计和审查。

编辑说明
1. 保留了技术细节和关键讨论,删减了重复的GitHub界面元素和部分情绪化评论。
2. 整合了多位开发者的补充分析,突出问题的严重性和解决方案。
3. 调整标题为更中立的表述,便于读者快速理解核心问题。

评论总结

以下是评论内容的总结:

  1. 关于重写目的与方法的争议

    • 支持方认为这是必要的过渡步骤,最终会改进为符合Rust习惯的代码 "这是一个学习步骤,我很高兴它发生了"(评论7) "主要好处是现在可以使用编译器工具修复原来Zig代码中隐藏的问题"(评论12)
    • 反对方质疑使用AI快速重写的合理性 "如果他们要翻译Zig到不安全的Rust,为什么不直接构建翻译工具?"(评论15) "这感觉像是一个潜在的Mythos营销噱头"(评论9)
  2. 关于内存安全问题的讨论

    • 认为问题被夸大 "移植大型内存不安全代码库出现内存安全问题,这有什么大不了的"(评论11) "在移植阶段暂时错误标记某些不安全函数为安全不是真正的问题"(评论17)
    • 指出Rust工具的价值 "如果这个问题在两个代码库中都存在,那正好说明Rust生态系统的工具能更容易发现问题"(评论22)
  3. 对开发流程的批评

    • 质疑代码审查不足 "作为Anthropic员工,看到百万行LLM生成的代码没有适当审查,只能认为公司不再关心理解自己的代码"(评论18)
    • 认为应该更注重验证 "我不反对用LLM写代码,但现在验证应该比代码产出更严格100倍"(评论16)
  4. 关于社区反应的评价

    • 批评过度反应 "在GitHub上刷屏只会让人们更不愿意公开工作"(评论17) "这篇文章除了让作者显得幼稚外没有任何贡献"(评论8)
    • 建议理性看待 "也许我们应该等到发布状态再评判,评判中间工作状态不太公平"(评论17)
  5. 对技术决策的质疑

    • 质疑整体方向 "为什么要这么多JS运行时?如果可以这样轻松替换,Bun项目本身有什么价值?"(评论18)
    • 批评开发选择 "更好的做法是用真正适合的语言重写Claude"(评论21)

关键分歧点在于:支持者认为这是必要的技术过渡,反对者则质疑使用AI快速重写的合理性及其背后的商业动机。多数评论认为当前问题在移植阶段是可以预期的,但对开发团队的处理方式和长期技术路线存在较大争议。