1// run
2
3// Copyright 2018 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7package main
8
9import (
10	"fmt"
11)
12
13// test expects f to panic, but not to run out of memory,
14// which is a non-panic fatal error.  OOM results from failure
15// to properly check negative limit.
16func test(f func()) {
17	defer func() {
18		r := recover()
19		if r == nil {
20			panic("panic wasn't recoverable")
21		}
22	}()
23	f()
24}
25
26//go:noinline
27func id(x int) int {
28	return x
29}
30
31func main() {
32	test(foo)
33	test(bar)
34}
35
36func foo() {
37	b := make([]byte, 0)
38	b = append(b, 1)
39	id(len(b))
40	id(len(b) - 2)
41	s := string(b[1 : len(b)-2])
42	fmt.Println(s)
43}
44
45func bar() {
46	b := make([]byte, 1)
47	b = append(b, 1)
48	i := id(-1)
49	if i < len(b) { // establish value is not too large.
50		s := string(b[1:i]) // should check for negative also.
51		fmt.Println(s)
52	}
53}
54