Sync Lint
cargo xtask sync-lint 是 axbuild 自带的、面向同步语义的静态检查器。Clippy 并不会报告“用 Relaxed 排序的原子量在同步路径上是否安全”,而这种误用正是内核/并发代码里最难调试的 bug 来源之一。sync-lint 用 syn 对 workspace 内全部 Rust 源文件做语法分析,识别三类高置信度的 Relaxed 误用模式并直接报错。
“高置信度”意味着 sync-lint 故意保持保守:它只报告那些在常见同步原语(自旋等待、release/acquire 配对、混合排序)中几乎肯定是 bug 的模式,不做跨函数/跨 crate 的复杂推导,因此误报率低、可在 CI 上
-D强制执行。
三条规则
| Rule | label | 触发条件 |
|---|---|---|
WaitCondition | suspicious_relaxed_wait_condition | 自旋等待闭包/循环的条件中出现了 Relaxed 的 atomic load |
PublishBeforeNotify | suspicious_relaxed_publish_before_notify | 同一语句块中先做 Relaxed 写(publish),紧接下一句做 notify/wake 类调用 |
MixedOrdering | suspicious_relaxed_mixed_ordering | 同一 同步变量上同时存在 Relaxed 和更强排序的访问 |
被判定为“同步意图”的变量来源包括:等待循环条件中读取的原子量、publish-then-notify 模式中的写目标、以及显式被 core::sync::atomic / atomino / 项目内 atomic 类型访问的表达式(详见 parser.rs::atomic_accesses_in_expr 及 mark_sync_intent_expr)。MixedOrdering 要求该变量同时被 Relaxed 和 Strong 两种方式访问,才会对 Relaxed 那次访问点报错。
架构概览
模块组成
| 代码位置 | 作用 |
|---|---|
scripts/axbuild/src/sync_lint/mod.rs | CLI 入口、SyncLintArgs、结果打印与退出码 |
scripts/axbuild/src/sync_lint/git.rs | 通过 cargo metadata 枚举 workspace 包和 Rust 源文件;--since 增量选择 |
scripts/axbuild/src/sync_lint/parser.rs | syn 语法分析与 Analyzer 访问者,产生 Finding |
scripts/axbuild/src/sync_lint/rules.rs | 规则枚举、AtomicAccess / AccessSummary / AnalysisResult 数据模型 |
scripts/axbuild/src/sync_lint/tests.rs | 每条规则的回归用例 |