| // errorcheck -0 -m -l -newescape=true |
| |
| // Copyright 2015 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. |
| |
| // Test escape analysis for function parameters. |
| |
| // In this test almost everything is BAD except the simplest cases |
| // where input directly flows to output. |
| |
| package foo |
| |
| func f(buf []byte) []byte { // ERROR "leaking param: buf to result ~r1 level=0$" |
| return buf |
| } |
| |
| func g(*byte) string |
| |
| func h(e int) { |
| var x [32]byte // ERROR "moved to heap: x$" |
| g(&f(x[:])[0]) |
| } |
| |
| type Node struct { |
| s string |
| left, right *Node |
| } |
| |
| func walk(np **Node) int { // ERROR "leaking param content: np" |
| n := *np |
| w := len(n.s) |
| if n == nil { |
| return 0 |
| } |
| wl := walk(&n.left) |
| wr := walk(&n.right) |
| if wl < wr { |
| n.left, n.right = n.right, n.left // ERROR "ignoring self-assignment" |
| wl, wr = wr, wl |
| } |
| *np = n |
| return w + wl + wr |
| } |
| |
| // Test for bug where func var f used prototype's escape analysis results. |
| func prototype(xyz []string) {} // ERROR "prototype xyz does not escape" |
| func bar() { |
| var got [][]string |
| f := prototype |
| f = func(ss []string) { got = append(got, ss) } // ERROR "leaking param: ss" "func literal does not escape" |
| s := "string" |
| f([]string{s}) // ERROR "\[\]string literal escapes to heap" |
| } |