98 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
| // +build ignore
 | |
| 
 | |
| package main
 | |
| 
 | |
| var unknown bool // defeat dead-code elimination
 | |
| 
 | |
| var a, b int
 | |
| 
 | |
| func array1() {
 | |
| 	sliceA := make([]*int, 10) // @line a1make
 | |
| 	sliceA[0] = &a
 | |
| 
 | |
| 	var sliceB []*int
 | |
| 	sliceB = append(sliceB, &b) // @line a1append
 | |
| 
 | |
| 	print(sliceA)    // @pointsto makeslice@a1make:16
 | |
| 	print(sliceA[0]) // @pointsto main.a
 | |
| 
 | |
| 	print(sliceB)      // @pointsto append@a1append:17
 | |
| 	print(sliceB[100]) // @pointsto main.b
 | |
| }
 | |
| 
 | |
| func array2() {
 | |
| 	sliceA := make([]*int, 10) // @line a2make
 | |
| 	sliceA[0] = &a
 | |
| 
 | |
| 	sliceB := sliceA[:]
 | |
| 
 | |
| 	print(sliceA)    // @pointsto makeslice@a2make:16
 | |
| 	print(sliceA[0]) // @pointsto main.a
 | |
| 
 | |
| 	print(sliceB)    // @pointsto makeslice@a2make:16
 | |
| 	print(sliceB[0]) // @pointsto main.a
 | |
| }
 | |
| 
 | |
| func array3() {
 | |
| 	a := []interface{}{"", 1}
 | |
| 	b := []interface{}{true, func() {}}
 | |
| 	print(a[0]) // @types string | int
 | |
| 	print(b[0]) // @types bool | func()
 | |
| }
 | |
| 
 | |
| // Test of append, copy, slice.
 | |
| func array4() {
 | |
| 	var s2 struct { // @line a4L0
 | |
| 		a [3]int
 | |
| 		b struct{ c, d int }
 | |
| 	}
 | |
| 	var sl1 = make([]*int, 10) // @line a4make
 | |
| 	var someint int            // @line a4L1
 | |
| 	sl1[1] = &someint
 | |
| 	sl2 := append(sl1, &s2.a[1]) // @line a4append1
 | |
| 	print(sl1)                   // @pointsto makeslice@a4make:16
 | |
| 	print(sl2)                   // @pointsto append@a4append1:15 | makeslice@a4make:16
 | |
| 	print(sl1[0])                // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
 | |
| 	print(sl2[0])                // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
 | |
| 
 | |
| 	// In z=append(x,y) we should observe flow from y[*] to x[*].
 | |
| 	var sl3 = make([]*int, 10) // @line a4L2
 | |
| 	_ = append(sl3, &s2.a[1])
 | |
| 	print(sl3)    // @pointsto makeslice@a4L2:16
 | |
| 	print(sl3[0]) // @pointsto s2.a[*]@a4L0:6
 | |
| 
 | |
| 	var sl4 = []*int{&a} // @line a4L3
 | |
| 	sl4a := append(sl4)  // @line a4L4
 | |
| 	print(sl4a)          // @pointsto slicelit@a4L3:18 | append@a4L4:16
 | |
| 	print(&sl4a[0])      // @pointsto slicelit[*]@a4L3:18 | append[*]@a4L4:16
 | |
| 	print(sl4a[0])       // @pointsto main.a
 | |
| 
 | |
| 	var sl5 = []*int{&b} // @line a4L5
 | |
| 	copy(sl5, sl4)
 | |
| 	print(sl5)     // @pointsto slicelit@a4L5:18
 | |
| 	print(&sl5[0]) // @pointsto slicelit[*]@a4L5:18
 | |
| 	print(sl5[0])  // @pointsto main.b | main.a
 | |
| 
 | |
| 	var sl6 = sl5[:0]
 | |
| 	print(sl6)     // @pointsto slicelit@a4L5:18
 | |
| 	print(&sl6[0]) // @pointsto slicelit[*]@a4L5:18
 | |
| 	print(sl6[0])  // @pointsto main.b | main.a
 | |
| }
 | |
| 
 | |
| func array5() {
 | |
| 	var arr [2]*int
 | |
| 	arr[0] = &a
 | |
| 	arr[1] = &b
 | |
| 
 | |
| 	var n int
 | |
| 	print(arr[n]) // @pointsto main.a | main.b
 | |
| }
 | |
| 
 | |
| func main() {
 | |
| 	array1()
 | |
| 	array2()
 | |
| 	array3()
 | |
| 	array4()
 | |
| 	array5()
 | |
| }
 |