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