Skip to content

Commit 604004d

Browse files
committed
fix some more fuzzed crashes
1 parent a36532f commit 604004d

File tree

3 files changed

+39
-25
lines changed

3 files changed

+39
-25
lines changed

src/algorithm/dyadic/mod.rs

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1789,29 +1789,34 @@ fn digits_needed_for_base(n: f64, base: f64) -> usize {
17891789
}
17901790
}
17911791

1792+
fn validate_base(base: f64, env: &Uiua) -> UiuaResult {
1793+
if base == 0.0 {
1794+
Err(env.error("Base cannot be 0"))
1795+
} else if base == 1.0 {
1796+
Err(env.error("Base cannot be 1"))
1797+
} else if base == -1.0 {
1798+
Err(env.error("Base cannot be ¯1"))
1799+
} else if base.is_nan() {
1800+
Err(env.error("Base cannot be NaN"))
1801+
} else if (-1.0..0.0).contains(&base) {
1802+
Err(env.error("Base cannot be between ¯1 and 0"))
1803+
} else {
1804+
Ok(())
1805+
}
1806+
}
1807+
17921808
impl<T: RealArrayValue + GridFmt> Array<T> {
17931809
fn base_scalar(&self, base: f64, env: &Uiua) -> UiuaResult<Array<f64>> {
1794-
if base == 0.0 {
1795-
return Err(env.error("Base cannot be 0"));
1796-
}
1797-
if base == 1.0 {
1798-
return Err(env.error("Base cannot be 1"));
1799-
}
1800-
if base == -1.0 {
1801-
return Err(env.error("Base cannot be ¯1"));
1802-
}
1810+
validate_base(base, env)?;
1811+
1812+
// Validation
18031813
if base.is_infinite() {
18041814
return Err(env.error("Base cannot be infinite"));
18051815
}
1806-
if base.is_nan() {
1807-
return Err(env.error("Base cannot be NaN"));
1808-
}
1809-
if (-1.0..0.0).contains(&base) {
1810-
return Err(env.error("Base cannot be between ¯1 and 0"));
1811-
}
18121816
if let Some(n) = self.data.iter().find(|n| n.to_f64().is_infinite()) {
18131817
return Err(env.error(format!("Cannot take base of {}", n.grid_string(false))));
18141818
}
1819+
18151820
Ok(if base >= 0.0 {
18161821
let max_row_len = (self.data.iter())
18171822
.map(|&n| digits_needed_for_base(n.to_f64(), base))
@@ -1859,17 +1864,17 @@ impl<T: RealArrayValue + GridFmt> Array<T> {
18591864
}
18601865
fn base_list(&self, bases: &[f64], env: &Uiua) -> UiuaResult<Array<f64>> {
18611866
let fill = env.scalar_fill::<f64>().ok().map(|fv| fv.value);
1867+
// Validation
18621868
for base in bases.iter().copied().chain(fill) {
1863-
if base == 0.0 {
1864-
return Err(env.error("Base cannot contain 0s"));
1865-
}
18661869
if base.is_infinite() && base.is_sign_negative() {
18671870
return Err(env.error("Base cannot contain negative infinities"));
18681871
}
1869-
if base.is_nan() {
1870-
return Err(env.error("Base cannot contain NaNs"));
1871-
}
1872+
validate_base(base, env)?;
18721873
}
1874+
if let Some(n) = self.data.iter().find(|n| n.to_f64().is_infinite()) {
1875+
return Err(env.error(format!("Cannot take base of {}", n.grid_string(false))));
1876+
}
1877+
18731878
let fill_digits = if let Some(fill) = fill {
18741879
let product: f64 = bases.iter().product();
18751880
self.data

src/algorithm/stencil.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,9 @@ where
128128
{
129129
let mut shape = shape_prefix;
130130
shape.extend(window_shape);
131-
env.push(Array::new(shape, EcoVec::new()));
131+
for _ in 0..f.sig.outputs() {
132+
env.push(Array::new(shape.clone(), EcoVec::new()));
133+
}
132134
}
133135
return Ok(());
134136
}

src/lib.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -418,11 +418,15 @@ mod tests {
418418
}
419419

420420
#[test]
421-
#[ignore] // Too expensive
421+
#[ignore] // Too expensive.
422+
/// Run with:
423+
/// ```
424+
/// cargo t fuzz -- --nocapture --ignored
425+
/// ```
422426
fn fuzz() {
423427
let iter = Primitive::non_deprecated().filter(|p| !matches!(p, Primitive::Sys(_)));
424428
for needs_name in [false, true] {
425-
for a in iter.clone().skip_while(|&p| p != Primitive::Group) {
429+
for a in iter.clone() {
426430
for b in iter.clone() {
427431
for c in iter.clone() {
428432
if a.glyph().is_none()
@@ -431,7 +435,10 @@ mod tests {
431435
{
432436
continue;
433437
}
434-
if [Primitive::Repeat, Primitive::Infinity] == [a, c] {
438+
if [a, c] == [Primitive::Repeat, Primitive::Infinity]
439+
|| [a, b] == [Primitive::Un, Primitive::Repeat]
440+
|| a == Primitive::Do
441+
{
435442
continue;
436443
}
437444
let funcs = format!("{a}{b}{c}");

0 commit comments

Comments
 (0)