Source file test/uintptrescapes2.go

     1  // errorcheck -0 -l -m -live
     2  
     3  // Copyright 2016 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 escape analysis and liveness inferred for uintptrescapes functions.
     8  
     9  package p
    10  
    11  import (
    12  	"unsafe"
    13  )
    14  
    15  //go:uintptrescapes
    16  func F1(a uintptr) {} // ERROR "escaping uintptr"
    17  
    18  //go:uintptrescapes
    19  func F2(a ...uintptr) {} // ERROR "escaping ...uintptr"
    20  
    21  //go:uintptrescapes
    22  func F3(uintptr) {} // ERROR "escaping uintptr"
    23  
    24  //go:uintptrescapes
    25  func F4(...uintptr) {} // ERROR "escaping ...uintptr"
    26  
    27  type T struct{}
    28  
    29  //go:uintptrescapes
    30  func (T) M1(a uintptr) {} // ERROR "escaping uintptr"
    31  
    32  //go:uintptrescapes
    33  func (T) M2(a ...uintptr) {} // ERROR "escaping ...uintptr" "leaking param: a"
    34  
    35  func TestF1() {
    36  	var t int                        // ERROR "moved to heap"
    37  	F1(uintptr(unsafe.Pointer(&t)))  // ERROR "live at call to F1: .?autotmp" "stack object .autotmp_[0-9]+ unsafe.Pointer$"
    38  }
    39  
    40  func TestF3() {
    41  	var t2 int                       // ERROR "moved to heap"
    42  	F3(uintptr(unsafe.Pointer(&t2))) // ERROR "live at call to F3: .?autotmp" "stack object .autotmp_[0-9]+ unsafe.Pointer$"
    43  }
    44  
    45  func TestM1() {
    46  	var t T
    47  	var v int                         // ERROR "moved to heap"
    48  	t.M1(uintptr(unsafe.Pointer(&v))) // ERROR "live at call to T.M1: .?autotmp" "stack object .autotmp_[0-9]+ unsafe.Pointer$"
    49  }
    50  
    51  func TestF2() {
    52  	var v int                                 // ERROR "moved to heap"
    53  	F2(0, 1, uintptr(unsafe.Pointer(&v)), 2)  // ERROR "live at call to newobject: .?autotmp" "live at call to F2: .?autotmp" "escapes to heap" "stack object .autotmp_[0-9]+ unsafe.Pointer$"
    54  }
    55  
    56  func TestF4() {
    57  	var v2 int                                // ERROR "moved to heap"
    58  	F4(0, 1, uintptr(unsafe.Pointer(&v2)), 2) // ERROR "live at call to newobject: .?autotmp" "live at call to F4: .?autotmp" "escapes to heap" "stack object .autotmp_[0-9]+ unsafe.Pointer$"
    59  }
    60  
    61  func TestM2() {
    62  	var t T
    63  	var v int                                  // ERROR "moved to heap"
    64  	t.M2(0, 1, uintptr(unsafe.Pointer(&v)), 2) // ERROR "live at call to newobject: .?autotmp" "live at call to T.M2: .?autotmp"  "escapes to heap" "stack object .autotmp_[0-9]+ unsafe.Pointer$"
    65  }
    66  

View as plain text