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

     1  // +build ignore
     2  
     3  package main
     4  
     5  // Demonstration of directionality of flow edges.
     6  
     7  func f1() {}
     8  func f2() {}
     9  
    10  var somepred bool
    11  
    12  // Tracking functions.
    13  func flow1() {
    14  	s := f1
    15  	p := f2
    16  	q := p
    17  	r := q
    18  	if somepred {
    19  		r = s
    20  	}
    21  	print(s) // @pointsto main.f1
    22  	print(p) // @pointsto main.f2
    23  	print(q) // @pointsto main.f2
    24  	print(r) // @pointsto main.f1 | main.f2
    25  }
    26  
    27  // Tracking concrete types in interfaces.
    28  func flow2() {
    29  	var s interface{} = 1
    30  	var p interface{} = "foo"
    31  	q := p
    32  	r := q
    33  	if somepred {
    34  		r = s
    35  	}
    36  	print(s) // @types int
    37  	print(p) // @types string
    38  	print(q) // @types string
    39  	print(r) // @types int | string
    40  }
    41  
    42  var g1, g2 int
    43  
    44  // Tracking addresses of globals.
    45  func flow3() {
    46  	s := &g1
    47  	p := &g2
    48  	q := p
    49  	r := q
    50  	if somepred {
    51  		r = s
    52  	}
    53  	print(s) // @pointsto main.g1
    54  	print(p) // @pointsto main.g2
    55  	print(q) // @pointsto main.g2
    56  	print(r) // @pointsto main.g2 | main.g1
    57  }
    58  
    59  func main() {
    60  	flow1()
    61  	flow2()
    62  	flow3()
    63  }