跳到主要内容

Lock Lint

cargo xtask lock-lint 守护全项目统一到 ax-sync 后的锁边界。它检查仓库级依赖、 源码导入和 runtime provider 不变量,不是一般代码风格检查。

检查内容

检查约束
已移除 packageworkspace、成员 manifest 和 Cargo.lock 不能重新出现 ax-kspinax-kernel-guardax-lockdep
第一方 spinmanifest 不能直接依赖 crates.io spin,Rust 源码不能直接导入或调用 spin::*
StarryOSkernel 生产源码只能经 crate::sync 使用锁;src/sync.rs 是唯一允许直接导入 ax-sync 的 facade
AxvisorAxVM/Axvisor 不得直接依赖或导入 ax-sync;普通路径使用 std::sync,特殊上下文经 ax_std::os::arceos::sync
runtime providerCriticalSectionOpsMutexRuntimeOpsLockdepOps 的生产实现必须各有且仅有一个,并位于 ax-runtime/src/sync.rs

扫描跳过 .gittargettmp.cache、文档和 lint 实现自身。测试 provider 只允许出现在 ax-sync 的明确测试位置;第三方依赖树中的传递 spin package 不属于第一方直接依赖,允许保留。

合法边界

可移植的 no_std 组件直接依赖 workspace ax-sync

[dependencies]
ax-sync = { workspace = true }
use ax_sync::SpinLock;

let state = lock.lock();
let irq_shared = irq_lock.lock_irqsave();

StarryOS kernel 从本地 facade 导入:

use crate::sync::{Mutex, SpinLock};

AxVM 普通任务上下文使用 std::sync;只有 IRQ、guest-entry 或 no-preempt 路径使用:

use ax_std::os::arceos::sync::IrqSafeMutex;

以下写法会失败:

spin = "0.12"
ax-kspin = { workspace = true }
ax-lockdep = { workspace = true }
use spin::Once;
use ax_kspin::SpinNoIrq;
use ax_lockdep::HeldLock;

no_std 的一次初始化使用 ax_lazyinit::{OnceLock, LazyLock};有 Rust std 的组件使用 std::sync::{OnceLock, LazyLock}

报告格式

每条 finding 包含路径、TOML 位置或源码行号、错误说明与修复建议:

<path>: <location>: <message>
help: <修复建议>

存在任何 finding 时命令以非零状态退出。

用法

cargo xtask lock-lint

CI 会运行该命令,防止旧锁 crate、第一方直接 spin、OS facade 绕过和重复 runtime provider 重新进入仓库。