1package main 2 3import ( 4 "fmt" 5 "runtime" 6) 7 8var failed = false 9 10func checkDivByZero(f func()) (divByZero bool) { 11 defer func() { 12 if r := recover(); r != nil { 13 if e, ok := r.(runtime.Error); ok && e.Error() == "runtime error: integer divide by zero" { 14 divByZero = true 15 } 16 } 17 }() 18 f() 19 return false 20} 21 22//go:noinline 23func a(i uint, s []int) int { 24 return s[i%uint(len(s))] 25} 26 27//go:noinline 28func b(i uint, j uint) uint { 29 return i / j 30} 31 32//go:noinline 33func c(i int) int { 34 return 7 / (i - i) 35} 36 37func main() { 38 if got := checkDivByZero(func() { b(7, 0) }); !got { 39 fmt.Printf("expected div by zero for b(7, 0), got no error\n") 40 failed = true 41 } 42 if got := checkDivByZero(func() { b(7, 7) }); got { 43 fmt.Printf("expected no error for b(7, 7), got div by zero\n") 44 failed = true 45 } 46 if got := checkDivByZero(func() { a(4, nil) }); !got { 47 fmt.Printf("expected div by zero for a(4, nil), got no error\n") 48 failed = true 49 } 50 if got := checkDivByZero(func() { c(5) }); !got { 51 fmt.Printf("expected div by zero for c(5), got no error\n") 52 failed = true 53 } 54 55 if failed { 56 panic("tests failed") 57 } 58} 59