| // run | |
| // Copyright 2019 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // This test makes sure the text output for bounds check failures is as expected. | |
| package main | |
| import ( | |
| "fmt" | |
| "os" | |
| "runtime" | |
| "text/tabwriter" | |
| ) | |
| // Testing with length 3 slices, arrays, and strings. | |
| // Large (>1<<32) values are included to test 32-bit platforms. | |
| var indexes = []int64{-9876543210, -1, 0, 2, 3, 9876543210} | |
| var slices = []int64{-9876543210, -1, 0, 3, 4, 9876543210} | |
| var w *tabwriter.Writer | |
| func main() { | |
| w = tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', tabwriter.AlignRight) | |
| defer w.Flush() | |
| doIndex() | |
| doSlice() | |
| doSlice3() | |
| } | |
| func doIndex() { | |
| a := []int{1, 2, 3} | |
| for _, i := range indexes { | |
| printPanic(fmt.Sprintf("slice[%d]", i), func() { | |
| _ = a[i] | |
| }) | |
| } | |
| b := [3]int{1, 2, 3} | |
| for _, i := range indexes { | |
| printPanic(fmt.Sprintf("array[%d]", i), func() { | |
| _ = b[i] | |
| }) | |
| } | |
| c := "123" | |
| for _, i := range indexes { | |
| printPanic(fmt.Sprintf("string[%d]", i), func() { | |
| _ = c[i] | |
| }) | |
| } | |
| } | |
| func doSlice() { | |
| a := []int{1, 2, 3} | |
| for _, i := range slices { | |
| for _, j := range slices { | |
| printPanic(fmt.Sprintf("slice[%d:%d]", i, j), func() { | |
| _ = a[i:j] | |
| }) | |
| } | |
| } | |
| b := [3]int{1, 2, 3} | |
| for _, i := range slices { | |
| for _, j := range slices { | |
| printPanic(fmt.Sprintf("array[%d:%d]", i, j), func() { | |
| _ = b[i:j] | |
| }) | |
| } | |
| } | |
| c := "123" | |
| for _, i := range slices { | |
| for _, j := range slices { | |
| printPanic(fmt.Sprintf("string[%d:%d]", i, j), func() { | |
| _ = c[i:j] | |
| }) | |
| } | |
| } | |
| } | |
| func doSlice3() { | |
| a := []int{1, 2, 3} | |
| for _, i := range slices { | |
| for _, j := range slices { | |
| for _, k := range slices { | |
| printPanic(fmt.Sprintf("slice[%d:%d:%d]", i, j, k), func() { | |
| _ = a[i:j:k] | |
| }) | |
| } | |
| } | |
| } | |
| b := [3]int{1, 2, 3} | |
| for _, i := range slices { | |
| for _, j := range slices { | |
| for _, k := range slices { | |
| printPanic(fmt.Sprintf("array[%d:%d:%d]", i, j, k), func() { | |
| _ = b[i:j:k] | |
| }) | |
| } | |
| } | |
| } | |
| } | |
| func printPanic(msg string, f func()) { | |
| defer func() { | |
| res := "no panic" | |
| if e := recover(); e != nil { | |
| res = e.(runtime.Error).Error() | |
| } | |
| fmt.Fprintf(w, "%s\t %s\n", msg, res) | |
| }() | |
| f() | |
| } |