| package main | |
| // Tests of 'pointsto' query. | |
| // See go.tools/guru/guru_test.go for explanation. | |
| // See pointsto.golden for expected query results. | |
| const pi = 3.141 // @pointsto const "pi" | |
| var global = new(string) // NB: ssa.Global is indirect, i.e. **string | |
| func main() { | |
| livecode() | |
| // func objects | |
| _ = main // @pointsto func-ref-main "main" | |
| _ = (*C).f // @pointsto func-ref-*C.f "..C..f" | |
| _ = D.f // @pointsto func-ref-D.f "D.f" | |
| _ = I.f // @pointsto func-ref-I.f "I.f" | |
| var d D | |
| var i I | |
| _ = d.f // @pointsto func-ref-d.f "d.f" | |
| _ = i.f // @pointsto func-ref-i.f "i.f" | |
| // var objects | |
| anon := func() { | |
| _ = d.f // @pointsto ref-lexical-d.f "d.f" | |
| } | |
| _ = anon // @pointsto ref-anon "anon" | |
| _ = global // @pointsto ref-global "global" | |
| // SSA affords some local flow sensitivity. | |
| var a, b int | |
| var x = &a // @pointsto var-def-x-1 "x" | |
| _ = x // @pointsto var-ref-x-1 "x" | |
| x = &b // @pointsto var-def-x-2 "x" | |
| _ = x // @pointsto var-ref-x-2 "x" | |
| i = new(C) // @pointsto var-ref-i-C "i" | |
| if i != nil { | |
| i = D{} // @pointsto var-ref-i-D "i" | |
| } | |
| print(i) // @pointsto var-ref-i "\\bi\\b" | |
| m := map[string]*int{"a": &a} | |
| mapval, _ := m["a"] // @pointsto map-lookup,ok "m..a.." | |
| _ = mapval // @pointsto mapval "mapval" | |
| _ = m // @pointsto m "m" | |
| if false { | |
| panic(3) // @pointsto builtin-panic "panic" | |
| } | |
| // NB: s.f is addressable per (*ssa.Program).VarValue, | |
| // but our query concerns the object, not its address. | |
| s := struct{ f interface{} }{f: make(chan bool)} | |
| print(s.f) // @pointsto var-ref-s-f "s.f" | |
| } | |
| func livecode() {} // @pointsto func-live "livecode" | |
| func deadcode() { // @pointsto func-dead "deadcode" | |
| // Pointer analysis can't run on dead code. | |
| var b = new(int) // @pointsto b "b" | |
| _ = b | |
| } | |
| type I interface { | |
| f() | |
| } | |
| type C int | |
| type D struct{} | |
| func (c *C) f() {} | |
| func (d D) f() {} |