207 lines
5.3 KiB
Markdown
207 lines
5.3 KiB
Markdown
---
|
|
name: code-quality-check
|
|
description: This skill should be used before committing code to ensure it meets Breenix quality standards. Use for running clippy checks, fixing compiler warnings, verifying no log side-effects, checking for dead code, and enforcing project coding standards from CLAUDE.md.
|
|
---
|
|
|
|
# Code Quality Checks for Breenix
|
|
|
|
Pre-commit code quality verification for Breenix kernel development.
|
|
|
|
## Purpose
|
|
|
|
Breenix enforces strict code quality standards. This skill provides the checks and fixes required before committing code.
|
|
|
|
## Core Quality Standards (from CLAUDE.md)
|
|
|
|
1. **Fix ALL compiler warnings before committing**
|
|
2. **Fix ALL clippy warnings**
|
|
3. **Use proper patterns** (e.g., `Once`) to avoid unsafe warnings
|
|
4. **Only `#[allow(dead_code)]`** for legitimate API functions
|
|
|
|
## Pre-Commit Checklist
|
|
|
|
Before every commit:
|
|
|
|
```bash
|
|
# 1. Build kernel and check for warnings
|
|
cd kernel
|
|
cargo build --target x86_64-unknown-none 2>&1 | grep warning
|
|
|
|
# 2. Run clippy
|
|
cargo clippy --target x86_64-unknown-none
|
|
|
|
# 3. Run tests (if modifying core subsystems)
|
|
cd ..
|
|
cargo test
|
|
|
|
# 4. Check for log side-effects (manual)
|
|
grep -R "log::trace!.*(" kernel/src/ | grep -vE '\".*\"' | grep -vE '\.(as_|to_|into_|len|is_|get)'
|
|
```
|
|
|
|
## Clippy Configuration
|
|
|
|
### Project-Specific Clippy Flags
|
|
|
|
```bash
|
|
cd kernel
|
|
RUSTFLAGS="-Aclippy::redundant_closure_for_method_calls" \
|
|
cargo clippy --target x86_64-unknown-none \
|
|
-- -Dclippy::debug_assert_with_mut_call \
|
|
-Dclippy::print_stdout \
|
|
-Wclippy::suspicious_operation_groupings
|
|
```
|
|
|
|
### What These Check
|
|
|
|
- **`debug_assert_with_mut_call`**: Prevent side-effects in debug assertions
|
|
- **`print_stdout`**: No print!/println! in kernel (use log! macros)
|
|
- **`suspicious_operation_groupings`**: Catch likely logic errors
|
|
|
|
## Common Issues and Fixes
|
|
|
|
### Compiler Warnings
|
|
|
|
**Unused imports**:
|
|
```rust
|
|
// BAD
|
|
use x86_64::{VirtAddr, PageTable, PageTableFlags}; // PageTable unused
|
|
|
|
// GOOD
|
|
use x86_64::{VirtAddr, PageTableFlags};
|
|
```
|
|
|
|
**Unused variables**:
|
|
```rust
|
|
// BAD
|
|
let result = some_function(); // result unused
|
|
|
|
// GOOD
|
|
let _result = some_function(); // Explicitly unused
|
|
// OR
|
|
some_function(); // Don't capture if not needed
|
|
```
|
|
|
|
**Dead code**:
|
|
```rust
|
|
// BAD - function never called
|
|
fn helper_function() { ... }
|
|
|
|
// GOOD - remove it
|
|
// OR add #[allow(dead_code)] if it's part of a public API
|
|
|
|
// GOOD - legitimate API function
|
|
#[allow(dead_code)] // Part of public allocator API
|
|
pub fn dealloc_stack(&mut self, stack_id: usize) { ... }
|
|
```
|
|
|
|
### Clippy Warnings
|
|
|
|
**Redundant closure**:
|
|
```rust
|
|
// BAD
|
|
items.map(|x| x.to_string())
|
|
|
|
// GOOD (but we allow this via RUSTFLAGS)
|
|
items.map(ToString::to_string)
|
|
```
|
|
|
|
**Debug assert with mutation**:
|
|
```rust
|
|
// BAD - side effect in assertion
|
|
debug_assert!(list.pop().is_some());
|
|
|
|
// GOOD - separate the effect
|
|
let item = list.pop();
|
|
debug_assert!(item.is_some());
|
|
```
|
|
|
|
### Log Side-Effects
|
|
|
|
**Problem**: Function calls in log statements execute even when logging disabled.
|
|
|
|
```rust
|
|
// BAD - get_state() called even if TRACE disabled
|
|
log::trace!("State: {:?}", get_state());
|
|
|
|
// GOOD - only format if needed
|
|
let state = get_state();
|
|
log::trace!("State: {:?}", state);
|
|
|
|
// BETTER - for expensive operations
|
|
if log::log_enabled!(log::Level::Trace) {
|
|
let state = expensive_get_state();
|
|
log::trace!("State: {:?}", state);
|
|
}
|
|
```
|
|
|
|
## CI Code Quality Workflow
|
|
|
|
The `.github/workflows/code-quality.yml` runs these checks automatically:
|
|
|
|
1. **Clippy checks** with project-specific flags
|
|
2. **Log side-effects scan** for trace statements with function calls
|
|
3. **Complex log expression check** for multi-argument format strings
|
|
4. **Log level regression guard** - ensures feature flags control log level
|
|
|
|
## Quick Reference
|
|
|
|
### Before Commit
|
|
|
|
```bash
|
|
# Full quality check
|
|
cd kernel
|
|
cargo build --target x86_64-unknown-none 2>&1 | tee /tmp/build-warnings.txt
|
|
cargo clippy --target x86_64-unknown-none 2>&1 | tee /tmp/clippy-warnings.txt
|
|
|
|
# Review warnings
|
|
grep warning /tmp/build-warnings.txt
|
|
less /tmp/clippy-warnings.txt
|
|
|
|
# Fix all warnings before committing!
|
|
```
|
|
|
|
### Common Warning Fixes
|
|
|
|
| Warning | Fix |
|
|
|---------|-----|
|
|
| unused import | Remove from use statement |
|
|
| unused variable | Prefix with _ or remove |
|
|
| dead code | Remove or add #[allow(dead_code)] for API |
|
|
| redundant closure | Allow via RUSTFLAGS or fix |
|
|
| print_stdout | Replace print! with log::info! |
|
|
| debug_assert mutation | Extract to separate statement |
|
|
|
|
## Integration with Git Workflow
|
|
|
|
```bash
|
|
# Before committing
|
|
git status # See what you're about to commit
|
|
cd kernel
|
|
cargo clippy --target x86_64-unknown-none # Fix all warnings
|
|
|
|
# Then commit
|
|
git add kernel/src/...
|
|
git commit -m "Fix: ..."
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Fix warnings as you go**: Don't accumulate them
|
|
2. **Run clippy frequently**: Catch issues early
|
|
3. **Use proper logging**: log! macros, not print!
|
|
4. **Avoid side-effects in logs**: Especially in trace/debug
|
|
5. **Comment allowed dead code**: Explain why it's part of the API
|
|
6. **Use feature flags**: Control debug vs release behavior
|
|
7. **Test before committing**: cargo test if touching core code
|
|
|
|
## Summary
|
|
|
|
Code quality standards enforce:
|
|
- Zero compiler warnings
|
|
- Zero clippy warnings
|
|
- No side-effects in log statements
|
|
- Appropriate use of #[allow] attributes
|
|
- Proper logging practices
|
|
|
|
Run checks before every commit to maintain high code quality.
|