# CRIEW 编码规范
## 适用范围与优先级
风格与评审决策的优先级:
1. 本文档(`docs/development/code-guildline-cn.md`)
2. 工具强制规则(`rustfmt`、`clippy`)
3. 被修改模块的既有本地约定
本文档中的规则级别:
- 必须:新增或修改代码时必须满足。
- 建议:原则上应满足,除非存在明确权衡。
- 条件适用:仅在对应代码形态出现时适用(例如 `unsafe`)。
## 通用规则(语言无关)
必须:
- `descriptive-names`:命名在使用点应当自解释。
- `accurate-names`:命名必须准确反映行为和副作用。
- `encode-units`:类型无法表达单位时,在命名中编码单位(如 `*_bytes`、`*_ms`)。
- `bool-names`:布尔命名采用断言式(`is_*`、`has_*`、`can_*`、`should_*`)。
- `explain-why`:注释解释“为什么”,而非复述“做了什么”。
- `design-decisions`:记录非显然设计决策与备选方案。
- `one-concept-per-file`:单文件只承载一个主要概念,过大及时拆分。
- `top-down-reading`:代码应自顶向下可读,先高层后细节。
- `logical-paragraphs`:函数内部按逻辑步骤分段组织。
- `error-message-format`:错误信息具体且风格统一。
建议:
- `semantic-line-breaks`:Markdown 或文档注释优先语义换行。
- `cite-sources`:实现外部规范或算法时引用来源。
- `familiar-conventions`:优先沿用 Rust/Linux 的熟悉约定。
## Rust 规则
必须:
- `camel-case-acronyms`:类型、trait、缩略词遵循 Rust 命名习惯。
- `minimize-nesting`:优先早返回,减少嵌套层级。
- `small-functions`:函数职责单一、聚焦。
- `no-bool-args`:避免语义不清的布尔参数,优先枚举或配置结构体。
- `rust-type-invariants`:尽可能用类型系统表达不变量。
- `propagate-errors`:可失败路径优先使用 `?` 传播错误。
- `narrow-visibility`:默认最小可见性(优先私有或 `pub(crate)`)。
- `narrow-lint-suppression`:lint 抑制范围最小化。
- `debug-assert`:`debug_assert!` 仅用于发布版可省略的正确性检查。
条件适用:
- `justify-unsafe-use`:每个 `unsafe` 必须写 `// SAFETY:` 说明。
- `document-safety-conds`:`unsafe fn` 或不安全约束需在文档写 `# Safety`。
- `module-boundary-safety`:在模块边界层面论证安全性,而不只在单点调用处说明。
建议:
- `explain-variables`:复杂表达式拆为语义明确的中间变量。
- `block-expressions`:使用块表达式约束临时状态生命周期。
- `checked-arithmetic`:存在溢出风险时优先 checked/saturating 算术。
- `enum-over-dyn`:封闭集合优先 `enum` 而非 trait object。
- `getter-encapsulation`:优先封装,避免泄露可变内部状态。
- `module-docs`:主要模块提供模块级文档。
- `macros-as-last-resort`:宏作为最后手段,优先函数与 trait。
- `minimize-copies`:热点路径避免不必要的拷贝与分配。
- `no-premature-optimization`:优化前先有证据(profile/benchmark)。
## 测试规则
必须:
- `add-regression-tests`:修复 bug 时尽量补回归测试。
- `test-visible-behavior`:测试用户可观察行为,避免耦合内部实现。
- `use-assertions`:使用断言宏,不做手工打印比对。
- `test-cleanup`:测试结束后清理创建的资源与子进程。
- `coverage-check`:被修改代码必须保持项目覆盖率命令可运行。
项目落地:
- 一致性测试以用户可见反汇编输出为准。
- 解码器修复建议同时补 Rust 单测与对应一致性用例(如适用)。
- 合并前必须通过以下验证命令:
`cargo fmt --all -- --check`
`cargo clippy --all-targets --all-features -- -D warnings`
`cargo test --all-targets --all-features`
`./scripts/check-coverage.sh`
## Git 与 Pull Request 规则
必须:
- `atomic-commits`:一个 commit 一个逻辑变化。
- `refactor-then-feature`:先重构再功能,分开提交。
- `focused-prs`:一个 PR 聚焦一个主题。
- `signed-commits`:仓库内提交必须使用 `git commit -s`,确保每个 commit 都带有有效的 `Signed-off-by:` trailer。
- `large-commit-body`:简单提交可以只有标题行;改动量较大的提交必须带 body,并用分点条目说明主要改动。
提交信息策略(兼容本项目规范与参考的 Asterinas 规则):
- 保留本项目 Conventional Commit 前缀:`feat:`、`fix:`、`docs:`、`refactor:`、`test:`、`chore:`。
- 可选使用 scope,格式如:`feat(ci): ...`、`fix(sync): ...`。
- 前缀后的主题句使用祈使语气,描述清晰。
- 主题行尽量不超过 72 字符。
- 作者自己产生的 commit 一律使用 `git commit -s`;`.githooks/commit-msg` 与 CI 会校验 `Signed-off-by:` trailer。
- 简单提交可以只写标题行,不强制写 body。
- 改动量较大的提交必须写 body,并使用 `- ...` 这类分点条目说明做了什么。
- 当前 hook 与 CI 将“较大提交”定义为:单个 commit 改动至少 6 个文件,或新增/删除总行数至少 150 行。
## 评审检查清单
- [ ] 命名清晰且准确(`descriptive-names`, `accurate-names`)。
- [ ] 单位和布尔语义明确(`encode-units`, `bool-names`)。
- [ ] 注释说明动机,关键设计有记录(`explain-why`, `design-decisions`)。
- [ ] 公共接口不泄露实现细节(`hide-impl-details`)。
- [ ] 函数职责聚焦、嵌套受控(`small-functions`, `minimize-nesting`)。
- [ ] 错误处理采用 `Result`/`?` 模式(`propagate-errors`)。
- [ ] 若使用 `unsafe`,安全说明完整(`justify-unsafe-use`, `document-safety-conds`)。
- [ ] bug 修复包含回归测试(`add-regression-tests`)。
- [ ] 测试验证可观察行为并完成资源清理(`test-visible-behavior`, `test-cleanup`)。
- [ ] `cargo fmt --all -- --check`、`cargo clippy --all-targets --all-features -- -D warnings`、`cargo test --all-targets --all-features` 和 `./scripts/check-coverage.sh` 通过。
- [ ] commit 与 PR 规模原子、主题聚焦(`atomic-commits`, `focused-prs`)。
- [ ] 作者自己产生的每个 commit 都带有有效的 `Signed-off-by:` trailer(`signed-commits`)。
- [ ] 较大提交带有分点 body,用来说明主要改动(`large-commit-body`)。
## 渐进式采用
本规范面向“新增与变更代码”。
历史代码可能尚未完全满足。
当你修改旧代码时,
优先做小步、低风险、可验证的清理改进,
逐步向该规范靠拢。