go issue30116 源码

  • 2022-07-15
  • 浏览 (780)

golang issue30116 代码

文件路径:/test/fixedbugs/issue30116.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()
}

相关信息

go 源码目录

相关文章

go bug000 源码

go bug002 源码

go bug003 源码

go bug004 源码

go bug005 源码

go bug006 源码

go bug007 源码

go bug008 源码

go bug009 源码

go bug010 源码

0  赞