From vcsdd
Provides Kani proof harness patterns, proptest strategies, cargo-fuzz setups, and cargo-mutants guidance for verification in Rust projects.
npx claudepluginhub sc30gsw/vcsdd-claude-code --plugin vcsddThis skill uses the workspace's default tool permissions.
| Tier | Tool | Install | Use Case |
Runs fuzz tests on Rust code using cargo-fuzz and libFuzzer to discover crashes, bugs, and security vulnerabilities.
Provides references for state-of-the-art Rust tools like ast-grep (refactoring), samply (profiling), Criterion/divan (benchmarking), cargo-nextest (testing), cargo-mutants (mutation testing), and SIMD optimizers.
Guides Phase 5 formal hardening with tool selection, proof harness patterns for Rust (Kani/proptest), Python (hypothesis), TypeScript (fast-check), security/purity audits, and verification interpretation.
Share bugs, ideas, or general feedback.
| Tier | Tool | Install | Use Case |
|---|---|---|---|
| 1 | proptest | cargo add proptest --dev | Property-based testing |
| 1 | cargo-fuzz | cargo install cargo-fuzz | Coverage-guided fuzzing |
| 1 | cargo-mutants | cargo install cargo-mutants | Mutation testing |
| 2-3 | kani | cargo install kani-verifier | Bounded model checking |
// In src/parser.rs or separate verification/proof-harnesses/parser.rs
#[cfg(kani)]
mod kani_proofs {
use super::*;
#[kani::proof]
fn verify_empty_input_returns_error() {
let result = parse("");
assert_eq!(result, Err(ParseError::Empty));
}
#[kani::proof]
#[kani::unwind(5)]
fn verify_parse_never_panics() {
let input: String = kani::any();
kani::assume(input.len() < 20);
// Should return Ok or Err, never panic
let _ = parse(&input);
}
}
Run: cargo kani
use proptest::prelude::*;
proptest! {
#[test]
fn test_parse_roundtrip(s in "[a-z]{1,20}") {
if let Ok(parsed) = parse(&s) {
assert_eq!(serialize(parsed), s);
}
}
#[test]
fn test_parse_does_not_panic(s in any::<String>()) {
let _ = parse(&s);
}
}
cargo fuzz init
cargo fuzz add fuzz_parse
# Edit fuzz/fuzz_targets/fuzz_parse.rs:
# use libfuzzer_sys::fuzz_target;
# fuzz_target!(|data: &[u8]| {
# if let Ok(s) = std::str::from_utf8(data) {
# let _ = parse(s);
# }
# });
cargo fuzz run fuzz_parse -- -max_total_time=60
cargo mutants --timeout 30
# Results in mutants.out/