1// +build ignore 2 3package main 4 5var unknown bool // defeat dead-code elimination 6 7var a, b int 8 9func 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 23func 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 36func 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. 44func 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 82func 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 91func main() { 92 array1() 93 array2() 94 array3() 95 array4() 96 array5() 97} 98