| //go:build ignore |
| // +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 command-line-arguments.f1 |
| print(p) // @pointsto command-line-arguments.f2 |
| print(q) // @pointsto command-line-arguments.f2 |
| print(r) // @pointsto command-line-arguments.f1 | command-line-arguments.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 command-line-arguments.g1 |
| print(p) // @pointsto command-line-arguments.g2 |
| print(q) // @pointsto command-line-arguments.g2 |
| print(r) // @pointsto command-line-arguments.g2 | command-line-arguments.g1 |
| } |
| |
| func main() { |
| flow1() |
| flow2() |
| flow3() |
| } |