github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/pointer/testdata/flow.go (about)

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