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()
|
|
}
|