Rust周刊2026W34 | tokio_with_wasm 入驻浏览器、Cargo 默认 -Zembed-metadata=no、extern “custom” 稳定化、OxiSH 内存安全 SSH

Cargo nightly 默认启用 -Zembed-metadata=no 瘦身 target 目录,extern “custom”、Box::take、cargo-lints 稳定化;tokio_with_wasm 一行导入让 tokio 跑在浏览器,OxiSH 内存安全 SSH 服务器登场。

🦀 Rust 工具链更新

🔧 编译器

⚡ 性能优化

new-solver 是本周提速重点:内联热点函数并新增三项加速,ShardedHashMap::with_capacity 改为在分片间分配容量,编译器求解路径整体更快。

🐛 Bug修复

next-solver 改用 TyOrConstInferVar,修复 #158441 一类类型推断错误。

✅ 稳定化

-Zprofile-sample-use 稳定化,基于采样的 PGO 可在稳定版直接使用;extern "custom" ABI 稳定化,为自定义 FFI ABI 提供稳定入口。

📚 标准库

🆕 新功能

标准库新增 core::num::Complex 复数类型与 float_nan_to 数值特性,StepBy 迭代器实现 FusedIterator;另有实验性的 core::cmp::smallest/largest 与 offload! 函数式宏,开发者可提前在 nightly 尝鲜这些工具。

⚡ 性能优化

CStr 后备切片边界检查被优化,StrSearcherImpl 新增单字节 ASCII 搜索器,C 字符串访问与字符串查找路径更快。

🔧 改进

Arc 溢出断言不再依赖 fmt::Display;Iterator::{min,max}(_by_key) 现在尊重类型自定义的 min/max/lt 实现,而不是总走默认比较。

🚀 Cargo

✅ 稳定化

nightly Cargo 默认开启 -Zembed-metadata=no,构建产物不再内嵌 rustc 元数据;build-dir layout v2 重新稳定化,构建目录布局更干净。

🐛 Bug修复

修复 frontmatter 解析在非 ASCII 字符前的短闭合围栏 panic,以及新 build-dir layout 下 cargo clean -p 残留 unremap 文件的问题。

🗑️ 移除

移除 registry.min-publish-age 配置项,涉及该配置的发布年龄校验随之简化。

🔧 改进

trim-paths 支持从环境变量读取 workspace 前缀覆盖,CI 中统一配置路径剥离更灵活。

🧹 Clippy

🧹 Lint规则

新增 option_zip_none lint,提示可被 zip 简化的 Option 组合写法;同时清理 used_underscore_* 系列规则。

🐛 Bug修复

修复 unnecessary_rest_pattern 在 TyAlias 上的 ICE、#[expect(clippy::let_and_return)] 误触发的 unfulfilled_lint_expectations,以及 min_rust_version_invalid_attr 的重复诊断。

⚡ 性能优化

五条热点 lint 路径先做廉价检查再展开宏,missing_const_for_thread_local 与 VecArgs::hir 提前判断 fn 种类、解析被调函数,Clippy 扫描更快。

🔌 Rust-Analyzer

🐛 Bug修复

修复多项崩溃与误诊:frontmatter 的 UTF-8 错误路径、关联类型参数不匹配与宏输入中定义符号导致的 panic、宏尾逗号误报、consteval 失败时向 solver 返回错误常量,以及 rustc_private 对 rustc_proc_macro 的支持。

🔧 改进

replace_arith_op 改为检查原始类型并支持整数引用,循环含发散 break 表达式即视为发散,对不支持的 unary !/- 操作发出 E0600,range 表达式完成 HIR lowering;同时建议每个 workspace 配备 proc-macro server。

🆕 新功能

支持 Reborrow 与 CoerceShared 内建 derive,宏展开代码的补全与类型诊断更准确。

✅ 已批准 RFC

🔧 改进

RFC「Refactor the libs team」获批,标准库团队结构将调整,后续贡献与评审流程可能随之变化。

📝 新增·更新 RFC

🆕 新功能

新增 RFC 提出 Owning references(&own T)所有权引用设计,探索新的借用与所有权组合方式。

🔧 改进

RFC 提议将 i686-pc-windows-msvc 从 Tier 1 with host tools 调整为 Tier 1 without host tools,降低该目标平台的维护负担。

📄 rustdoc

🆕 新功能

rustdoc 新增基础 splat(展开语法)支持,含 ... 展开的文档渲染更准确。

🧹 Lint规则

新增 unused_footnote_definition lint 提示未被引用的脚注定义;宏调用上使用无效 doc 属性也会触发告警。

📋 跟踪 issue

✅ 稳定化

Box::take、智能指针 map 函数、windows_process_extensions_main_thread_handle 以及 Cargo 的 min-publish-age、cargo-lints 均在推进稳定化,相关能力将陆续进入稳定版。

🆕 新功能

计划为 Vec/&[T]/&mut [T] 与 Cow<[T]> 增加对称 PartialEq 实现,并为 std::sync::Once 添加 Default 实现。

🧹 Lint规则

dropping_{references,copy_types} lint 将扩展覆盖 drop_in_place,并加强对 core::ffi::c_void 错误用法的检测。

🗑️ 移除

计划移除 From<!> for T 的保留实现,消除空白类型间隐式转换的保留行为。

🔧 改进

str::escape_debug 将始终转义 grapheme extender;let-else 将尊重 macro_rules 表达式元变量分组;sparc-unknown-linux-gnu 暴露 target_abi = "v8plus"。

🦀 Official

减少 nightly target 目录大小的实验

每个 Rust 库的元数据都要写两遍磁盘——一次在 .rmeta 文件中,再一次在最终的 .rlib 内——而臃肿的 target 目录在 2025 年 State of Rust 调查中位列第二大痛点,仅次于编译速度。禁用调试信息或增量编译可以缩小 target 目录,但会牺牲构建速度和可调试性,而重复的 crate 元数据本可以在没有这些代价的情况下消除。文章解释了 Cargo 在 nightly 上默认启用 -Zembed-metadata=no 以消除重复的实验、这一变化对磁盘占用意味着什么,以及如何选择退出或上报问题而无需迁移。

🛠 Project/Tooling Updates

OxiSH:现代内存安全 SSH 服务器

作为互联网默认远程访问工具的 OpenSSH 用 C 编写,至今仍受内存安全缺陷困扰——这类问题占 C 和 C++ 安全漏洞的七成(Microsoft、Google 数据)。SSH 服务器完全符合 Prossimo 判定内存安全重写优先级的全部三项风险标准,然而 russh 等现有 Rust 实现仍依赖老旧加密原语和单体设计。文章涵盖 OxiSH 历时 20 个月的构建:安全的 sans-I/O 协议核心、可插拔加密、基于 Tokio 且支持 Ed25519/ECDSA 公钥认证的网络层、一个基础 shell,以及在通往生产环境之路上当前局限性的坦诚清单。

2026 年对 Xilem 的批判性评述

📖 Observations/Thoughts

从 Go 到 Rust

一位拥有五年以上经验的 Go 开发者,当初对 Rust 进入他的团队颇为抵触——但他最终用 Rust 重建了一个设备操作 CLI 及其流式服务。Rust 的语法(fn、impl、Option、Result)一开始让他觉得难以理解,而虽然 Go 的 channel 让 mpsc 变得轻而易举,但服务之间的 mpmc 广播消息传递才是真正的痛点。文章讲述了他的转型历程、推动他转向 Rust 的消息传递与低内存约束、他现在喜欢的东西,以及仍然困扰他的东西。

从 Rust 出发,Zig 是什么感觉

在 Rust 这个 IDE 生态丰富的环境里待了七年后,这位开发者第一次用 Zig 做项目时,让他震惊的不是语言本身,而是缺失的工具链——Zig 只有语法高亮和基本的自动补全,而 RustRover 早已把他惯坏成了完整 IDE。为了公平比较,他把自己用 Rust 写的 JSONPath 库(RFC 9535)用 Zig 重新实现为 zig-jsonpath,结果发现 Rust 习惯写出了不符合 Zig 惯用风格的代码,而且每一步决策都需要手动推理,没有工具可以依赖。这篇文章走完了整个跨语言之旅:哪些假设被打破了,哪些 Rust 直觉保留了下来,以及 Zig 究竟在哪些方面做得更好。

我想要 extern “fil-c”

Rust 的 C FFI 颠倒了安全交易:编译期的内存安全止步于 unsafe 边界,边界两侧没有任何一方强制落实 C 库的契约。Fil-C 用能力(capabilities)、运行时检查和并发垃圾回收器重新编译 C 和 C++,让违规从漏洞变成 panic——但它刻意不与普通 C 保持 ABI 兼容,所以 Rust 的 extern “C” 无法在缺少桥接的情况下触达它。文章勾勒了一个刻意保持狭窄、只说 Fil-C ABI 的 Rust FFI,它没有逃回 unsafe C 的出口,并介绍了已在形成的基础工作:filnix 的 Nix 平台已移植 100 多个包,以及 Zig 提出的 rival fil ABI 提案。

就地初始化的四个层级

就地初始化让 Rust 能把类型直接构造到某个内存位置,从而避免可能在大类型上触发栈溢出的移动和拷贝——但正确的设计不是一个特性,而是一个四级层级结构。地址敏感类型为了正确性绝不能移动,但今天最底层的一级——裸指针加 MaybeUninit——虽然极度灵活,却只是“聊胜于无”,要求 unsafe,甚至在将值“公证”为已初始化时还被迫移动。从这一基础(正是 pin-init 与 placing 这两个 crate 的构建根基)逐级向上,可以看到每一级在安全性和易用性上买回了什么。

Electron 应用中的零拷贝 wgpu 渲染

wgpu 渲染的视频帧可以不离开 GPU 内存,直接显示在 Electron 窗口内——作为 macOS 上的 NVR,Murlet 在回放录像时输出感觉紧贴光标。零拷贝显示是难点:传统路径要么把帧读回 CPU,要么重新推流,而 Electron 的两个零拷贝选项——hole punching 和 sharedTexture API——有着不同的取舍。文章讲述了通过 NAPI-RS 在 Electron 主进程内运行的 Rust wgpu 后端架构,并解释了为什么 hole punching(透过透明 div 窥视的原生 NSView 底层)在这个用例中胜出。

实现状态机(第 1 部分)

📚 Rust Walkthroughs

嵌入式 Rust 温和入门

现代 async/await Rust 现在可以跑在一块只有 64MHz CPU 和 128KB RAM 的裸机芯片上——而写它的笔记本内存是它的 10 万倍。嵌入式编程长期以来是 C 的地盘,因为硬件厂商只提供 C SDK,迫使开发者要么忍受不安全的内存处理,要么选一个对设备来说太重的操作系统。本系列将在价值 15 英镑的 BBC micro:bit 上构建一个温湿度传感器——不需要电烙铁或电子学知识——涵盖 probe-rs 烧录等工具链,以及如何把高级、内存安全的代码放到开发板上。

构建容器化的 RESTful API

“列俄罗斯方块”(Column Tetris)可以缩减数十亿行级 PostgreSQL 表:按对齐要求递减的顺序排列定宽列(8 字节类型在前,变宽列最后)可以削减元组对齐填充,在大规模场景下压缩行和存储体积。大多数团队默认保留可读的列布局,而且只有当表达到数百万乃至数十亿行时节省才真正重要——但恰恰到那时,浪费的填充会成倍累积为真实的存储成本。本系列用 Axum、Tokio、Tower、Serde、Toasty ORM、Garde 和 Utoipa 构建一个生产就绪、运行在 Docker 和 PostgreSQL 上的容器化 RESTful API,覆盖 books CRUD 端点、健康检查、请求/响应契约,以及列排序优化。

📦 Crate of the Week

本周 Crate:tokio_with_wasm

一行 use tokio_with_wasm::alias as tokio; 导入即可在浏览器中运行相同的 tokio 代码——该库本身没有运行时,只是借助浏览器事件循环的 JavaScript 胶水,并按需为阻塞任务生成 Web Worker。但 Web 缺少 tokio 的原生机制:net、process 和 signal 在浏览器中没有对应物,会变成编译错误,而文件系统读取必须面向 OPFS(每个源站专属的磁盘存储)。读者将获得一套可直接替换的 tokio API 用于 Web 应用,tokio 与其 JS 胶水之间的功能列表保持同步,并且单一代码库可同时运行于原生与浏览器目标。

📌 miscellaneous

与 Joshua Liebow-Feeser 畅聊 Zerocopy

诞生于谷歌 Fuchsia OS 内部的 zerocopy,如今驱动着 crates.io 上 400 多个 crate,下载量接近 3 亿次。Rust 中的零拷贝解析通常意味着手写 unsafe transmute——这正是内存安全漏洞藏身之处——因此该 crate 的安全 transmutation 方案让类型系统成为安全网。Netstack3 的原开发者 Joshua Liebow-Feeser 详解了 zerocopy 的起源与设计、零拷贝解析、形式化验证,以及用数学级别的精确标准把复杂性隐藏在简单可靠的抽象背后的哲学。

📌 newsletters

The Embedded Rustacean 第 78 期

运行 Xous 操作系统的 Rust 优先嵌入式 SoC Baochip 颠覆了常规的嵌入式顺序——芯片本身围绕 Rust 设计,而不是把 Rust 硬塞进 C 主导的厂商技术栈。长期以来,嵌入式 Rust 的采用意味着对抗厂商的 C HAL,并在内存捉襟见肘的微控制器上精打细算——在那种环境下,即使一个体量不大的 LLM 都显得荒谬。第 78 期汇总了这款芯片、一个 Seeed XIAO 项目生成器、在微控制器上运行 LLM、通过 OnMCU 进行远程固件执行、对 Jonathan Pallant 的采访,以及最新的教育资源。

📌 research

Rust 中的 GPU 卸载:可移植、安全且快速


往期精选


阅读原文


扫码关注「右耳朵猫AI」

扫码关注「右耳朵猫AI」

posted @ 2026-08-29 17:21  右耳朵猫AI  阅读(12)  评论(0)    收藏  举报