From 4b79b39c878a0de830ef2d1fd60c44773857a1e2 Mon Sep 17 00:00:00 2001 From: Raphael Date: Sat, 25 Apr 2026 17:15:43 +0200 Subject: [PATCH] feat: added saveguards for the std::number::log function --- .../src/runtime/functions/number.rs | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/crates/taurus-core/src/runtime/functions/number.rs b/crates/taurus-core/src/runtime/functions/number.rs index 20e57ff..58c7346 100644 --- a/crates/taurus-core/src/runtime/functions/number.rs +++ b/crates/taurus-core/src/runtime/functions/number.rs @@ -521,7 +521,36 @@ fn log( Ok(v) => v, Err(e) => return e, }; - Signal::Success(value_from_f64(value.log(base))) + if !value.is_finite() || !base.is_finite() { + return Signal::Failure(RuntimeError::new( + "T-STD-00001", + "InvalidArgumentRuntimeError", + "Log input and base must be finite numbers", + )); + } + if value <= 0.0 { + return Signal::Failure(RuntimeError::new( + "T-STD-00001", + "InvalidArgumentRuntimeError", + "Log input must be greater than zero", + )); + } + if base <= 0.0 || base == 1.0 { + return Signal::Failure(RuntimeError::new( + "T-STD-00001", + "InvalidArgumentRuntimeError", + "Log base must be greater than zero and not equal to one", + )); + } + let result = value.log(base); + if !result.is_finite() { + return Signal::Failure(RuntimeError::new( + "T-STD-00001", + "InvalidArgumentRuntimeError", + "Log result was not finite", + )); + } + Signal::Success(value_from_f64(result)) } fn ln( @@ -1086,6 +1115,24 @@ mod tests { let mut run = dummy_run; let ln1 = expect_num(ln(&[a_num(f64::consts::E)], &mut ctx, &mut run)); assert!((ln1 - 1.0).abs() < f64::EPSILON); + + let mut run = dummy_run; + assert!(matches!( + log(&[a_num(-100.0), a_num(10.0)], &mut ctx, &mut run), + Signal::Failure(_) + )); + + let mut run = dummy_run; + assert!(matches!( + log(&[a_num(100.0), a_num(1.0)], &mut ctx, &mut run), + Signal::Failure(_) + )); + + let mut run = dummy_run; + assert!(matches!( + log(&[a_num(100.0), a_num(0.0)], &mut ctx, &mut run), + Signal::Failure(_) + )); } #[test]