1 // errorcheck -0 -N -m -l
3 // Copyright 2010 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.
7 // Test, using compiler diagnostic flags, that the escape analysis is working.
8 // Compiles but does not run. Inlining is disabled.
9 // Registerization is disabled too (-N), which should
10 // have no effect on escape analysis.
21 func foo1(x int) { // ERROR "moved to heap: x"
22 gxx = &x // ERROR "&x escapes to heap"
25 func foo2(yy *int) { // ERROR "leaking param: yy"
29 func foo3(x int) *int { // ERROR "moved to heap: x"
30 return &x // ERROR "&x escapes to heap"
35 func foo3b(t T) { // ERROR "leaking param: t"
39 // xx isn't going anywhere, so use of yy is ok
40 func foo4(xx, yy *int) { // ERROR "xx does not escape" "yy does not escape"
44 // xx isn't going anywhere, so taking address of yy is ok
45 func foo5(xx **int, yy *int) { // ERROR "xx does not escape" "yy does not escape"
46 xx = &yy // ERROR "&yy does not escape"
49 func foo6(xx **int, yy *int) { // ERROR "xx does not escape" "leaking param: yy"
53 func foo7(xx **int, yy *int) { // ERROR "xx does not escape" "yy does not escape"
57 func foo8(xx, yy *int) int { // ERROR "xx does not escape" "yy does not escape"
62 func foo9(xx, yy *int) *int { // ERROR "leaking param: xx" "leaking param: yy"
67 func foo10(xx, yy *int) { // ERROR "xx does not escape" "yy does not escape"
73 xx := &x // ERROR "&x does not escape"
74 yy := &y // ERROR "&y does not escape"
81 func foo12(yyy **int) { // ERROR "leaking param: yyy"
85 // Must treat yyy as leaking because *yyy leaks, and the escape analysis
86 // summaries in exported metadata do not distinguish these two cases.
87 func foo13(yyy **int) { // ERROR "leaking param: yyy"
91 func foo14(yyy **int) { // ERROR "yyy does not escape"
95 func foo15(yy *int) { // ERROR "moved to heap: yy"
96 xxx = &yy // ERROR "&yy escapes to heap"
99 func foo16(yy *int) { // ERROR "leaking param: yy"
103 func foo17(yy *int) { // ERROR "yy does not escape"
107 func foo18(y int) { // ERROR "moved to heap: "y"
108 *xxx = &y // ERROR "&y escapes to heap"
121 return &Bar{42, nil} // ERROR "&Bar literal escapes to heap"
124 func NewBarp(x *int) *Bar { // ERROR "leaking param: x"
125 return &Bar{42, x} // ERROR "&Bar literal escapes to heap"
128 func NewBarp2(x *int) *Bar { // ERROR "x does not escape"
129 return &Bar{*x, nil} // ERROR "&Bar literal escapes to heap"
132 func (b *Bar) NoLeak() int { // ERROR "b does not escape"
136 func (b *Bar) Leak() *int { // ERROR "leaking param: b"
137 return &b.i // ERROR "&b.i escapes to heap"
140 func (b *Bar) AlsoNoLeak() *int { // ERROR "leaking param b content to result ~r0"
144 func (b Bar) AlsoLeak() *int { // ERROR "leaking param: b"
148 func (b Bar) LeaksToo() *int { // ERROR "leaking param: b"
149 v := 0 // ERROR "moved to heap: v"
150 b.ii = &v // ERROR "&v escapes"
154 func (b *Bar) LeaksABit() *int { // ERROR "leaking param b content to result ~r0"
155 v := 0 // ERROR "moved to heap: v"
156 b.ii = &v // ERROR "&v escapes"
160 func (b Bar) StillNoLeak() int { // ERROR "b does not escape"
162 b.ii = &v // ERROR "&v does not escape"
166 func goLeak(b *Bar) { // ERROR "leaking param: b"
175 func NewBar2() *Bar2 {
176 return &Bar2{[12]int{42}, nil} // ERROR "&Bar2 literal escapes to heap"
179 func (b *Bar2) NoLeak() int { // ERROR "b does not escape"
183 func (b *Bar2) Leak() []int { // ERROR "leaking param: b"
184 return b.i[:] // ERROR "b.i escapes to heap"
187 func (b *Bar2) AlsoNoLeak() []int { // ERROR "leaking param b content to result ~r0"
191 func (b Bar2) AgainNoLeak() [12]int { // ERROR "b does not escape"
195 func (b *Bar2) LeakSelf() { // ERROR "leaking param: b"
196 b.ii = b.i[0:4] // ERROR "b.i escapes to heap"
199 func (b *Bar2) LeakSelf2() { // ERROR "leaking param: b"
201 buf = b.i[0:] // ERROR "b.i escapes to heap"
205 func foo21() func() int {
207 return func() int { // ERROR "func literal escapes to heap"
212 func foo21a() func() int {
213 x := 42 // ERROR "moved to heap: x"
214 return func() int { // ERROR "func literal escapes to heap"
215 x++ // ERROR "&x escapes to heap"
222 return func() int { // ERROR "func literal does not escape"
227 func foo23(x int) func() int {
228 return func() int { // ERROR "func literal escapes to heap"
233 func foo23a(x int) func() int {
234 f := func() int { // ERROR "func literal escapes to heap"
240 func foo23b(x int) *(func() int) {
241 f := func() int { return x } // ERROR "moved to heap: f" "func literal escapes to heap"
242 return &f // ERROR "&f escapes to heap"
245 func foo23c(x int) func() int { // ERROR "moved to heap: x"
246 return func() int { // ERROR "func literal escapes to heap"
247 x++ // ERROR "&x escapes to heap"
252 func foo24(x int) int {
253 return func() int { // ERROR "func literal does not escape"
260 func fooleak(xx *int) int { // ERROR "leaking param: xx"
265 func foonoleak(xx *int) int { // ERROR "xx does not escape"
269 func foo31(x int) int { // ERROR "moved to heap: x"
270 return fooleak(&x) // ERROR "&x escapes to heap"
273 func foo32(x int) int {
274 return foonoleak(&x) // ERROR "&x does not escape"
285 func (f *Foo) fooleak() { // ERROR "leaking param: f"
289 func (f *Foo) foonoleak() { // ERROR "f does not escape"
293 func (f *Foo) Leak() { // ERROR "leaking param: f"
297 func (f *Foo) NoLeak() { // ERROR "f does not escape"
301 func foo41(x int) { // ERROR "moved to heap: x"
302 F.xx = &x // ERROR "&x escapes to heap"
305 func (f *Foo) foo42(x int) { // ERROR "f does not escape" "moved to heap: x"
306 f.xx = &x // ERROR "&x escapes to heap"
309 func foo43(f *Foo, x int) { // ERROR "f does not escape" "moved to heap: x"
310 f.xx = &x // ERROR "&x escapes to heap"
313 func foo44(yy *int) { // ERROR "leaking param: yy"
317 func (f *Foo) foo45() { // ERROR "f does not escape"
321 // See foo13 above for explanation of why f leaks.
322 func (f *Foo) foo46() { // ERROR "leaking param: f"
326 func (f *Foo) foo47() { // ERROR "leaking param: f"
327 f.xx = &f.x // ERROR "&f.x escapes to heap"
332 func foo50(i *int) { // ERROR "leaking param: i"
336 var ptrMap map[*int]*int
338 func foo51(i *int) { // ERROR "leaking param: i"
342 func indaddr1(x int) *int { // ERROR "moved to heap: x"
343 return &x // ERROR "&x escapes to heap"
346 func indaddr2(x *int) *int { // ERROR "leaking param: x"
347 return *&x // ERROR "&x does not escape"
350 func indaddr3(x *int32) *int { // ERROR "leaking param: x"
351 return *(**int)(unsafe.Pointer(&x)) // ERROR "&x does not escape"
354 // From package math:
356 func Float32bits(f float32) uint32 {
357 return *(*uint32)(unsafe.Pointer(&f)) // ERROR "&f does not escape"
360 func Float32frombits(b uint32) float32 {
361 return *(*float32)(unsafe.Pointer(&b)) // ERROR "&b does not escape"
364 func Float64bits(f float64) uint64 {
365 return *(*uint64)(unsafe.Pointer(&f)) // ERROR "&f does not escape"
368 func Float64frombits(b uint64) float64 {
369 return *(*float64)(unsafe.Pointer(&b)) // ERROR "&b does not escape"
373 func float64bitsptr(f float64) *uint64 { // ERROR "moved to heap: f"
374 return (*uint64)(unsafe.Pointer(&f)) // ERROR "&f escapes to heap"
377 func float64ptrbitsptr(f *float64) *uint64 { // ERROR "leaking param: f"
378 return (*uint64)(unsafe.Pointer(f))
381 func typesw(i interface{}) *int { // ERROR "leaking param: i"
382 switch val := i.(type) {
386 v := int(*val) // ERROR "moved to heap: v"
387 return &v // ERROR "&v escapes to heap"
392 func exprsw(i *int) *int { // ERROR "leaking param: i"
393 switch j := i; *j + 110 {
403 // assigning to an array element is like assigning to the array
404 func foo60(i *int) *int { // ERROR "leaking param: i"
410 func foo60a(i *int) *int { // ERROR "i does not escape"
416 // assigning to a struct field is like assigning to the struct
417 func foo61(i *int) *int { // ERROR "leaking param: i"
426 func foo61a(i *int) *int { // ERROR "i does not escape"
435 // assigning to a struct field is like assigning to the struct but
436 // here this subtlety is lost, since s.a counts as an assignment to a
437 // track-losing dereference.
438 func foo62(i *int) *int { // ERROR "leaking param: i"
442 s := new(S) // ERROR "new[(]S[)] does not escape"
451 func foo63(m M) { // ERROR "m does not escape"
454 func foo64(m M) { // ERROR "leaking param: m"
458 func foo64b(m M) { // ERROR "leaking param: m"
468 foo63(&mv) // ERROR "&mv does not escape"
472 var mv MV // ERROR "moved to heap: mv"
473 foo64(&mv) // ERROR "&mv escapes to heap"
483 foo64(mv) // escapes but it's an int so irrelevant
486 func foo69(m M) { // ERROR "leaking param: m"
490 func foo70(mv1 *MV, m M) { // ERROR "leaking param: mv1" "leaking param: m"
495 func foo71(x *int) []*int { // ERROR "leaking param: x"
501 func foo71a(x int) []*int { // ERROR "moved to heap: x"
503 y = append(y, &x) // ERROR "&x escapes to heap"
510 y[0] = &x // ERROR "&x does not escape"
513 func foo72aa() [10]*int {
514 var x int // ERROR "moved to heap: x"
516 y[0] = &x // ERROR "&x escapes to heap"
522 for i := 0; i < 10; i++ {
524 x := i // ERROR "moved to heap: x"
525 y[i] = &x // ERROR "&x escapes to heap"
530 func foo72b() [10]*int {
532 for i := 0; i < 10; i++ {
533 x := i // ERROR "moved to heap: x"
534 y[i] = &x // ERROR "&x escapes to heap"
541 s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape"
542 for _, v := range s {
544 // actually just escapes its scope
545 defer func() { // ERROR "func literal escapes to heap"
552 s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape"
553 for _, v := range s {
554 vv := v // ERROR "moved to heap: vv"
555 // actually just escapes its scope
556 defer func() { // ERROR "func literal escapes to heap"
557 vv = 42 // ERROR "&vv escapes to heap"
564 s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape"
565 for _, v := range s {
567 // actually just escapes its scope
568 fn := func() { // ERROR "func literal escapes to heap"
576 s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape"
577 for _, v := range s {
578 vv := v // ERROR "moved to heap: vv"
579 // actually just escapes its scope
580 fn := func() { // ERROR "func literal escapes to heap"
581 vv += 1 // ERROR "&vv escapes to heap"
591 s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape"
592 for i, v := range s {
594 // actually just escapes its scope
595 array[i] = func() { // ERROR "func literal escapes to heap"
603 s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape"
604 for i, v := range s {
605 vv := v // ERROR "moved to heap: vv"
606 // actually just escapes its scope
607 array[i] = func() { // ERROR "func literal escapes to heap"
608 println(&vv) // ERROR "&vv escapes to heap" "&vv does not escape"
613 func myprint(y *int, x ...interface{}) *int { // ERROR "x does not escape" "leaking param: y to result ~r2"
617 func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "y does not escape" "leaking param: x to result ~r2"
618 return &x[0] // ERROR "&x.0. escapes to heap"
621 func foo75(z *int) { // ERROR "z does not escape"
622 myprint(z, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
625 func foo75a(z *int) { // ERROR "z does not escape"
626 myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
629 func foo75esc(z *int) { // ERROR "leaking param: z"
630 gxx = myprint(z, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
633 func foo75aesc(z *int) { // ERROR "z does not escape"
634 var ppi **interface{} // assignments to pointer dereferences lose track
635 *ppi = myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
638 func foo75aesc1(z *int) { // ERROR "z does not escape"
639 sink = myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
642 // BAD: z does not escape here
643 func foo76(z *int) { // ERROR "leaking param: z"
644 myprint(nil, z) // ERROR "[.][.][.] argument does not escape"
647 // BAD: z does not escape here
648 func foo76a(z *int) { // ERROR "leaking param: z"
649 myprint1(nil, z) // ERROR "[.][.][.] argument does not escape"
653 myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
657 myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
661 defer myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
665 defer myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
670 // TODO: This one really only escapes its scope, but we don't distinguish yet.
671 defer myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
677 defer myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
681 func foo77(z []interface{}) { // ERROR "z does not escape"
682 myprint(nil, z...) // z does not escape
685 func foo77a(z []interface{}) { // ERROR "z does not escape"
689 func foo77b(z []interface{}) { // ERROR "leaking param: z"
690 var ppi **interface{}
691 *ppi = myprint1(nil, z...)
694 func foo77c(z []interface{}) { // ERROR "leaking param: z"
695 sink = myprint1(nil, z...)
699 // BAD: i should not escape here
700 i := 0 // ERROR "moved to heap: i"
701 myprint(nil, &i) // ERROR "&i escapes to heap" "\.\.\. argument does not escape"
703 // BAD: j should not escape here
704 j := 0 // ERROR "moved to heap: j"
705 myprint1(nil, &j) // ERROR "&j escapes to heap" "\.\.\. argument does not escape"
708 func foo78(z int) *int { // ERROR "moved to heap: z"
709 return &z // ERROR "&z escapes to heap"
712 func foo78a(z int) *int { // ERROR "moved to heap: z"
713 y := &z // ERROR "&z escapes to heap"
714 x := &y // ERROR "&y does not escape"
715 return *x // really return y
719 return new(int) // ERROR "new[(]int[)] escapes to heap"
725 // Really just escapes its scope but we don't distinguish
726 z = new(int) // ERROR "new[(]int[)] escapes to heap"
734 z := new(int) // ERROR "new[(]int[)] does not escape"
740 func tee(p *int) (x, y *int) { return p, p } // ERROR "leaking param"
742 func noop(x, y *int) {} // ERROR "does not escape"
745 var x, y, z int // ERROR "moved to heap"
746 go noop(tee(&z)) // ERROR "&z escapes to heap"
747 go noop(&x, &y) // ERROR "escapes to heap"
749 var u, v, w int // ERROR "moved to heap"
750 defer noop(tee(&u)) // ERROR "&u escapes to heap"
751 defer noop(&v, &w) // ERROR "escapes to heap"
755 type Fooer interface {
759 type LimitedFooer struct {
764 func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r"
765 return &LimitedFooer{r, n} // ERROR "&LimitedFooer literal escapes to heap"
768 func foo90(x *int) map[*int]*int { // ERROR "leaking param: x"
769 return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap"
772 func foo91(x *int) map[*int]*int { // ERROR "leaking param: x"
773 return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap"
776 func foo92(x *int) [2]*int { // ERROR "leaking param: x"
777 return [2]*int{x, nil}
781 func foo93(c chan *int) *int { // ERROR "c does not escape"
789 func foo94(m map[*int]*int, b bool) *int { // ERROR "m does not escape"
790 for k, v := range m {
800 func foo95(m map[*int]*int, x *int) { // ERROR "m does not escape" "leaking param: x"
805 func foo96(m []*int) *int { // ERROR "m does not escape"
810 func foo97(m [1]*int) *int { // ERROR "leaking param: m"
815 func foo98(m map[int]*int) *int { // ERROR "m does not escape"
820 func foo99(m *[1]*int) []*int { // ERROR "leaking param: m"
825 func foo100(m []*int) *int { // ERROR "m does not escape"
826 for _, v := range m {
833 func foo101(m [1]*int) *int { // ERROR "leaking param: m"
834 for _, v := range m {
841 func foo101a(m [1]*int) *int { // ERROR "m does not escape"
842 for i := range m { // ERROR "moved to heap: i"
843 return &i // ERROR "&i escapes to heap"
849 func foo102(m []*int, x *int) { // ERROR "m does not escape" "leaking param: x"
854 func foo103(m [1]*int, x *int) { // ERROR "m does not escape" "x does not escape"
861 func foo104(x []*int) { // ERROR "x does not escape"
866 func foo105(x []*int) { // ERROR "x does not escape"
871 func foo106(x *int) { // ERROR "leaking param: x"
875 func foo107(x *int) map[*int]*int { // ERROR "leaking param: x"
876 return map[*int]*int{x: nil} // ERROR "map.* literal escapes to heap"
879 func foo108(x *int) map[*int]*int { // ERROR "leaking param: x"
880 return map[*int]*int{nil: x} // ERROR "map.* literal escapes to heap"
883 func foo109(x *int) *int { // ERROR "leaking param: x"
884 m := map[*int]*int{x: nil} // ERROR "map.* literal does not escape"
885 for k, _ := range m {
891 func foo110(x *int) *int { // ERROR "leaking param: x"
892 m := map[*int]*int{nil: x} // ERROR "map.* literal does not escape"
896 func foo111(x *int) *int { // ERROR "leaking param: x"
897 m := []*int{x} // ERROR "\[\]\*int literal does not escape"
901 func foo112(x *int) *int { // ERROR "leaking param: x"
906 func foo113(x *int) *int { // ERROR "leaking param: x"
911 func foo114(x *int) *int { // ERROR "leaking param: x"
912 m := &Bar{ii: x} // ERROR "&Bar literal does not escape"
916 func foo115(x *int) *int { // ERROR "leaking param: x"
917 return (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(x)) + 1))
920 func foo116(b bool) *int {
922 x := 1 // ERROR "moved to heap: x"
923 return &x // ERROR "&x escapes to heap"
925 y := 1 // ERROR "moved to heap: y"
926 return &y // ERROR "&y escapes to heap"
931 func foo117(unknown func(interface{})) { // ERROR "unknown does not escape"
932 x := 1 // ERROR "moved to heap: x"
933 unknown(&x) // ERROR "&x escapes to heap"
936 func foo118(unknown func(*int)) { // ERROR "unknown does not escape"
937 x := 1 // ERROR "moved to heap: x"
938 unknown(&x) // ERROR "&x escapes to heap"
943 func foo119(x *int) { // ERROR "leaking param: x"
948 // formerly exponential time analysis
1049 // use the labels to silence compiler errors
1153 for i := 0; i < 10; i++ {
1154 defer myprint(nil, i) // ERROR "[.][.][.] argument escapes to heap"
1155 go myprint(nil, i) // ERROR "[.][.][.] argument escapes to heap"
1159 // same as foo121 but check across import
1161 for i := 0; i < 10; i++ {
1162 defer fmt.Printf("%d", i) // ERROR "[.][.][.] argument escapes to heap"
1163 go fmt.Printf("%d", i) // ERROR "[.][.][.] argument escapes to heap"
1167 // a harmless forward jump
1173 i = new(int) // ERROR "new.int. does not escape"
1177 // a backward jump, increases loopdepth
1182 i = new(int) // ERROR "new.int. escapes to heap"
1188 func foo124(x **int) { // ERROR "x does not escape"
1189 var i int // ERROR "moved to heap: i"
1190 p := &i // ERROR "&i escapes"
1191 func() { // ERROR "func literal does not escape"
1192 *x = p // ERROR "leaking closure reference p"
1196 func foo125(ch chan *int) { // ERROR "does not escape"
1197 var i int // ERROR "moved to heap"
1198 p := &i // ERROR "&i escapes to heap"
1199 func() { // ERROR "func literal does not escape"
1200 ch <- p // ERROR "leaking closure reference p"
1205 var px *int // loopdepth 0
1208 var i int // ERROR "moved to heap"
1209 func() { // ERROR "func literal does not escape"
1210 px = &i // ERROR "&i escapes"
1219 var i int // ERROR "moved to heap: i"
1220 p := &i // ERROR "&i escapes to heap"
1227 p := &i // ERROR "&i does not escape"
1233 var i int // ERROR "moved to heap: i"
1234 p := &i // ERROR "&i escapes to heap"
1235 func() { // ERROR "func literal does not escape"
1236 q := p // ERROR "leaking closure reference p"
1237 func() { // ERROR "func literal does not escape"
1238 r := q // ERROR "leaking closure reference q"
1246 var i int // ERROR "moved to heap"
1247 func() { // ERROR "func literal does not escape"
1248 px = &i // ERROR "&i escapes" "leaking closure reference i"
1254 var i int // ERROR "moved to heap"
1255 func() { // ERROR "func literal does not escape"
1256 px = &i // ERROR "&i escapes" "leaking closure reference i"
1261 var i int // ERROR "moved to heap"
1262 go func() { // ERROR "func literal escapes to heap"
1263 px = &i // ERROR "&i escapes" "leaking closure reference i"
1268 var i int // ERROR "moved to heap"
1269 defer func() { // ERROR "func literal does not escape"
1270 px = &i // ERROR "&i escapes" "leaking closure reference i"
1276 p := &i // ERROR "&i does not escape"
1277 func() { // ERROR "func literal does not escape"
1279 func() { // ERROR "func literal does not escape"
1287 var i int // ERROR "moved to heap: i"
1288 p := &i // ERROR "&i escapes to heap"
1289 go func() { // ERROR "func literal escapes to heap"
1291 func() { // ERROR "func literal does not escape"
1299 var i int // ERROR "moved to heap: i"
1300 p := &i // ERROR "&i escapes to heap"
1301 go func() { // ERROR "func literal escapes to heap"
1302 q := p // ERROR "leaking closure reference p"
1303 func() { // ERROR "func literal does not escape"
1304 r := q // ERROR "leaking closure reference q"
1311 var i int // ERROR "moved to heap: i"
1312 p := &i // ERROR "&i escapes to heap"
1313 func() { // ERROR "func literal does not escape"
1314 q := p // ERROR "leaking closure reference p"
1315 go func() { // ERROR "func literal escapes to heap"
1322 func foo138() *byte {
1326 t := new(T) // ERROR "new.T. escapes to heap"
1327 return &t.x[0] // ERROR "&t.x.0. escapes to heap"
1330 func foo139() *byte {
1336 t := new(T) // ERROR "new.T. escapes to heap"
1337 return &t.x.y // ERROR "&t.x.y escapes to heap"
1341 func foo140() interface{} {
1349 t := &T{} // ERROR "&T literal escapes to heap"
1364 func F3(x []byte) // ERROR "F3 x does not escape"
1370 F1(buf1[:]) // ERROR "buf1 does not escape"
1372 var buf2 [10]byte // ERROR "moved to heap: buf2"
1373 F2(buf2[:]) // ERROR "buf2 escapes to heap"
1376 F3(buf3[:]) // ERROR "buf3 does not escape"
1378 var buf4 [10]byte // ERROR "moved to heap: buf4"
1379 F4(buf4[:]) // ERROR "buf4 escapes to heap"
1386 func (t *Tm) M() { // ERROR "t does not escape"
1392 t := new(Tm) // ERROR "escapes to heap"
1393 f = t.M // ERROR "t.M does not escape"
1400 t := new(Tm) // ERROR "escapes to heap"
1401 gf = t.M // ERROR "t.M escapes to heap"
1406 for i := 0; i < 1000; i++ {
1407 func() { // ERROR "func literal does not escape"
1408 for i := 0; i < 1; i++ {
1410 t.M() // ERROR "t does not escape"
1417 // Check that annotations take effect regardless of whether they
1418 // are before or after the use in the source code.
1426 foo144a(&x) // ERROR "&x does not escape"
1428 foo144b(&y) // ERROR "&y does not escape"
1435 // issue 7313: for loop init should not be treated as "in loop"
1441 func foo145(l List) { // ERROR "l does not escape"
1443 for p = &l; p.Next != nil; p = p.Next { // ERROR "&l does not escape"
1447 func foo146(l List) { // ERROR "l does not escape"
1449 p = &l // ERROR "&l does not escape"
1450 for ; p.Next != nil; p = p.Next {
1454 func foo147(l List) { // ERROR "l does not escape"
1456 p = &l // ERROR "&l does not escape"
1462 func foo148(l List) { // ERROR " l does not escape"
1463 for p := &l; p.Next != nil; p = p.Next { // ERROR "&l does not escape"
1467 // related: address of variable should have depth of variable, not of loop
1469 func foo149(l List) { // ERROR " l does not escape"
1472 for p = &l; p.Next != nil; p = p.Next { // ERROR "&l does not escape"
1477 // issue 7934: missed ... if element type had no pointers
1481 func foo150(x ...byte) { // ERROR "leaking param: x"
1486 foo150(1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
1489 // issue 7931: bad handling of slice of array
1493 func foo151(x *int) { // ERROR "leaking param: x"
1498 var a [64]int // ERROR "moved to heap: a"
1500 foo151(&(&a)[4:8][0]) // ERROR "&\(&a\)\[4:8\]\[0\] escapes to heap" "&a escapes to heap"
1504 var a [10]int // ERROR "moved to heap: a"
1505 b := a[:] // ERROR "a escapes to heap"
1506 foo151(&b[4:8][0]) // ERROR "&b\[4:8\]\[0\] escapes to heap"
1510 var a [64]int // ERROR "moved to heap: a"
1512 foo151(&(&a)[4:8:8][0]) // ERROR "&\(&a\)\[4:8:8\]\[0\] escapes to heap" "&a escapes to heap"
1516 var a [10]int // ERROR "moved to heap: a"
1517 b := a[:] // ERROR "a escapes to heap"
1518 foo151(&b[4:8:8][0]) // ERROR "&b\[4:8:8\]\[0\] escapes to heap"
1527 func (u *U) String() *string { // ERROR "leaking param u content to result ~r0"
1535 func NewV(u U) *V { // ERROR "leaking param: u"
1536 return &V{u.String()} // ERROR "&V literal escapes to heap" "u does not escape"
1540 a := "a" // ERROR "moved to heap: a"
1541 u := U{&a} // ERROR "&a escapes to heap"
1546 // issue 8176 - &x in type switch body not marked as escaping
1548 func foo153(v interface{}) *int { // ERROR "leaking param: v"
1549 switch x := v.(type) {
1550 case int: // ERROR "moved to heap: x"
1551 return &x // ERROR "&x escapes to heap"
1556 // issue 8185 - &result escaping into result
1558 func f() (x int, y *int) { // ERROR "moved to heap: x"
1559 y = &x // ERROR "&x escapes to heap"
1563 func g() (x interface{}) { // ERROR "moved to heap: x"
1564 x = &x // ERROR "&x escapes to heap"
1568 var sink interface{}
1574 func ptrlitNoescape() {
1575 // Both literal and element do not escape.
1577 x := &Lit{&i} // ERROR "&Lit literal does not escape" "&i does not escape"
1581 func ptrlitNoEscape2() {
1582 // Literal does not escape, but element does.
1583 i := 0 // ERROR "moved to heap: i"
1584 x := &Lit{&i} // ERROR "&Lit literal does not escape" "&i escapes to heap"
1588 func ptrlitEscape() {
1589 // Both literal and element escape.
1590 i := 0 // ERROR "moved to heap: i"
1591 x := &Lit{&i} // ERROR "&Lit literal escapes to heap" "&i escapes to heap"
1597 type Buffer struct {
1605 func (b *Buffer) foo() { // ERROR "b does not escape"
1606 b.buf1 = b.buf1[1:2] // ERROR "ignoring self-assignment to b.buf1"
1607 b.buf1 = b.buf1[1:2:3] // ERROR "ignoring self-assignment to b.buf1"
1608 b.buf1 = b.buf2[1:2] // ERROR "ignoring self-assignment to b.buf1"
1609 b.buf1 = b.buf2[1:2:3] // ERROR "ignoring self-assignment to b.buf1"
1612 func (b *Buffer) bar() { // ERROR "leaking param: b"
1613 b.buf1 = b.arr[1:2] // ERROR "b.arr escapes to heap"
1616 func (b *Buffer) baz() { // ERROR "b does not escape"
1617 b.str1 = b.str1[1:2] // ERROR "ignoring self-assignment to b.str1"
1618 b.str1 = b.str2[1:2] // ERROR "ignoring self-assignment to b.str1"
1621 func (b *Buffer) bat() { // ERROR "leaking param: b"
1622 o := new(Buffer) // ERROR "new\(Buffer\) escapes to heap"
1623 o.buf1 = b.buf1[1:2]
1627 func quux(sp *string, bp *[]byte) { // ERROR "sp does not escape" "bp does not escape"
1628 *sp = (*sp)[1:2] // ERROR "quux ignoring self-assignment to \*sp"
1629 *bp = (*bp)[1:2] // ERROR "quux ignoring self-assignment to \*bp"
1632 type StructWithString struct {
1637 // This is escape analysis false negative.
1638 // We assign the pointer to x.p but leak x.s. Escape analysis coarsens flows
1639 // to just x, and thus &i looks escaping.
1640 func fieldFlowTracking() {
1641 var x StructWithString
1642 i := 0 // ERROR "moved to heap: i"
1643 x.p = &i // ERROR "&i escapes to heap"
1647 // String operations.
1649 func slicebytetostring0() {
1650 b := make([]byte, 20) // ERROR "does not escape"
1651 s := string(b) // ERROR "string\(b\) does not escape"
1655 func slicebytetostring1() {
1656 b := make([]byte, 20) // ERROR "does not escape"
1657 s := string(b) // ERROR "string\(b\) does not escape"
1662 func slicebytetostring2() {
1663 b := make([]byte, 20) // ERROR "does not escape"
1664 s := string(b) // ERROR "string\(b\) escapes to heap"
1665 s1 := s[0:1] // ERROR "moved to heap: s1"
1666 sink = &s1 // ERROR "&s1 escapes to heap"
1669 func slicebytetostring3() {
1670 b := make([]byte, 20) // ERROR "does not escape"
1671 s := string(b) // ERROR "string\(b\) escapes to heap"
1679 s := s0 + s1 // ERROR "s0 \+ s1 does not escape"
1687 s += s0 + s1 // ERROR "s0 \+ s1 does not escape"
1692 b := make([]byte, 20) // ERROR "does not escape"
1694 s := string(b) + s0 // ERROR "string\(b\) does not escape" "string\(b\) \+ s0 does not escape"
1701 s := s0 + s1 // ERROR "s0 \+ s1 escapes to heap"
1706 func intstring0() bool {
1707 // string does not escape
1709 s := string(x) // ERROR "string\(x\) does not escape"
1713 func intstring1() string {
1714 // string does not escape, but the buffer does
1716 s := string(x) // ERROR "string\(x\) escapes to heap"
1721 // string escapes to heap
1723 s := string(x) // ERROR "string\(x\) escapes to heap" "moved to heap: s"
1724 sink = &s // ERROR "&s escapes to heap"
1727 func stringtoslicebyte0() {
1729 x := []byte(s) // ERROR "\(\[\]byte\)\(s\) does not escape"
1733 func stringtoslicebyte1() []byte {
1735 return []byte(s) // ERROR "\(\[\]byte\)\(s\) escapes to heap"
1738 func stringtoslicebyte2() {
1740 sink = []byte(s) // ERROR "\(\[\]byte\)\(s\) escapes to heap"
1743 func stringtoslicerune0() {
1745 x := []rune(s) // ERROR "\(\[\]rune\)\(s\) does not escape"
1749 func stringtoslicerune1() []rune {
1751 return []rune(s) // ERROR "\(\[\]rune\)\(s\) escapes to heap"
1754 func stringtoslicerune2() {
1756 sink = []rune(s) // ERROR "\(\[\]rune\)\(s\) escapes to heap"
1759 func slicerunetostring0() {
1760 r := []rune{1, 2, 3} // ERROR "\[\]rune literal does not escape"
1761 s := string(r) // ERROR "string\(r\) does not escape"
1765 func slicerunetostring1() string {
1766 r := []rune{1, 2, 3} // ERROR "\[\]rune literal does not escape"
1767 return string(r) // ERROR "string\(r\) escapes to heap"
1770 func slicerunetostring2() {
1771 r := []rune{1, 2, 3} // ERROR "\[\]rune literal does not escape"
1772 sink = string(r) // ERROR "string\(r\) escapes to heap"
1776 m := make(map[int]int) // ERROR "make\(map\[int\]int\) does not escape"
1783 func makemap1() map[int]int {
1784 return make(map[int]int) // ERROR "make\(map\[int\]int\) escapes to heap"
1788 m := make(map[int]int) // ERROR "make\(map\[int\]int\) escapes to heap"