github.com/v2fly/tools@v0.100.0/go/pointer/testdata/maps.go (about) 1 // +build ignore 2 3 package main 4 5 // Test of maps. 6 7 var a, b, c int 8 9 func maps1() { 10 m1 := map[*int]*int{&a: &b} // @line m1m1 11 m2 := make(map[*int]*int) // @line m1m2 12 m2[&b] = &a 13 14 print(m1[nil]) // @pointsto main.b | main.c 15 print(m2[nil]) // @pointsto main.a 16 17 print(m1) // @pointsto makemap@m1m1:21 18 print(m2) // @pointsto makemap@m1m2:12 19 20 m1[&b] = &c 21 22 for k, v := range m1 { 23 print(k) // @pointsto main.a | main.b 24 print(v) // @pointsto main.b | main.c 25 } 26 27 for k, v := range m2 { 28 print(k) // @pointsto main.b 29 print(v) // @pointsto main.a 30 } 31 32 // Lookup doesn't create any aliases. 33 print(m2[&c]) // @pointsto main.a 34 if _, ok := m2[&a]; ok { 35 print(m2[&c]) // @pointsto main.a 36 } 37 } 38 39 func maps2() { 40 m1 := map[*int]*int{&a: &b} 41 m2 := map[*int]*int{&b: &c} 42 _ = []map[*int]*int{m1, m2} // (no spurious merging of m1, m2) 43 44 print(m1[nil]) // @pointsto main.b 45 print(m2[nil]) // @pointsto main.c 46 } 47 48 var g int 49 50 func maps3() { 51 // Regression test for a constraint generation bug for map range 52 // loops in which the key is unused: the (ok, k, v) tuple 53 // returned by ssa.Next may have type 'invalid' for the k and/or 54 // v components, so copying the map key or value may cause 55 // miswiring if the key has >1 components. In the worst case, 56 // this causes a crash. The test below used to report that 57 // pts(v) includes not just main.g but new(float64) too, which 58 // is ill-typed. 59 60 // sizeof(K) > 1, abstractly 61 type K struct{ a, b *float64 } 62 k := K{new(float64), nil} 63 m := map[K]*int{k: &g} 64 65 for _, v := range m { 66 print(v) // @pointsto main.g 67 } 68 } 69 70 func main() { 71 maps1() 72 maps2() 73 maps3() 74 }