|  | // run | 
|  |  | 
|  | // Copyright 2018 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. | 
|  |  | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | ) | 
|  |  | 
|  | // test expects f to panic, but not to run out of memory, | 
|  | // which is a non-panic fatal error.  OOM results from failure | 
|  | // to properly check negative limit. | 
|  | func test(f func()) { | 
|  | defer func() { | 
|  | r := recover() | 
|  | if r == nil { | 
|  | panic("panic wasn't recoverable") | 
|  | } | 
|  | }() | 
|  | f() | 
|  | } | 
|  |  | 
|  | //go:noinline | 
|  | func id(x int) int { | 
|  | return x | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | test(foo) | 
|  | test(bar) | 
|  | } | 
|  |  | 
|  | func foo() { | 
|  | b := make([]byte, 0) | 
|  | b = append(b, 1) | 
|  | id(len(b)) | 
|  | id(len(b) - 2) | 
|  | s := string(b[1 : len(b)-2]) | 
|  | fmt.Println(s) | 
|  | } | 
|  |  | 
|  | func bar() { | 
|  | b := make([]byte, 1) | 
|  | b = append(b, 1) | 
|  | i := id(-1) | 
|  | if i < len(b) { // establish value is not too large. | 
|  | s := string(b[1:i]) // should check for negative also. | 
|  | fmt.Println(s) | 
|  | } | 
|  | } |