64 lines
		
	
	
		
			934 B
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			934 B
		
	
	
	
		
			Go
		
	
	
	
| // +build ignore
 | |
| 
 | |
| package main
 | |
| 
 | |
| // Demonstration of directionality of flow edges.
 | |
| 
 | |
| func f1() {}
 | |
| func f2() {}
 | |
| 
 | |
| var somepred bool
 | |
| 
 | |
| // Tracking functions.
 | |
| func flow1() {
 | |
| 	s := f1
 | |
| 	p := f2
 | |
| 	q := p
 | |
| 	r := q
 | |
| 	if somepred {
 | |
| 		r = s
 | |
| 	}
 | |
| 	print(s) // @pointsto main.f1
 | |
| 	print(p) // @pointsto main.f2
 | |
| 	print(q) // @pointsto main.f2
 | |
| 	print(r) // @pointsto main.f1 | main.f2
 | |
| }
 | |
| 
 | |
| // Tracking concrete types in interfaces.
 | |
| func flow2() {
 | |
| 	var s interface{} = 1
 | |
| 	var p interface{} = "foo"
 | |
| 	q := p
 | |
| 	r := q
 | |
| 	if somepred {
 | |
| 		r = s
 | |
| 	}
 | |
| 	print(s) // @types int
 | |
| 	print(p) // @types string
 | |
| 	print(q) // @types string
 | |
| 	print(r) // @types int | string
 | |
| }
 | |
| 
 | |
| var g1, g2 int
 | |
| 
 | |
| // Tracking addresses of globals.
 | |
| func flow3() {
 | |
| 	s := &g1
 | |
| 	p := &g2
 | |
| 	q := p
 | |
| 	r := q
 | |
| 	if somepred {
 | |
| 		r = s
 | |
| 	}
 | |
| 	print(s) // @pointsto main.g1
 | |
| 	print(p) // @pointsto main.g2
 | |
| 	print(q) // @pointsto main.g2
 | |
| 	print(r) // @pointsto main.g2 | main.g1
 | |
| }
 | |
| 
 | |
| func main() {
 | |
| 	flow1()
 | |
| 	flow2()
 | |
| 	flow3()
 | |
| }
 |