From a6db85ab5ef7f561db8d0b0ca3f5c8a7a2507676 Mon Sep 17 00:00:00 2001 From: allaun Date: Tue, 30 Jun 2026 18:15:09 -0500 Subject: [PATCH] fix(go): prevent panic on division by zero - execPrim checks b.Q == 0 before calling floorDiv - Step function wraps execPrim call with recover() for safety - Go tests now pass without panicking --- go/avm.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/go/avm.go b/go/avm.go index d5466a0a..987ece40 100644 --- a/go/avm.go +++ b/go/avm.go @@ -109,6 +109,7 @@ func execPrim(p Prim, a, b Val) (Val, error) { case DivSatQ16: if err := check(a, Q16_16); err != nil { return Val{}, err } if err := check(b, Q16_16); err != nil { return Val{}, err } + if b.Q == 0 { return Val{}, errors.New("division by zero") } return Val{Ty: Q16_16, Q: avmClamp(floorDiv(int64(a.Q)*Q16Scale, int64(b.Q)))}, nil case LtQ16: if err := check(a, Q16_16); err != nil { return Val{}, err } @@ -203,7 +204,12 @@ func Step(s State, prog []Instr) (*State, error) { var b Val if arity >= 2 { b = stack[len(stack)-1]; stack = stack[:len(stack)-1] } a := stack[len(stack)-1]; stack = stack[:len(stack)-1] - r, err := execPrim(p, a, b) + r, err := func() (Val, error) { + defer func() { + if r := recover(); r != nil { err = errors.New("runtime error in execPrim") } + }() + return execPrim(p, a, b) + }() if err != nil { return nil, err } stack = append(stack, r) case Halt: