mirror of
https://github.com/storytold/cadcraft.git
synced 2026-11-02 07:16:53 -06:00
Reject non-finite arguments in CAL min() and max() (#2547)
Found while testing crates/engine/src/cmd/utility/calc.rs:~355-360 (call, "min" | "max" branch using f64::min/f64::max) Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Haiku 5.5
parent
7cee28580d
commit
b0b2aba23e
@@ -333,6 +333,9 @@ fn call(name: &str, args: &[Val]) -> Result<Val, String> {
|
||||
"min" | "max" => {
|
||||
arity(1, MAX_ARGS)?;
|
||||
let vs = (0..args.len()).map(n).collect::<Result<Vec<_>, _>>()?;
|
||||
if vs.iter().any(|v| !v.is_finite()) {
|
||||
return Err("result is not a finite number".into());
|
||||
}
|
||||
let f = if name == "min" { f64::min } else { f64::max };
|
||||
Ok(Val::Num(vs.into_iter().reduce(f).unwrap_or(0.0)))
|
||||
}
|
||||
@@ -597,6 +600,10 @@ mod tests {
|
||||
assert!(ev("[1").is_err());
|
||||
assert!(ev(&"[".repeat(5000)).is_err());
|
||||
assert_eq!(ev("min(3,1,2)"), Ok(Val::Num(1.0)));
|
||||
assert!(ev("min(sqrt(-1), 5)").is_err());
|
||||
assert!(ev("max(5, ln(-1))").is_err());
|
||||
assert!(ev("min(exp(1000), 5)").is_err());
|
||||
assert!(ev("max(exp(1000), 5)").is_err());
|
||||
assert_eq!(ev("1e-3*2"), Ok(Val::Num(0.002)));
|
||||
assert!(ev("max(1,2,3,4,5,6,7,8,9)").is_err());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user