strconv: reject overflow before arithmetic

This commit is contained in:
2026-08-09 17:50:47 +09:00
parent 8e2e6ae162
commit 976dc8a813
6 changed files with 118 additions and 19 deletions

View File

@@ -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
};