Report a prep-time arg that its check should have caught

calcPrep discarded parseCalc's error, so a divergence from checkCalc would
have produced a nil AST and then a nil dereference per render, with no
message. atoi did the same quietly, returning zero for a length, range or
decimal count. Both now panic naming the argument, so the invariant they rest
on fails where it breaks.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
M
2026-08-31 14:02:35 +02:00
committed by lilleman-tw
parent 2e187117f8
commit 0cee8b2183
2 changed files with 14 additions and 3 deletions
+10 -2
View File
@@ -93,8 +93,16 @@ func generate(f func(rng) string) func([]string) callFn {
const hexDigits = "0123456789abcdef"
// atoi parses an arg already validated by a builtin's check, so it cannot fail.
func atoi(s string) int { n, _ := strconv.Atoi(s); return n }
// atoi parses an arg a builtin's check already validated. It panics rather than
// returning zero, so a check that stops covering its own args is a stack trace and
// not a silently wrong length, range or decimal count.
func atoi(s string) int {
n, err := strconv.Atoi(s)
if err != nil {
panic(fmt.Sprintf("fakes: builtin arg %q reached prep unvalidated: %v", s, err))
}
return n
}
func randBytes(r rng, n int) []byte {
b := make([]byte, n)