| name | fuzz |
| description | Fuzz SQL parser and storage with cargo-fuzz — setup targets, run, add regression tests for crashes |
/fuzz — Testing with random inputs
Critical for the SQL parser (malformed inputs) and storage (corrupt pages).
Initial setup (once)
cargo install cargo-fuzz
cd /home/familia/axiomdb
cargo fuzz init
cargo fuzz add fuzz_sql_parser
cargo fuzz add fuzz_storage_pages
cargo fuzz add fuzz_wal_recovery
cargo fuzz add fuzz_btree_ops
Implement each target
#![no_main]
use libfuzzer_sys::fuzz_target;
fuzz_target!(|data: &[u8]| {
if let Ok(sql) = std::str::from_utf8(data) {
let _ = axiomdb_sql::Parser::new().parse(sql);
}
});
fuzz_target!(|data: &[u8]| {
if data.len() < 8192 { return; }
let mut page_bytes = [0u8; 8192];
page_bytes.copy_from_slice(&data[..8192]);
let _ = axiomdb_storage::Page::from_bytes(&page_bytes);
});
Run fuzz tests
cargo fuzz run fuzz_sql_parser
cargo fuzz run fuzz_sql_parser -- -max_total_time=300
cargo fuzz coverage fuzz_sql_parser
cargo fuzz fmt coverage fuzz_sql_parser
ls fuzz/artifacts/fuzz_sql_parser/
For each crash found
cargo fuzz run fuzz_sql_parser fuzz/artifacts/fuzz_sql_parser/crash-HASH
cargo fuzz tmin fuzz_sql_parser fuzz/artifacts/fuzz_sql_parser/crash-HASH
#[test]
fn test_fuzz_regression_sql_crash_20260321() {
let input = b"\xff\xfe SELECT * FROM";
let result = Parser::new().parse(std::str::from_utf8(input).unwrap_or(""));
assert!(result.is_err() || result.is_ok());
}
In CI (automate)
- name: Fuzz SQL Parser (60s)
run: cargo fuzz run fuzz_sql_parser -- -max_total_time=60
- name: Fuzz Storage (60s)
run: cargo fuzz run fuzz_storage_pages -- -max_total_time=60