| // 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() |
| } |