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