< 返回版块

苦瓜小仔 发表于 2025-12-03 17:00

Tags:日报

文章《为 Rust 中的锁中毒辩护》

这篇文章深入论证了 Rust Mutex 中毒(Poisoning) 实际上是 栈展开(Stack Unwinding) 机制的必要补充,主要观点如下:

  1. Unwind 导致锁意外释放:Rust 的 panic 处理默认是 Stack Unwinding。当线程崩溃时,运行时会逐层清理栈帧并执行析构函数(Drop),这会导致 MutexGuard 自动释放锁。这与直接终止进程(Abort)不同,它允许程序在局部错误后继续运行。
  2. 数据不变性的破坏:Panic 通常发生在临界区内。如果线程在修改数据中途崩溃并触发 unwind,数据往往处于只写了一半、破坏了**不变性(Invariants)**的“脏”状态。此时锁被自动释放,若无标记,其他线程将毫无防备地访问这些损坏的数据。
  3. 中毒是逻辑安全的防线:中毒机制的核心作用,是在 unwind 发生后标记该锁保护的数据“不可信”。它强迫后续获取锁的线程处理这个 Result,而不是默认让损坏的数据逻辑扩散到整个系统。
  4. 恢复能力的代价:作者强调,既然 Rust 允许通过 catch_unwind 等方式从 panic 中恢复(例如 Web 服务器只挂掉单个请求线程),就必须负责防止损坏的共享状态污染健康的线程。只要 Rust 支持 unwind,中毒机制就是保证正确性的必要手段。

阅读:https://sunshowers.io/posts/on-poisoning/

讨论:https://www.reddit.com/r/rust/comments/1pck69k/in_defense_of_lock_poisoning_in_rust_by_sunshowers/

视频:我如何利用 Rust 打击人口贩卖

EuroRust 2025 演讲系列。

Trafficking Free Tomorrow 是一个非营利组织,致力于为执法部门提供数字取证工具,以打击人口贩卖。在演讲中,Brooke 将向我们展示如何利用 Rust 语言,让一个人发挥真正的影响力,帮助幸存者获得正义!🦀

观看:https://youtu.be/CbpXKqay_oY

Fresh:由 Rust 编写的全新终端文本编辑器

Fresh 是一款由 Rust 编写的全新终端文本编辑器,旨在结合终端的便携性与现代 GUI 编辑器的易用性。主要特点:

  1. 极致性能:专为处理超大文件优化,宣称能在 600ms 内打开 2GB 的日志文件并完成颜色渲染,且内存占用低于 40MB,在处理大文件效率上显著优于 VS Code 和 Neovim。
  2. 零门槛易用:摒弃了 Vim 的模态编辑,默认采用类似 VS Code 的现代操作逻辑。支持鼠标操作、标准通用快捷键以及命令面板(Ctrl+P),旨在提供“终端里的 GUI 体验”。
  3. 功能完备:内置原生 LSP 客户端(支持代码智能补全)、支持多光标编辑和语法高亮。
  4. 灵活扩展:采用 TypeScript 作为插件编写语言,方便开发者扩展功能。

处理 2GB 带 ANSI 颜色的日志文件速度比较(neovim / emacs / vscode):

仓库:https://github.com/sinelaw/fresh

derive_more 发布 v2.1.0

derive_more v2.1.0 版本带来了多项功能增强与修复,并将最低支持 Rust 版本(MSRV)提升至 1.81。主要更新如下:

  • 新增 Derive 实现
    • 新增 PartialEqEq,相比标准库实现,能更智能地处理泛型约束。
    • 新增对枚举(Enum)的 DerefDerefMut 支持。
  • 功能增强
    • DisplayFromStr 现支持 rename_all 属性,可自动转换大小写(如 snake_case)。
    • FromStrTryInto 支持指定自定义错误类型。
    • 数学运算 derive(如 Add, Mul)现支持跳过特定字段,并改进了泛型约束推断逻辑。
    • Error derive 的 source() 现支持 Option 类型字段。
  • Bug 修复
    • 修复了在 stable 工具链下使用 Backtrace 导致的编译错误。
    • 解决了涉及关联类型时的 Trait 约束遗漏问题,以及生成代码中抑制弃用警告的逻辑。

仓库:https://github.com/JelteF/derive_more

Yazi 更新:支持远程文件管理

Yazi(意为“鸭子”)是一款用 Rust 编写的终端文件管理器,基于非阻塞异步 I/O。它旨在提供高效、用户友好且可定制的文件管理体验。

虚拟文件系统基础架构现已搭建完成,这意味着未来除了 SFTP 之外,添加其他常用服务将非常容易。对于不太常用的服务,我们还可以将 rclone 等工具与 VFS 集成。

文档:https://yazi-rs.github.io/docs/next/configuration/vfs

仓库:https://github.com/sxyazi/yazi

rust-parser-fuzz:Rust 语法解析器的差异模糊测试工具

Rust 解析器差分模糊测试器(Differential Fuzzer),旨在通过对比不同解析器的行为来发现潜在 Bug。主要特点如下:

  • 核心机制:采用差分测试(Differential Testing)策略,自动生成大量随机的 Rust 代码片段(通常是极端的边缘情况),同时输入给多个主流 Rust 解析器。
  • 测试对象:主要针对 rustc(官方编译器)、syn(宏解析库)和 rust-analyzer(IDE 语言服务器)这三大核心解析器。
  • 发现问题:通过比对解析结果是否一致(例如某段代码被一个解析器接受而被另一个拒绝,或生成的语法树结构不同),来定位解析逻辑的差异和错误。
  • 成效显著:作者表示该工具在发现边缘情况(如怪异的元组语法 (..t))方面非常有效,甚至因为发现的差异过多,导致验证工具本身的正确性都变得具有挑战性。

仓库:https://github.com/Skepfyr/rust-parser-fuzz

分享:使用 Macroquad 进行两年全职游戏开发

一位开发者使用 Macroquad(Rust 2D 游戏框架)进行两年全职游戏开发的经验。主要内容如下:

  • 背景与选择理由

    • 作者全职开发了一款网络多人游戏。
    • 选择 Macroquad 的原因在于其简单性非侵入性。相比之下,当时的 Bevy 引擎在 ECS 跨平台确定性(如系统执行顺序、查询迭代顺序)方面存在困难,不利于网络同步。
  • 正面评价(The Good)

    • 极佳的入门选择:对于中级 Rust 开发者或游戏开发新手来说,Macroquad 是一个非常务实的选择,能让人专注于“做游戏”而不是“写引擎”。
    • 务实高效:作者坦言,如果当时选择了 Bevy、Fyrox 或从头自研引擎,项目绝不可能进展到今天的程度。
  • 负面痛点(The Ugly)

    • 缺乏生态标准支持
      • 无 Serde 支持:Macroquad 使用作者自研的 nanoserde,这意味着无法直接对 Color 等内置类型使用标准的 serde 序列化。由于 Rust 的孤儿规则(Orphan Rule),开发者很难自行扩展支持,导致与生态系统其他库的交互变得痛苦。
      • wasm-bindgen 支持:框架采用了自研的 JavaScript 互操作方案,且无计划支持 Rust Web 开发事实标准的 wasm-bindgen,限制了 Web 平台的灵活性。
  • 总结建议

    • 如果你是想用 Rust 做游戏,Macroquad 值得推荐;如果你是资深开发者且需要高度定制,可能不需要它。作者不后悔这个选择,但也反思了“用 Rust 做游戏”相比“直接做游戏”所带来的额外挑战。

https://www.reddit.com/r/rust_gamedev/comments/1pc9wyv/macroquad_after_2_years_of_mostly_fulltime_rust/

--

From 日报小组 苦瓜小仔

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页