utils.gno
1.44 Kb ยท 58 lines
1package v1
2
3import "math"
4
5// safeAddInt64 performs safe addition of int64 values, panicking on overflow or underflow
6func safeAddInt64(a, b int64) int64 {
7 if a > 0 && b > math.MaxInt64-a {
8 panic("int64 addition overflow")
9 }
10
11 if a < 0 && b < math.MinInt64-a {
12 panic("int64 addition underflow")
13 }
14
15 return a + b
16}
17
18// safeSubInt64 performs safe subtraction of int64 values, panicking on overflow or underflow
19func safeSubInt64(a, b int64) int64 {
20 if b > 0 && a < math.MinInt64+b {
21 panic("int64 subtraction underflow")
22 }
23
24 if b < 0 && a > math.MaxInt64+b {
25 panic("int64 subtraction overflow")
26 }
27
28 return a - b
29}
30
31// safeMulDiv performs safe multiplication and division: (a * b) / c
32// Prevents overflow in multiplication step by checking bounds
33func safeMulDiv(a, b, c int64) int64 {
34 if c == 0 {
35 panic("division by zero in safeMulDiv")
36 }
37
38 // Check for multiplication overflow
39 // If a * b would overflow, we need to be careful
40 if a != 0 && b != 0 {
41 // Check if multiplication would overflow
42 if a > 0 && b > 0 && a > math.MaxInt64/b {
43 panic("int64 multiplication overflow in safeMulDiv")
44 }
45 if a > 0 && b < 0 && b < math.MinInt64/a {
46 panic("int64 multiplication underflow in safeMulDiv")
47 }
48 if a < 0 && b > 0 && a < math.MinInt64/b {
49 panic("int64 multiplication underflow in safeMulDiv")
50 }
51 if a < 0 && b < 0 && a < math.MaxInt64/b {
52 panic("int64 multiplication overflow in safeMulDiv")
53 }
54 }
55
56 result := (a * b) / c
57 return result
58}