Rust is a memory-safe programming language that disallows undefined behavior. Its safety guarantees have been extensively examined by the community through empirical studies, which has led to its remarkable success. However, unsafe code remains a critical concern in Rust. By reviewing the safety design of Rust and analyzing real-world Rust projects, this paper establishes a systematic framework for understanding unsafe code and undefined behavior, and summarizes the soundness criteria for Rust code. It further derives actionable guidance for achieving sound encapsulation.
论文ID : 2510.10410标题 : A Trace-based Approach for Code Safety Analysis作者 : Hui Xu (复旦大学)分类 : cs.PL (Programming Languages), cs.SE (Software Engineering)发表时间 : 2025年10月论文链接 : https://arxiv.org/abs/2510.10410 Rust是一种内存安全的编程语言,禁止未定义行为。其安全保证已通过社区的大量实证研究得到验证,这也是其取得显著成功的原因。然而,unsafe代码仍然是Rust中的一个关键问题。本文通过回顾Rust的安全设计并分析现实世界的Rust项目,建立了理解unsafe代码和未定义行为的系统框架,总结了Rust代码的健全性标准,并进一步提出了实现健全封装的可操作指导。
Rust安全承诺的局限性 : 虽然Rust承诺safe代码不会导致未定义行为,但unsafe代码仍可能引入安全风险缺乏系统化框架 : 现有研究缺少对unsafe代码和未定义行为关系的系统性理论分析封装健全性验证困难 : 缺乏可操作的方法来验证包含unsafe代码的函数和结构体的健全性Rust在系统编程领域的广泛应用使得unsafe代码的安全性至关重要 建立理论框架有助于开发者更好地理解和使用unsafe代码 为Rust生态系统的安全审计提供科学依据 缺乏对unsafe代码安全约束的形式化描述 没有统一的健全性验证标准 缺少从函数到结构体再到模块的系统性分析方法 建立主定理 : 形式化证明了未定义行为与unsafe代码之间的关系,确立了"未定义行为仅源于unsafe代码且完全由其安全约束决定"的核心原理提出健全性标准 : 为safe和unsafe函数、结构体、模块分别制定了健全性判定标准开发封装指导 : 推导出实现健全封装的可操作性准则和推论构建审计框架 : 提出基于不安全传播图(UPG)的系统化审计方法本文的核心任务是建立一个理论框架来分析Rust代码中unsafe部分的安全性,具体包括:
输入 : 包含unsafe代码的Rust程序输出 : 健全性判定和封装指导约束 : 基于Rust类型系统和安全约束主定理 (Theorem 1) : 对于良类型的Rust程序P,未定义行为只有在P包含unsafe代码且违反其相关安全约束时才会发生:
P ⊢ UB ⇒ (P ∋ UC) ∧ (P ⊬ SC_UC)
其中UC表示unsafe代码,SC_UC表示unsafe代码的安全约束。
假设1 : 每个unsafe函数都有明确的安全约束,这些约束具有:
普遍性 : 每个unsafe函数都有必须满足的安全约束一致性 : 给定函数的安全约束在所有调用点保持一致Safe函数健全性 (Definition 2):
Unsafe函数健全性 (Definition 3):
∀P_fu, P_fu ⊢ SC_fu ⇒ P_fu ⊬ UB
统一的函数健全性条件:
∀fu ∈ UnsafeCallee(f), (f ∪ SC_f) ⊢ SC_fu ⇒ ∀P_f ⊢ SC_f, P_f ⊬ UB
结构体S = {C, F, M, d}的健全性要求:
静态方法 : 所有构造函数和静态方法必须满足函数封装准则动态方法 : 考虑破坏性方法的影响,确保安全约束在所有构造函数和方法组合下都得到满足迹基分析方法 : 类似于污点分析,将unsafe代码视为污点源,函数出口作为汇点分层健全性 : 从函数→结构体→模块→crate的递进式分析破坏性方法处理 : 创新性地考虑了可变方法对其他方法安全不变量的影响不安全传播图 : 提供可视化的审计工具本文主要是理论工作,验证方法包括:
形式化证明 : 通过逻辑推理证明定理和推论的正确性实际项目分析 : 基于真实Rust项目验证理论的适用性案例研究 : 通过具体示例展示方法的可操作性理论完备性:是否覆盖了Rust unsafe代码的主要场景 实用性:推导的准则是否可操作 一致性:与Rust官方安全承诺的一致性 主定理证明 : 成功建立了未定义行为与unsafe代码的因果关系封装准则 : 推导出4个核心推论,涵盖函数和结构体的健全封装模块扩展 : 将理论扩展到模块和crate级别,支持强健全性和弱健全性不安全传播图(UPG) 定义:
F: 函数和静态方法节点集 E: 涉及unsafe调用的边集 S: 包含unsafe调用的结构体集 Unsafe节点 : 需要明确安全约束规范unsafe调用 : 需要满足Corollary 4或Corollary 7第一部分结构体 : 需要满足Corollary 7第二部分Rust安全性研究 : 社区对Rust安全保证的实证研究形式化验证 : 对Rust程序的形式化验证方法Unsafe代码分析 : 针对unsafe代码的静态分析工具理论创新 : 首次建立unsafe代码与未定义行为的形式化关系系统性 : 提供从函数到crate的完整分析框架实用性 : 推导出可操作的审计指导建立了unsafe代码安全分析的理论基础 提供了系统化的健全性判定标准 开发了可操作的审计方法 假设依赖 : 理论建立在安全约束性质假设之上复杂度 : 大型项目的UPG可能过于复杂自动化程度 : 需要人工指定安全约束和不变量开发自动化工具支持UPG构建和分析 扩展到更复杂的unsafe操作场景 与现有静态分析工具集成 理论严谨 : 建立了完整的形式化框架,证明过程清晰实用价值 : 提供可操作的审计指导,有助于实际开发系统性强 : 从函数到crate的完整覆盖创新性 : 迹基分析方法的引入具有新颖性实验验证不足 : 缺乏大规模实际项目的验证实验工具支持 : 没有提供自动化工具实现性能考虑 : 未讨论方法的计算复杂度和可扩展性假设限制 : 对安全约束性质的假设可能过于理想化学术贡献 : 为Rust安全性研究提供理论基础实践价值 : 可指导Rust项目的安全审计实践工具开发 : 为开发自动化安全分析工具提供理论支撑系统级Rust项目的安全审计 Rust标准库和核心crate的健全性验证 编程语言安全性的理论研究 静态分析工具的设计和实现 Rust Team. Soundness (of code / a library). Rust Unsafe Code Guidelines. Zihao Rao, et al. Annotating and Auditing the Safety Properties of Unsafe Rust. arXiv preprint arXiv:2504.21312, 2025. 总体评价 : 本文在Rust unsafe代码安全性分析方面做出了重要的理论贡献,建立了系统化的分析框架。虽然在实验验证和工具实现方面还有待加强,但其理论价值和实用潜力值得肯定。该工作为Rust安全性研究和实践提供了坚实的理论基础。