| package main | |
| import ( | |
| "fmt" | |
| "runtime" | |
| ) | |
| var failed = false | |
| func checkDivByZero(f func()) (divByZero bool) { | |
| defer func() { | |
| if r := recover(); r != nil { | |
| if e, ok := r.(runtime.Error); ok && e.Error() == "runtime error: integer divide by zero" { | |
| divByZero = true | |
| } | |
| } | |
| }() | |
| f() | |
| return false | |
| } | |
| //go:noinline | |
| func a(i uint, s []int) int { | |
| return s[i%uint(len(s))] | |
| } | |
| //go:noinline | |
| func b(i uint, j uint) uint { | |
| return i / j | |
| } | |
| //go:noinline | |
| func c(i int) int { | |
| return 7 / (i - i) | |
| } | |
| func main() { | |
| if got := checkDivByZero(func() { b(7, 0) }); !got { | |
| fmt.Printf("expected div by zero for b(7, 0), got no error\n") | |
| failed = true | |
| } | |
| if got := checkDivByZero(func() { b(7, 7) }); got { | |
| fmt.Printf("expected no error for b(7, 7), got div by zero\n") | |
| failed = true | |
| } | |
| if got := checkDivByZero(func() { a(4, nil) }); !got { | |
| fmt.Printf("expected div by zero for a(4, nil), got no error\n") | |
| failed = true | |
| } | |
| if got := checkDivByZero(func() { c(5) }); !got { | |
| fmt.Printf("expected div by zero for c(5), got no error\n") | |
| failed = true | |
| } | |
| if failed { | |
| panic("tests failed") | |
| } | |
| } |