strconv: reject overflow before arithmetic
This commit is contained in:
@@ -14,7 +14,6 @@
|
||||
package strconv_test;
|
||||
|
||||
import strconv;
|
||||
import os;
|
||||
import math;
|
||||
|
||||
|
||||
@@ -43,6 +42,15 @@ fn rt64(x: f64) bool = {
|
||||
return false;
|
||||
};
|
||||
|
||||
fn rt32(x: f32) bool = {
|
||||
match (stof32(f32tos(x), base.DEC)) {
|
||||
case let v: f32 => { return math.f32bits(v) == math.f32bits(x); };
|
||||
case let e: invalid => { return false; };
|
||||
case let e: overflow => { return false; };
|
||||
};
|
||||
return false;
|
||||
};
|
||||
|
||||
// ftos_test.ha:57-64 (G/void/NONE-equivalent) — fixed-point renders.
|
||||
@test fn f64tos_fixed() void = {
|
||||
assert(!(!chk(13.37, "13.37")));
|
||||
@@ -136,6 +144,16 @@ fn chkf32(n: f32, want: str) bool = {
|
||||
assert(!(!chkf32(maxnorm, "3.4028235e38")));
|
||||
};
|
||||
|
||||
@test fn f32_roundtrip_boundaries() void = {
|
||||
assert(!(!rt32(math.f32frombits(0x00000001u32))));
|
||||
assert(!(!rt32(math.f32frombits(0x007FFFFFu32))));
|
||||
assert(!(!rt32(math.f32frombits(0x00800000u32))));
|
||||
assert(!(!rt32(math.f32frombits(0x00800001u32))));
|
||||
assert(!(!rt32(math.f32frombits(0x7F7FFFFFu32))));
|
||||
assert(!(!rt32(math.f32frombits(0x807FFFFFu32))));
|
||||
assert(!(!rt32(math.f32frombits(0x80800000u32))));
|
||||
};
|
||||
|
||||
// ftos_test.ha:11/15/26 — zero, ±infinity, nan (f32 bit patterns).
|
||||
@test fn f32tos_special() void = {
|
||||
assert(!(!chkf32(0.0f32, "0")));
|
||||
@@ -162,6 +180,10 @@ fn chkf32(n: f32, want: str) bool = {
|
||||
assert(!(!rt64(90071992547409915.0))); // 17-digit halfway pair
|
||||
assert(!(!rt64(90071992547409925.0)));
|
||||
assert(!(!rt64(math.f64frombits(0x0000000000000001u64)))); // F64_MIN_SUBNORMAL (5e-324)
|
||||
assert(!(!rt64(math.f64frombits(0x000FFFFFFFFFFFFFu64)))); // F64_MAX_SUBNORMAL
|
||||
assert(!(!rt64(math.f64frombits(0x0010000000000000u64)))); // F64_MIN_NORMAL
|
||||
assert(!(!rt64(math.f64frombits(0x0010000000000001u64)))); // next normal
|
||||
assert(!(!rt64(math.f64frombits(0x800FFFFFFFFFFFFFu64)))); // negative max subnormal
|
||||
assert(!(!rt64(math.f64frombits(0x8010000000000000u64)))); // negative min normal
|
||||
assert(!(!rt64(math.f64frombits(0x7FEFFFFFFFFFFFFFu64)))); // F64_MAX_NORMAL
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user