github.com/razvanm/vanadium-go-1.3@v0.0.0-20160721203343-4a65068e5915/test/escape2.go (about) 1 // errorcheck -0 -m -l 2 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. 6 7 // Test, using compiler diagnostic flags, that the escape analysis is working. 8 // Compiles but does not run. Inlining is disabled. 9 10 // escape2n.go contains all the same tests but compiles with -N. 11 12 package foo 13 14 import ( 15 "fmt" 16 "unsafe" 17 ) 18 19 var gxx *int 20 21 func foo1(x int) { // ERROR "moved to heap: x" 22 gxx = &x // ERROR "&x escapes to heap" 23 } 24 25 func foo2(yy *int) { // ERROR "leaking param: yy" 26 gxx = yy 27 } 28 29 func foo3(x int) *int { // ERROR "moved to heap: x" 30 return &x // ERROR "&x escapes to heap" 31 } 32 33 type T *T 34 35 func foo3b(t T) { // ERROR "leaking param: t" 36 *t = t 37 } 38 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" 41 xx = yy 42 } 43 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" 47 } 48 49 func foo6(xx **int, yy *int) { // ERROR "xx does not escape" "leaking param: yy" 50 *xx = yy 51 } 52 53 func foo7(xx **int, yy *int) { // ERROR "xx does not escape" "yy does not escape" 54 **xx = *yy 55 } 56 57 func foo8(xx, yy *int) int { // ERROR "xx does not escape" "yy does not escape" 58 xx = yy 59 return *xx 60 } 61 62 func foo9(xx, yy *int) *int { // ERROR "leaking param: xx" "leaking param: yy" 63 xx = yy 64 return xx 65 } 66 67 func foo10(xx, yy *int) { // ERROR "xx does not escape" "yy does not escape" 68 *xx = *yy 69 } 70 71 func foo11() int { 72 x, y := 0, 42 73 xx := &x // ERROR "&x does not escape" 74 yy := &y // ERROR "&y does not escape" 75 *xx = *yy 76 return x 77 } 78 79 var xxx **int 80 81 func foo12(yyy **int) { // ERROR "leaking param: yyy" 82 xxx = yyy 83 } 84 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" 88 *xxx = *yyy 89 } 90 91 func foo14(yyy **int) { // ERROR "yyy does not escape" 92 **xxx = **yyy 93 } 94 95 func foo15(yy *int) { // ERROR "moved to heap: yy" 96 xxx = &yy // ERROR "&yy escapes to heap" 97 } 98 99 func foo16(yy *int) { // ERROR "leaking param: yy" 100 *xxx = yy 101 } 102 103 func foo17(yy *int) { // ERROR "yy does not escape" 104 **xxx = *yy 105 } 106 107 func foo18(y int) { // ERROR "moved to heap: "y" 108 *xxx = &y // ERROR "&y escapes to heap" 109 } 110 111 func foo19(y int) { 112 **xxx = y 113 } 114 115 type Bar struct { 116 i int 117 ii *int 118 } 119 120 func NewBar() *Bar { 121 return &Bar{42, nil} // ERROR "&Bar literal escapes to heap" 122 } 123 124 func NewBarp(x *int) *Bar { // ERROR "leaking param: x" 125 return &Bar{42, x} // ERROR "&Bar literal escapes to heap" 126 } 127 128 func NewBarp2(x *int) *Bar { // ERROR "x does not escape" 129 return &Bar{*x, nil} // ERROR "&Bar literal escapes to heap" 130 } 131 132 func (b *Bar) NoLeak() int { // ERROR "b does not escape" 133 return *(b.ii) 134 } 135 136 func (b *Bar) Leak() *int { // ERROR "leaking param: b" 137 return &b.i // ERROR "&b.i escapes to heap" 138 } 139 140 func (b *Bar) AlsoNoLeak() *int { // ERROR "leaking param b content to result ~r0" 141 return b.ii 142 } 143 144 func (b Bar) AlsoLeak() *int { // ERROR "leaking param: b" 145 return b.ii 146 } 147 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" 151 return b.ii 152 } 153 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" 157 return b.ii 158 } 159 160 func (b Bar) StillNoLeak() int { // ERROR "b does not escape" 161 v := 0 162 b.ii = &v // ERROR "&v does not escape" 163 return b.i 164 } 165 166 func goLeak(b *Bar) { // ERROR "leaking param: b" 167 go b.NoLeak() 168 } 169 170 type Bar2 struct { 171 i [12]int 172 ii []int 173 } 174 175 func NewBar2() *Bar2 { 176 return &Bar2{[12]int{42}, nil} // ERROR "&Bar2 literal escapes to heap" 177 } 178 179 func (b *Bar2) NoLeak() int { // ERROR "b does not escape" 180 return b.i[0] 181 } 182 183 func (b *Bar2) Leak() []int { // ERROR "leaking param: b" 184 return b.i[:] // ERROR "b.i escapes to heap" 185 } 186 187 func (b *Bar2) AlsoNoLeak() []int { // ERROR "leaking param b content to result ~r0" 188 return b.ii[0:1] 189 } 190 191 func (b Bar2) AgainNoLeak() [12]int { // ERROR "b does not escape" 192 return b.i 193 } 194 195 func (b *Bar2) LeakSelf() { // ERROR "leaking param: b" 196 b.ii = b.i[0:4] // ERROR "b.i escapes to heap" 197 } 198 199 func (b *Bar2) LeakSelf2() { // ERROR "leaking param: b" 200 var buf []int 201 buf = b.i[0:] // ERROR "b.i escapes to heap" 202 b.ii = buf 203 } 204 205 func foo21() func() int { 206 x := 42 // ERROR "moved to heap: x" 207 return func() int { // ERROR "func literal escapes to heap" 208 return x // ERROR "&x escapes to heap" 209 } 210 } 211 212 func foo22() int { 213 x := 42 214 return func() int { // ERROR "func literal does not escape" 215 return x 216 }() 217 } 218 219 func foo23(x int) func() int { // ERROR "moved to heap: x" 220 return func() int { // ERROR "func literal escapes to heap" 221 return x // ERROR "&x escapes to heap" 222 } 223 } 224 225 func foo23a(x int) func() int { // ERROR "moved to heap: x" 226 f := func() int { // ERROR "func literal escapes to heap" 227 return x // ERROR "&x escapes to heap" 228 } 229 return f 230 } 231 232 func foo23b(x int) *(func() int) { // ERROR "moved to heap: x" 233 f := func() int { return x } // ERROR "moved to heap: f" "func literal escapes to heap" "&x escapes to heap" 234 return &f // ERROR "&f escapes to heap" 235 } 236 237 func foo24(x int) int { 238 return func() int { // ERROR "func literal does not escape" 239 return x 240 }() 241 } 242 243 var x *int 244 245 func fooleak(xx *int) int { // ERROR "leaking param: xx" 246 x = xx 247 return *x 248 } 249 250 func foonoleak(xx *int) int { // ERROR "xx does not escape" 251 return *x + *xx 252 } 253 254 func foo31(x int) int { // ERROR "moved to heap: x" 255 return fooleak(&x) // ERROR "&x escapes to heap" 256 } 257 258 func foo32(x int) int { 259 return foonoleak(&x) // ERROR "&x does not escape" 260 } 261 262 type Foo struct { 263 xx *int 264 x int 265 } 266 267 var F Foo 268 var pf *Foo 269 270 func (f *Foo) fooleak() { // ERROR "leaking param: f" 271 pf = f 272 } 273 274 func (f *Foo) foonoleak() { // ERROR "f does not escape" 275 F.x = f.x 276 } 277 278 func (f *Foo) Leak() { // ERROR "leaking param: f" 279 f.fooleak() 280 } 281 282 func (f *Foo) NoLeak() { // ERROR "f does not escape" 283 f.foonoleak() 284 } 285 286 func foo41(x int) { // ERROR "moved to heap: x" 287 F.xx = &x // ERROR "&x escapes to heap" 288 } 289 290 func (f *Foo) foo42(x int) { // ERROR "f does not escape" "moved to heap: x" 291 f.xx = &x // ERROR "&x escapes to heap" 292 } 293 294 func foo43(f *Foo, x int) { // ERROR "f does not escape" "moved to heap: x" 295 f.xx = &x // ERROR "&x escapes to heap" 296 } 297 298 func foo44(yy *int) { // ERROR "leaking param: yy" 299 F.xx = yy 300 } 301 302 func (f *Foo) foo45() { // ERROR "f does not escape" 303 F.x = f.x 304 } 305 306 // See foo13 above for explanation of why f leaks. 307 func (f *Foo) foo46() { // ERROR "leaking param: f" 308 F.xx = f.xx 309 } 310 311 func (f *Foo) foo47() { // ERROR "leaking param: f" 312 f.xx = &f.x // ERROR "&f.x escapes to heap" 313 } 314 315 var ptrSlice []*int 316 317 func foo50(i *int) { // ERROR "leaking param: i" 318 ptrSlice[0] = i 319 } 320 321 var ptrMap map[*int]*int 322 323 func foo51(i *int) { // ERROR "leaking param: i" 324 ptrMap[i] = i 325 } 326 327 func indaddr1(x int) *int { // ERROR "moved to heap: x" 328 return &x // ERROR "&x escapes to heap" 329 } 330 331 func indaddr2(x *int) *int { // ERROR "leaking param: x" 332 return *&x // ERROR "&x does not escape" 333 } 334 335 func indaddr3(x *int32) *int { // ERROR "leaking param: x" 336 return *(**int)(unsafe.Pointer(&x)) // ERROR "&x does not escape" 337 } 338 339 // From package math: 340 341 func Float32bits(f float32) uint32 { 342 return *(*uint32)(unsafe.Pointer(&f)) // ERROR "&f does not escape" 343 } 344 345 func Float32frombits(b uint32) float32 { 346 return *(*float32)(unsafe.Pointer(&b)) // ERROR "&b does not escape" 347 } 348 349 func Float64bits(f float64) uint64 { 350 return *(*uint64)(unsafe.Pointer(&f)) // ERROR "&f does not escape" 351 } 352 353 func Float64frombits(b uint64) float64 { 354 return *(*float64)(unsafe.Pointer(&b)) // ERROR "&b does not escape" 355 } 356 357 // contrast with 358 func float64bitsptr(f float64) *uint64 { // ERROR "moved to heap: f" 359 return (*uint64)(unsafe.Pointer(&f)) // ERROR "&f escapes to heap" 360 } 361 362 func float64ptrbitsptr(f *float64) *uint64 { // ERROR "leaking param: f" 363 return (*uint64)(unsafe.Pointer(f)) 364 } 365 366 func typesw(i interface{}) *int { // ERROR "leaking param: i" 367 switch val := i.(type) { 368 case *int: 369 return val 370 case *int8: 371 v := int(*val) // ERROR "moved to heap: v" 372 return &v // ERROR "&v escapes to heap" 373 } 374 return nil 375 } 376 377 func exprsw(i *int) *int { // ERROR "leaking param: i" 378 switch j := i; *j + 110 { 379 case 12: 380 return j 381 case 42: 382 return nil 383 } 384 return nil 385 386 } 387 388 // assigning to an array element is like assigning to the array 389 func foo60(i *int) *int { // ERROR "leaking param: i" 390 var a [12]*int 391 a[0] = i 392 return a[1] 393 } 394 395 func foo60a(i *int) *int { // ERROR "i does not escape" 396 var a [12]*int 397 a[0] = i 398 return nil 399 } 400 401 // assigning to a struct field is like assigning to the struct 402 func foo61(i *int) *int { // ERROR "leaking param: i" 403 type S struct { 404 a, b *int 405 } 406 var s S 407 s.a = i 408 return s.b 409 } 410 411 func foo61a(i *int) *int { // ERROR "i does not escape" 412 type S struct { 413 a, b *int 414 } 415 var s S 416 s.a = i 417 return nil 418 } 419 420 // assigning to a struct field is like assigning to the struct but 421 // here this subtlety is lost, since s.a counts as an assignment to a 422 // track-losing dereference. 423 func foo62(i *int) *int { // ERROR "leaking param: i" 424 type S struct { 425 a, b *int 426 } 427 s := new(S) // ERROR "new[(]S[)] does not escape" 428 s.a = i 429 return nil // s.b 430 } 431 432 type M interface { 433 M() 434 } 435 436 func foo63(m M) { // ERROR "m does not escape" 437 } 438 439 func foo64(m M) { // ERROR "leaking param: m" 440 m.M() 441 } 442 443 func foo64b(m M) { // ERROR "leaking param: m" 444 defer m.M() 445 } 446 447 type MV int 448 449 func (MV) M() {} 450 451 func foo65() { 452 var mv MV 453 foo63(&mv) // ERROR "&mv does not escape" 454 } 455 456 func foo66() { 457 var mv MV // ERROR "moved to heap: mv" 458 foo64(&mv) // ERROR "&mv escapes to heap" 459 } 460 461 func foo67() { 462 var mv MV 463 foo63(mv) 464 } 465 466 func foo68() { 467 var mv MV 468 foo64(mv) // escapes but it's an int so irrelevant 469 } 470 471 func foo69(m M) { // ERROR "leaking param: m" 472 foo64(m) 473 } 474 475 func foo70(mv1 *MV, m M) { // ERROR "leaking param: mv1" "leaking param: m" 476 m = mv1 477 foo64(m) 478 } 479 480 func foo71(x *int) []*int { // ERROR "leaking param: x" 481 var y []*int 482 y = append(y, x) 483 return y 484 } 485 486 func foo71a(x int) []*int { // ERROR "moved to heap: x" 487 var y []*int 488 y = append(y, &x) // ERROR "&x escapes to heap" 489 return y 490 } 491 492 func foo72() { 493 var x int 494 var y [1]*int 495 y[0] = &x // ERROR "&x does not escape" 496 } 497 498 func foo72aa() [10]*int { 499 var x int // ERROR "moved to heap: x" 500 var y [10]*int 501 y[0] = &x // ERROR "&x escapes to heap" 502 return y 503 } 504 505 func foo72a() { 506 var y [10]*int 507 for i := 0; i < 10; i++ { 508 // escapes its scope 509 x := i // ERROR "moved to heap: x" 510 y[i] = &x // ERROR "&x escapes to heap" 511 } 512 return 513 } 514 515 func foo72b() [10]*int { 516 var y [10]*int 517 for i := 0; i < 10; i++ { 518 x := i // ERROR "moved to heap: x" 519 y[i] = &x // ERROR "&x escapes to heap" 520 } 521 return y 522 } 523 524 // issue 2145 525 func foo73() { 526 s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape" 527 for _, v := range s { 528 vv := v // ERROR "moved to heap: vv" 529 // actually just escapes its scope 530 defer func() { // ERROR "func literal escapes to heap" 531 println(vv) // ERROR "&vv escapes to heap" 532 }() 533 } 534 } 535 536 func foo74() { 537 s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape" 538 for _, v := range s { 539 vv := v // ERROR "moved to heap: vv" 540 // actually just escapes its scope 541 fn := func() { // ERROR "func literal escapes to heap" 542 println(vv) // ERROR "&vv escapes to heap" 543 } 544 defer fn() 545 } 546 } 547 548 // issue 3975 549 func foo74b() { 550 var array [3]func() 551 s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape" 552 for i, v := range s { 553 vv := v // ERROR "moved to heap: vv" 554 // actually just escapes its scope 555 array[i] = func() { // ERROR "func literal escapes to heap" 556 println(vv) // ERROR "&vv escapes to heap" 557 } 558 } 559 } 560 561 func myprint(y *int, x ...interface{}) *int { // ERROR "x does not escape" "leaking param: y" 562 return y 563 } 564 565 func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "y does not escape" "leaking param: x" 566 return &x[0] // ERROR "&x.0. escapes to heap" 567 } 568 569 func foo75(z *int) { // ERROR "z does not escape" 570 myprint(z, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" 571 } 572 573 func foo75a(z *int) { // ERROR "z does not escape" 574 myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" 575 } 576 577 func foo75esc(z *int) { // ERROR "leaking param: z" 578 gxx = myprint(z, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" 579 } 580 581 func foo75aesc(z *int) { // ERROR "z does not escape" 582 var ppi **interface{} // assignments to pointer dereferences lose track 583 *ppi = myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" 584 } 585 586 func foo76(z *int) { // ERROR "leaking param: z" 587 myprint(nil, z) // ERROR "[.][.][.] argument does not escape" 588 } 589 590 func foo76a(z *int) { // ERROR "leaking param: z" 591 myprint1(nil, z) // ERROR "[.][.][.] argument does not escape" 592 } 593 594 func foo76b() { 595 myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" 596 } 597 598 func foo76c() { 599 myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" 600 } 601 602 func foo76d() { 603 defer myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" 604 } 605 606 func foo76e() { 607 defer myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" 608 } 609 610 func foo76f() { 611 for { 612 // TODO: This one really only escapes its scope, but we don't distinguish yet. 613 defer myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" 614 } 615 } 616 617 func foo76g() { 618 for { 619 defer myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" 620 } 621 } 622 623 func foo77(z []interface{}) { // ERROR "z does not escape" 624 myprint(nil, z...) // z does not escape 625 } 626 627 func foo77a(z []interface{}) { // ERROR "z does not escape" 628 myprint1(nil, z...) 629 } 630 631 func foo77b(z []interface{}) { // ERROR "leaking param: z" 632 var ppi **interface{} 633 *ppi = myprint1(nil, z...) 634 } 635 636 func foo78(z int) *int { // ERROR "moved to heap: z" 637 return &z // ERROR "&z escapes to heap" 638 } 639 640 func foo78a(z int) *int { // ERROR "moved to heap: z" 641 y := &z // ERROR "&z escapes to heap" 642 x := &y // ERROR "&y does not escape" 643 return *x // really return y 644 } 645 646 func foo79() *int { 647 return new(int) // ERROR "new[(]int[)] escapes to heap" 648 } 649 650 func foo80() *int { 651 var z *int 652 for { 653 // Really just escapes its scope but we don't distinguish 654 z = new(int) // ERROR "new[(]int[)] escapes to heap" 655 } 656 _ = z 657 return nil 658 } 659 660 func foo81() *int { 661 for { 662 z := new(int) // ERROR "new[(]int[)] does not escape" 663 _ = z 664 } 665 return nil 666 } 667 668 func tee(p *int) (x, y *int) { return p, p } // ERROR "leaking param" 669 670 func noop(x, y *int) {} // ERROR "does not escape" 671 672 func foo82() { 673 var x, y, z int // ERROR "moved to heap" 674 go noop(tee(&z)) // ERROR "&z escapes to heap" 675 go noop(&x, &y) // ERROR "escapes to heap" 676 for { 677 var u, v, w int // ERROR "moved to heap" 678 defer noop(tee(&u)) // ERROR "&u escapes to heap" 679 defer noop(&v, &w) // ERROR "escapes to heap" 680 } 681 } 682 683 type Fooer interface { 684 Foo() 685 } 686 687 type LimitedFooer struct { 688 Fooer 689 N int64 690 } 691 692 func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r" 693 return &LimitedFooer{r, n} // ERROR "&LimitedFooer literal escapes to heap" 694 } 695 696 func foo90(x *int) map[*int]*int { // ERROR "leaking param: x" 697 return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap" 698 } 699 700 func foo91(x *int) map[*int]*int { // ERROR "leaking param: x" 701 return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap" 702 } 703 704 func foo92(x *int) [2]*int { // ERROR "leaking param: x" 705 return [2]*int{x, nil} 706 } 707 708 // does not leak c 709 func foo93(c chan *int) *int { // ERROR "c does not escape" 710 for v := range c { 711 return v 712 } 713 return nil 714 } 715 716 // does not leak m 717 func foo94(m map[*int]*int, b bool) *int { // ERROR "m does not escape" 718 for k, v := range m { 719 if b { 720 return k 721 } 722 return v 723 } 724 return nil 725 } 726 727 // does leak x 728 func foo95(m map[*int]*int, x *int) { // ERROR "m does not escape" "leaking param: x" 729 m[x] = x 730 } 731 732 // does not leak m 733 func foo96(m []*int) *int { // ERROR "m does not escape" 734 return m[0] 735 } 736 737 // does leak m 738 func foo97(m [1]*int) *int { // ERROR "leaking param: m" 739 return m[0] 740 } 741 742 // does not leak m 743 func foo98(m map[int]*int) *int { // ERROR "m does not escape" 744 return m[0] 745 } 746 747 // does leak m 748 func foo99(m *[1]*int) []*int { // ERROR "leaking param: m" 749 return m[:] 750 } 751 752 // does not leak m 753 func foo100(m []*int) *int { // ERROR "m does not escape" 754 for _, v := range m { 755 return v 756 } 757 return nil 758 } 759 760 // does leak m 761 func foo101(m [1]*int) *int { // ERROR "leaking param: m" 762 for _, v := range m { 763 return v 764 } 765 return nil 766 } 767 768 // does not leak m 769 func foo101a(m [1]*int) *int { // ERROR "m does not escape" 770 for i := range m { // ERROR "moved to heap: i" 771 return &i // ERROR "&i escapes to heap" 772 } 773 return nil 774 } 775 776 // does leak x 777 func foo102(m []*int, x *int) { // ERROR "m does not escape" "leaking param: x" 778 m[0] = x 779 } 780 781 // does not leak x 782 func foo103(m [1]*int, x *int) { // ERROR "m does not escape" "x does not escape" 783 m[0] = x 784 } 785 786 var y []*int 787 788 // does not leak x 789 func foo104(x []*int) { // ERROR "x does not escape" 790 copy(y, x) 791 } 792 793 // does not leak x 794 func foo105(x []*int) { // ERROR "x does not escape" 795 _ = append(y, x...) 796 } 797 798 // does leak x 799 func foo106(x *int) { // ERROR "leaking param: x" 800 _ = append(y, x) 801 } 802 803 func foo107(x *int) map[*int]*int { // ERROR "leaking param: x" 804 return map[*int]*int{x: nil} // ERROR "map.* literal escapes to heap" 805 } 806 807 func foo108(x *int) map[*int]*int { // ERROR "leaking param: x" 808 return map[*int]*int{nil: x} // ERROR "map.* literal escapes to heap" 809 } 810 811 func foo109(x *int) *int { // ERROR "leaking param: x" 812 m := map[*int]*int{x: nil} // ERROR "map.* literal does not escape" 813 for k, _ := range m { 814 return k 815 } 816 return nil 817 } 818 819 func foo110(x *int) *int { // ERROR "leaking param: x" 820 m := map[*int]*int{nil: x} // ERROR "map.* literal does not escape" 821 return m[nil] 822 } 823 824 func foo111(x *int) *int { // ERROR "leaking param: x" 825 m := []*int{x} // ERROR "\[\]\*int literal does not escape" 826 return m[0] 827 } 828 829 func foo112(x *int) *int { // ERROR "leaking param: x" 830 m := [1]*int{x} 831 return m[0] 832 } 833 834 func foo113(x *int) *int { // ERROR "leaking param: x" 835 m := Bar{ii: x} 836 return m.ii 837 } 838 839 func foo114(x *int) *int { // ERROR "leaking param: x" 840 m := &Bar{ii: x} // ERROR "&Bar literal does not escape" 841 return m.ii 842 } 843 844 func foo115(x *int) *int { // ERROR "leaking param: x" 845 return (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(x)) + 1)) 846 } 847 848 func foo116(b bool) *int { 849 if b { 850 x := 1 // ERROR "moved to heap: x" 851 return &x // ERROR "&x escapes to heap" 852 } else { 853 y := 1 // ERROR "moved to heap: y" 854 return &y // ERROR "&y escapes to heap" 855 } 856 return nil 857 } 858 859 func foo117(unknown func(interface{})) { // ERROR "unknown does not escape" 860 x := 1 // ERROR "moved to heap: x" 861 unknown(&x) // ERROR "&x escapes to heap" 862 } 863 864 func foo118(unknown func(*int)) { // ERROR "unknown does not escape" 865 x := 1 // ERROR "moved to heap: x" 866 unknown(&x) // ERROR "&x escapes to heap" 867 } 868 869 func external(*int) 870 871 func foo119(x *int) { // ERROR "leaking param: x" 872 external(x) 873 } 874 875 func foo120() { 876 // formerly exponential time analysis 877 L1: 878 L2: 879 L3: 880 L4: 881 L5: 882 L6: 883 L7: 884 L8: 885 L9: 886 L10: 887 L11: 888 L12: 889 L13: 890 L14: 891 L15: 892 L16: 893 L17: 894 L18: 895 L19: 896 L20: 897 L21: 898 L22: 899 L23: 900 L24: 901 L25: 902 L26: 903 L27: 904 L28: 905 L29: 906 L30: 907 L31: 908 L32: 909 L33: 910 L34: 911 L35: 912 L36: 913 L37: 914 L38: 915 L39: 916 L40: 917 L41: 918 L42: 919 L43: 920 L44: 921 L45: 922 L46: 923 L47: 924 L48: 925 L49: 926 L50: 927 L51: 928 L52: 929 L53: 930 L54: 931 L55: 932 L56: 933 L57: 934 L58: 935 L59: 936 L60: 937 L61: 938 L62: 939 L63: 940 L64: 941 L65: 942 L66: 943 L67: 944 L68: 945 L69: 946 L70: 947 L71: 948 L72: 949 L73: 950 L74: 951 L75: 952 L76: 953 L77: 954 L78: 955 L79: 956 L80: 957 L81: 958 L82: 959 L83: 960 L84: 961 L85: 962 L86: 963 L87: 964 L88: 965 L89: 966 L90: 967 L91: 968 L92: 969 L93: 970 L94: 971 L95: 972 L96: 973 L97: 974 L98: 975 L99: 976 L100: 977 // use the labels to silence compiler errors 978 goto L1 979 goto L2 980 goto L3 981 goto L4 982 goto L5 983 goto L6 984 goto L7 985 goto L8 986 goto L9 987 goto L10 988 goto L11 989 goto L12 990 goto L13 991 goto L14 992 goto L15 993 goto L16 994 goto L17 995 goto L18 996 goto L19 997 goto L20 998 goto L21 999 goto L22 1000 goto L23 1001 goto L24 1002 goto L25 1003 goto L26 1004 goto L27 1005 goto L28 1006 goto L29 1007 goto L30 1008 goto L31 1009 goto L32 1010 goto L33 1011 goto L34 1012 goto L35 1013 goto L36 1014 goto L37 1015 goto L38 1016 goto L39 1017 goto L40 1018 goto L41 1019 goto L42 1020 goto L43 1021 goto L44 1022 goto L45 1023 goto L46 1024 goto L47 1025 goto L48 1026 goto L49 1027 goto L50 1028 goto L51 1029 goto L52 1030 goto L53 1031 goto L54 1032 goto L55 1033 goto L56 1034 goto L57 1035 goto L58 1036 goto L59 1037 goto L60 1038 goto L61 1039 goto L62 1040 goto L63 1041 goto L64 1042 goto L65 1043 goto L66 1044 goto L67 1045 goto L68 1046 goto L69 1047 goto L70 1048 goto L71 1049 goto L72 1050 goto L73 1051 goto L74 1052 goto L75 1053 goto L76 1054 goto L77 1055 goto L78 1056 goto L79 1057 goto L80 1058 goto L81 1059 goto L82 1060 goto L83 1061 goto L84 1062 goto L85 1063 goto L86 1064 goto L87 1065 goto L88 1066 goto L89 1067 goto L90 1068 goto L91 1069 goto L92 1070 goto L93 1071 goto L94 1072 goto L95 1073 goto L96 1074 goto L97 1075 goto L98 1076 goto L99 1077 goto L100 1078 } 1079 1080 func foo121() { 1081 for i := 0; i < 10; i++ { 1082 defer myprint(nil, i) // ERROR "[.][.][.] argument escapes to heap" 1083 go myprint(nil, i) // ERROR "[.][.][.] argument escapes to heap" 1084 } 1085 } 1086 1087 // same as foo121 but check across import 1088 func foo121b() { 1089 for i := 0; i < 10; i++ { 1090 defer fmt.Printf("%d", i) // ERROR "[.][.][.] argument escapes to heap" 1091 go fmt.Printf("%d", i) // ERROR "[.][.][.] argument escapes to heap" 1092 } 1093 } 1094 1095 // a harmless forward jump 1096 func foo122() { 1097 var i *int 1098 1099 goto L1 1100 L1: 1101 i = new(int) // ERROR "new.int. does not escape" 1102 _ = i 1103 } 1104 1105 // a backward jump, increases loopdepth 1106 func foo123() { 1107 var i *int 1108 1109 L1: 1110 i = new(int) // ERROR "new.int. escapes to heap" 1111 1112 goto L1 1113 _ = i 1114 } 1115 1116 func foo124(x **int) { // ERROR "x does not escape" 1117 var i int // ERROR "moved to heap: i" 1118 p := &i // ERROR "&i escapes" 1119 func() { // ERROR "func literal does not escape" 1120 *x = p // ERROR "leaking closure reference p" 1121 }() 1122 } 1123 1124 func foo125(ch chan *int) { // ERROR "does not escape" 1125 var i int // ERROR "moved to heap" 1126 p := &i // ERROR "&i escapes to heap" 1127 func() { // ERROR "func literal does not escape" 1128 ch <- p // ERROR "leaking closure reference p" 1129 }() 1130 } 1131 1132 func foo126() { 1133 var px *int // loopdepth 0 1134 for { 1135 // loopdepth 1 1136 var i int // ERROR "moved to heap" 1137 func() { // ERROR "func literal does not escape" 1138 px = &i // ERROR "&i escapes" 1139 }() 1140 } 1141 _ = px 1142 } 1143 1144 var px *int 1145 1146 func foo127() { 1147 var i int // ERROR "moved to heap: i" 1148 p := &i // ERROR "&i escapes to heap" 1149 q := p 1150 px = q 1151 } 1152 1153 func foo128() { 1154 var i int 1155 p := &i // ERROR "&i does not escape" 1156 q := p 1157 _ = q 1158 } 1159 1160 func foo129() { 1161 var i int // ERROR "moved to heap: i" 1162 p := &i // ERROR "&i escapes to heap" 1163 func() { // ERROR "func literal does not escape" 1164 q := p // ERROR "leaking closure reference p" 1165 func() { // ERROR "func literal does not escape" 1166 r := q // ERROR "leaking closure reference q" 1167 px = r 1168 }() 1169 }() 1170 } 1171 1172 func foo130() { 1173 for { 1174 var i int // ERROR "moved to heap" 1175 func() { // ERROR "func literal does not escape" 1176 px = &i // ERROR "&i escapes" "leaking closure reference i" 1177 }() 1178 } 1179 } 1180 1181 func foo131() { 1182 var i int // ERROR "moved to heap" 1183 func() { // ERROR "func literal does not escape" 1184 px = &i // ERROR "&i escapes" "leaking closure reference i" 1185 }() 1186 } 1187 1188 func foo132() { 1189 var i int // ERROR "moved to heap" 1190 go func() { // ERROR "func literal escapes to heap" 1191 px = &i // ERROR "&i escapes" "leaking closure reference i" 1192 }() 1193 } 1194 1195 func foo133() { 1196 var i int // ERROR "moved to heap" 1197 defer func() { // ERROR "func literal does not escape" 1198 px = &i // ERROR "&i escapes" "leaking closure reference i" 1199 }() 1200 } 1201 1202 func foo134() { 1203 var i int 1204 p := &i // ERROR "&i does not escape" 1205 func() { // ERROR "func literal does not escape" 1206 q := p 1207 func() { // ERROR "func literal does not escape" 1208 r := q 1209 _ = r 1210 }() 1211 }() 1212 } 1213 1214 func foo135() { 1215 var i int // ERROR "moved to heap: i" 1216 p := &i // ERROR "&i escapes to heap" "moved to heap: p" 1217 go func() { // ERROR "func literal escapes to heap" 1218 q := p // ERROR "&p escapes to heap" 1219 func() { // ERROR "func literal does not escape" 1220 r := q 1221 _ = r 1222 }() 1223 }() 1224 } 1225 1226 func foo136() { 1227 var i int // ERROR "moved to heap: i" 1228 p := &i // ERROR "&i escapes to heap" "moved to heap: p" 1229 go func() { // ERROR "func literal escapes to heap" 1230 q := p // ERROR "&p escapes to heap" "leaking closure reference p" 1231 func() { // ERROR "func literal does not escape" 1232 r := q // ERROR "leaking closure reference q" 1233 px = r 1234 }() 1235 }() 1236 } 1237 1238 func foo137() { 1239 var i int // ERROR "moved to heap: i" 1240 p := &i // ERROR "&i escapes to heap" 1241 func() { // ERROR "func literal does not escape" 1242 q := p // ERROR "leaking closure reference p" "moved to heap: q" 1243 go func() { // ERROR "func literal escapes to heap" 1244 r := q // ERROR "&q escapes to heap" 1245 _ = r 1246 }() 1247 }() 1248 } 1249 1250 func foo138() *byte { 1251 type T struct { 1252 x [1]byte 1253 } 1254 t := new(T) // ERROR "new.T. escapes to heap" 1255 return &t.x[0] // ERROR "&t.x.0. escapes to heap" 1256 } 1257 1258 func foo139() *byte { 1259 type T struct { 1260 x struct { 1261 y byte 1262 } 1263 } 1264 t := new(T) // ERROR "new.T. escapes to heap" 1265 return &t.x.y // ERROR "&t.x.y escapes to heap" 1266 } 1267 1268 // issue 4751 1269 func foo140() interface{} { 1270 type T struct { 1271 X string 1272 } 1273 type U struct { 1274 X string 1275 T *T 1276 } 1277 t := &T{} // ERROR "&T literal escapes to heap" 1278 return U{ 1279 X: t.X, 1280 T: t, 1281 } 1282 } 1283 1284 //go:noescape 1285 1286 func F1([]byte) 1287 1288 func F2([]byte) 1289 1290 //go:noescape 1291 1292 func F3(x []byte) // ERROR "F3 x does not escape" 1293 1294 func F4(x []byte) 1295 1296 func G() { 1297 var buf1 [10]byte 1298 F1(buf1[:]) // ERROR "buf1 does not escape" 1299 1300 var buf2 [10]byte // ERROR "moved to heap: buf2" 1301 F2(buf2[:]) // ERROR "buf2 escapes to heap" 1302 1303 var buf3 [10]byte 1304 F3(buf3[:]) // ERROR "buf3 does not escape" 1305 1306 var buf4 [10]byte // ERROR "moved to heap: buf4" 1307 F4(buf4[:]) // ERROR "buf4 escapes to heap" 1308 } 1309 1310 type Tm struct { 1311 x int 1312 } 1313 1314 func (t *Tm) M() { // ERROR "t does not escape" 1315 } 1316 1317 func foo141() { 1318 var f func() 1319 1320 t := new(Tm) // ERROR "escapes to heap" 1321 f = t.M // ERROR "t.M does not escape" 1322 _ = f 1323 } 1324 1325 var gf func() 1326 1327 func foo142() { 1328 t := new(Tm) // ERROR "escapes to heap" 1329 gf = t.M // ERROR "t.M escapes to heap" 1330 } 1331 1332 // issue 3888. 1333 func foo143() { 1334 for i := 0; i < 1000; i++ { 1335 func() { // ERROR "func literal does not escape" 1336 for i := 0; i < 1; i++ { 1337 var t Tm 1338 t.M() // ERROR "t does not escape" 1339 } 1340 }() 1341 } 1342 } 1343 1344 // issue 5773 1345 // Check that annotations take effect regardless of whether they 1346 // are before or after the use in the source code. 1347 1348 //go:noescape 1349 1350 func foo144a(*int) 1351 1352 func foo144() { 1353 var x int 1354 foo144a(&x) // ERROR "&x does not escape" 1355 var y int 1356 foo144b(&y) // ERROR "&y does not escape" 1357 } 1358 1359 //go:noescape 1360 1361 func foo144b(*int) 1362 1363 // issue 7313: for loop init should not be treated as "in loop" 1364 1365 type List struct { 1366 Next *List 1367 } 1368 1369 func foo145(l List) { // ERROR "l does not escape" 1370 var p *List 1371 for p = &l; p.Next != nil; p = p.Next { // ERROR "&l does not escape" 1372 } 1373 } 1374 1375 func foo146(l List) { // ERROR "l does not escape" 1376 var p *List 1377 p = &l // ERROR "&l does not escape" 1378 for ; p.Next != nil; p = p.Next { 1379 } 1380 } 1381 1382 func foo147(l List) { // ERROR "l does not escape" 1383 var p *List 1384 p = &l // ERROR "&l does not escape" 1385 for p.Next != nil { 1386 p = p.Next 1387 } 1388 } 1389 1390 func foo148(l List) { // ERROR " l does not escape" 1391 for p := &l; p.Next != nil; p = p.Next { // ERROR "&l does not escape" 1392 } 1393 } 1394 1395 // related: address of variable should have depth of variable, not of loop 1396 1397 func foo149(l List) { // ERROR " l does not escape" 1398 var p *List 1399 for { 1400 for p = &l; p.Next != nil; p = p.Next { // ERROR "&l does not escape" 1401 } 1402 } 1403 } 1404 1405 // issue 7934: missed ... if element type had no pointers 1406 1407 var save150 []byte 1408 1409 func foo150(x ...byte) { // ERROR "leaking param: x" 1410 save150 = x 1411 } 1412 1413 func bar150() { 1414 foo150(1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" 1415 } 1416 1417 // issue 7931: bad handling of slice of array 1418 1419 var save151 *int 1420 1421 func foo151(x *int) { // ERROR "leaking param: x" 1422 save151 = x 1423 } 1424 1425 func bar151() { 1426 var a [64]int // ERROR "moved to heap: a" 1427 a[4] = 101 1428 foo151(&(&a)[4:8][0]) // ERROR "&\(&a\)\[4:8\]\[0\] escapes to heap" "&a escapes to heap" 1429 } 1430 1431 func bar151b() { 1432 var a [10]int // ERROR "moved to heap: a" 1433 b := a[:] // ERROR "a escapes to heap" 1434 foo151(&b[4:8][0]) // ERROR "&b\[4:8\]\[0\] escapes to heap" 1435 } 1436 1437 func bar151c() { 1438 var a [64]int // ERROR "moved to heap: a" 1439 a[4] = 101 1440 foo151(&(&a)[4:8:8][0]) // ERROR "&\(&a\)\[4:8:8\]\[0\] escapes to heap" "&a escapes to heap" 1441 } 1442 1443 func bar151d() { 1444 var a [10]int // ERROR "moved to heap: a" 1445 b := a[:] // ERROR "a escapes to heap" 1446 foo151(&b[4:8:8][0]) // ERROR "&b\[4:8:8\]\[0\] escapes to heap" 1447 } 1448 1449 // issue 8120 1450 1451 type U struct { 1452 s *string 1453 } 1454 1455 func (u *U) String() *string { // ERROR "leaking param u content to result ~r0" 1456 return u.s 1457 } 1458 1459 type V struct { 1460 s *string 1461 } 1462 1463 func NewV(u U) *V { // ERROR "leaking param: u" 1464 return &V{u.String()} // ERROR "&V literal escapes to heap" "u does not escape" 1465 } 1466 1467 func foo152() { 1468 a := "a" // ERROR "moved to heap: a" 1469 u := U{&a} // ERROR "&a escapes to heap" 1470 v := NewV(u) 1471 println(v) 1472 } 1473 1474 // issue 8176 - &x in type switch body not marked as escaping 1475 1476 func foo153(v interface{}) *int { // ERROR "leaking param: v" 1477 switch x := v.(type) { 1478 case int: // ERROR "moved to heap: x" 1479 return &x // ERROR "&x escapes to heap" 1480 } 1481 panic(0) 1482 } 1483 1484 // issue 8185 - &result escaping into result 1485 1486 func f() (x int, y *int) { // ERROR "moved to heap: x" 1487 y = &x // ERROR "&x escapes to heap" 1488 return 1489 } 1490 1491 func g() (x interface{}) { // ERROR "moved to heap: x" 1492 x = &x // ERROR "&x escapes to heap" 1493 return 1494 }