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