зеркало из https://github.com/CryptoPro/go.git
113 строки
2.2 KiB
Go
113 строки
2.2 KiB
Go
// 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()
|
|
}
|