| // run |
| |
| // Copyright 2010 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. |
| |
| // https://golang.org/issue/589 |
| |
| package main |
| |
| import "unsafe" |
| |
| var bug = false |
| |
| var minus1 = -1 |
| var five = 5 |
| var big int64 = 10 | 1<<46 |
| |
| type block [1 << 19]byte |
| |
| var g1 []block |
| |
| func shouldfail(f func(), desc string) { |
| defer func() { recover() }() |
| f() |
| if !bug { |
| println("BUG") |
| bug = true |
| } |
| println("didn't crash: ", desc) |
| } |
| |
| func badlen() { |
| g1 = make([]block, minus1) |
| } |
| |
| func biglen() { |
| g1 = make([]block, big) |
| } |
| |
| func badcap() { |
| g1 = make([]block, 10, minus1) |
| } |
| |
| func badcap1() { |
| g1 = make([]block, 10, five) |
| } |
| |
| func bigcap() { |
| g1 = make([]block, 10, big) |
| } |
| |
| type cblock [1<<16 - 1]byte |
| |
| var g4 chan cblock |
| |
| func badchancap() { |
| g4 = make(chan cblock, minus1) |
| } |
| |
| func bigchancap() { |
| g4 = make(chan cblock, big) |
| } |
| |
| func overflowchan() { |
| const ptrSize = unsafe.Sizeof(uintptr(0)) |
| g4 = make(chan cblock, 1<<(30*(ptrSize/4))) |
| } |
| |
| func main() { |
| shouldfail(badlen, "badlen") |
| shouldfail(biglen, "biglen") |
| shouldfail(badcap, "badcap") |
| shouldfail(badcap1, "badcap1") |
| shouldfail(bigcap, "bigcap") |
| shouldfail(badchancap, "badchancap") |
| shouldfail(bigchancap, "bigchancap") |
| shouldfail(overflowchan, "overflowchan") |
| } |