awdemos/stasis-borrow-checker

GitHub: awdemos/stasis-borrow-checker

Stasis 是一个用 Rust 编写的教学版借用检查器,用于验证简化 Rust 程序的所有权、借用和移动语义规则。

Stars: 1 | Forks: 0

# Stasis — 用符合习惯的 Rust 实现的 Rust 借用检查器 这是一个简化的、具有教育意义的类 Rust 借用检查器实现,完全使用符合习惯的 Rust 编写。**Stasis** 会对 Rust 语法的子集进行所有权、借用和移动语义的验证。 ## 它的功能 Stasis 会解析一个简化的 Rust 程序,并通过一个流敏感的借用检查器来运行它,该检查器会强制执行以下规则: - **移动后使用**:检测对已移动值的读取 - **借用时移动**:阻止移动存在活动借用的值 - **多个可变借用**:禁止 `&mut x` + `&mut x` - **可变与不可变重叠**:捕捉双向冲突 - **移动后借用**:无法引用已移动的值 - **借用时赋值**:阻止对被借用的变量进行写入 - **块级作用域**:借用和局部变量会在 `}` 处被销毁 - **Copy 类型**:`int`、`bool`、`()` 被追踪为 Copy(不会移动);字符串为非 Copy ## 示例 ``` fn main() { let x = "hello"; // x owns the string let r = &x; // immutable borrow of x let y = x; // ❌ ERROR: can't move x while borrowed } ``` ``` fn main() { let x = "hello"; { let r = &mut x; // mutable borrow — OK inside block } // borrow ends here let r2 = &x; // ✅ OK: mutable borrow was dropped } ``` ## 模块 | 模块 | 用途 | |---|---| | `ast` | 用于简化 Rust 子集的 AST 类型 | | `parser` | 手写的递归下降解析器 | | `span` | 源码位置追踪 | | `ownership` | `OwnershipState` 状态机 (Owned → Moved/Borrowed) | | `borrow_graph` | 活动借用关系追踪 | | `checker` | 核心借用检查算法 | | `error` | 类似 Rust 的错误诊断 | ## 语法 ``` program ::= function* function ::= "fn" ident "(" params? ")" ("->" type)? block block ::= "{" stmt* expr? "}" stmt ::= "let" pat (":" type)? ("=" expr)? ";" | expr ";" pat ::= ident | "_" ``` 支持:`if`/`else`、`while`、`return`、`&`/`&mut` 引用、`.clone()`。 ## 运行 ``` cargo run --example demo # see all rules in action cargo test # 29 tests ``` ## 为什么叫 "Stasis"? *Stasis* —— 一种平衡状态,在这种状态下,所有权是静态的,并且在编译时就是已知的。同时,它是 "motion"(变动、移动)的反义词。
标签:odt, Rust, SOC Prime, 云安全监控, 借用检查器, 可视化界面, 开发工具, 抽象语法树, 编译器, 网络流量审计, 通知系统, 静态分析