github.com/v2fly/tools@v0.100.0/go/pointer/testdata/arrays.go (about)

     1  // +build ignore
     2  
     3  package main
     4  
     5  var unknown bool // defeat dead-code elimination
     6  
     7  var a, b int
     8  
     9  func array1() {
    10  	sliceA := make([]*int, 10) // @line a1make
    11  	sliceA[0] = &a
    12  
    13  	var sliceB []*int
    14  	sliceB = append(sliceB, &b) // @line a1append
    15  
    16  	print(sliceA)    // @pointsto makeslice@a1make:16
    17  	print(sliceA[0]) // @pointsto main.a
    18  
    19  	print(sliceB)      // @pointsto append@a1append:17
    20  	print(sliceB[100]) // @pointsto main.b
    21  }
    22  
    23  func array2() {
    24  	sliceA := make([]*int, 10) // @line a2make
    25  	sliceA[0] = &a
    26  
    27  	sliceB := sliceA[:]
    28  
    29  	print(sliceA)    // @pointsto makeslice@a2make:16
    30  	print(sliceA[0]) // @pointsto main.a
    31  
    32  	print(sliceB)    // @pointsto makeslice@a2make:16
    33  	print(sliceB[0]) // @pointsto main.a
    34  }
    35  
    36  func array3() {
    37  	a := []interface{}{"", 1}
    38  	b := []interface{}{true, func() {}}
    39  	print(a[0]) // @types string | int
    40  	print(b[0]) // @types bool | func()
    41  }
    42  
    43  // Test of append, copy, slice.
    44  func array4() {
    45  	var s2 struct { // @line a4L0
    46  		a [3]int
    47  		b struct{ c, d int }
    48  	}
    49  	var sl1 = make([]*int, 10) // @line a4make
    50  	var someint int            // @line a4L1
    51  	sl1[1] = &someint
    52  	sl2 := append(sl1, &s2.a[1]) // @line a4append1
    53  	print(sl1)                   // @pointsto makeslice@a4make:16
    54  	print(sl2)                   // @pointsto append@a4append1:15 | makeslice@a4make:16
    55  	print(sl1[0])                // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
    56  	print(sl2[0])                // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
    57  
    58  	// In z=append(x,y) we should observe flow from y[*] to x[*].
    59  	var sl3 = make([]*int, 10) // @line a4L2
    60  	_ = append(sl3, &s2.a[1])
    61  	print(sl3)    // @pointsto makeslice@a4L2:16
    62  	print(sl3[0]) // @pointsto s2.a[*]@a4L0:6
    63  
    64  	var sl4 = []*int{&a} // @line a4L3
    65  	sl4a := append(sl4)  // @line a4L4
    66  	print(sl4a)          // @pointsto slicelit@a4L3:18 | append@a4L4:16
    67  	print(&sl4a[0])      // @pointsto slicelit[*]@a4L3:18 | append[*]@a4L4:16
    68  	print(sl4a[0])       // @pointsto main.a
    69  
    70  	var sl5 = []*int{&b} // @line a4L5
    71  	copy(sl5, sl4)
    72  	print(sl5)     // @pointsto slicelit@a4L5:18
    73  	print(&sl5[0]) // @pointsto slicelit[*]@a4L5:18
    74  	print(sl5[0])  // @pointsto main.b | main.a
    75  
    76  	var sl6 = sl5[:0]
    77  	print(sl6)     // @pointsto slicelit@a4L5:18
    78  	print(&sl6[0]) // @pointsto slicelit[*]@a4L5:18
    79  	print(sl6[0])  // @pointsto main.b | main.a
    80  }
    81  
    82  func array5() {
    83  	var arr [2]*int
    84  	arr[0] = &a
    85  	arr[1] = &b
    86  
    87  	var n int
    88  	print(arr[n]) // @pointsto main.a | main.b
    89  }
    90  
    91  func main() {
    92  	array1()
    93  	array2()
    94  	array3()
    95  	array4()
    96  	array5()
    97  }