mirror of
https://github.com/golang/go
synced 2024-11-11 19:01:37 -07:00
45 lines
1.0 KiB
Go
45 lines
1.0 KiB
Go
|
// errorcheck -0 -m -l
|
||
|
|
||
|
// 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]) // ERROR "&f\(x\[:\]\)\[0\] escapes to heap$" "x escapes to heap$"
|
||
|
}
|
||
|
|
||
|
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) // ERROR "walk &n.left does not escape"
|
||
|
wr := walk(&n.right) // ERROR "walk &n.right does not escape"
|
||
|
if wl < wr {
|
||
|
n.left, n.right = n.right, n.left
|
||
|
wl, wr = wr, wl
|
||
|
}
|
||
|
*np = n
|
||
|
return w + wl + wr
|
||
|
}
|