limbo/fuzz/fuzz_targets/cast_real.rs
2025-04-28 11:33:46 +03:00

26 lines
752 B
Rust

#![no_main]
use libfuzzer_sys::{fuzz_target, Corpus};
use limbo_core::numeric::StrToF64;
use std::error::Error;
fn do_fuzz(text: String) -> Result<Corpus, Box<dyn Error>> {
let expected = {
let conn = rusqlite::Connection::open_in_memory()?;
conn.query_row(&format!("SELECT cast(? as real)"), (&text,), |row| {
row.get::<_, f64>(0)
})?
};
let actual = limbo_core::numeric::str_to_f64(&text)
.map(|v| {
let (StrToF64::Fractional(non_nan) | StrToF64::Decimal(non_nan)) = v;
f64::from(non_nan)
})
.unwrap_or(0.0);
assert_eq!(expected, actual);
Ok(Corpus::Keep)
}
fuzz_target!(|blob: String| -> Corpus { do_fuzz(blob).unwrap_or(Corpus::Keep) });