1 | //go:build ignore |
---|---|
2 | // +build ignore |
3 | |
4 | package main |
5 | |
6 | var unknown bool // defeat dead-code elimination |
7 | |
8 | var p, q int |
9 | |
10 | type A struct { |
11 | f *int |
12 | g interface{} |
13 | } |
14 | |
15 | func (a A) m1() { |
16 | print(a.f) // @pointsto command-line-arguments.p |
17 | } |
18 | |
19 | func (a *A) m2() { |
20 | print(a) // @pointsto complit.A@struct1s:9 |
21 | print(a.f) // @pointsto command-line-arguments.p |
22 | } |
23 | |
24 | type B struct { |
25 | h *int |
26 | A |
27 | } |
28 | |
29 | func structs1() { |
30 | b := &B{ // @line struct1s |
31 | h: &q, |
32 | } |
33 | b.f = &p |
34 | b.g = b |
35 | |
36 | print(b.h) // @pointsto command-line-arguments.q |
37 | print(b.f) // @pointsto command-line-arguments.p |
38 | print(b.g) // @types *B |
39 | |
40 | ptr := &b.f |
41 | print(*ptr) // @pointsto command-line-arguments.p |
42 | |
43 | b.m1() |
44 | b.m2() |
45 | } |
46 | |
47 | // @calls command-line-arguments.structs1 -> (command-line-arguments.A).m1 |
48 | // @calls command-line-arguments.structs1 -> (*command-line-arguments.A).m2 |
49 | // @calls (*command-line-arguments.B).m1 -> (command-line-arguments.A).m1 |
50 | // @calls (*command-line-arguments.B).m2 -> (*command-line-arguments.A).m2 |
51 | |
52 | type T struct { |
53 | x int |
54 | y int |
55 | } |
56 | |
57 | type S struct { |
58 | a [3]T |
59 | b *[3]T |
60 | c [3]*T |
61 | } |
62 | |
63 | func structs2() { |
64 | var s S // @line s2s |
65 | print(&s) // @pointsto s@s2s:6 |
66 | print(&s.a) // @pointsto s.a@s2s:6 |
67 | print(&s.a[0]) // @pointsto s.a[*]@s2s:6 |
68 | print(&s.a[0].x) // @pointsto s.a[*].x@s2s:6 |
69 | print(&s.a[0].y) // @pointsto s.a[*].y@s2s:6 |
70 | print(&s.b) // @pointsto s.b@s2s:6 |
71 | print(&s.b[0]) // @pointsto |
72 | print(&s.b[0].x) // @pointsto |
73 | print(&s.b[0].y) // @pointsto |
74 | print(&s.c) // @pointsto s.c@s2s:6 |
75 | print(&s.c[0]) // @pointsto s.c[*]@s2s:6 |
76 | print(&s.c[0].x) // @pointsto |
77 | print(&s.c[0].y) // @pointsto |
78 | |
79 | var s2 S // @line s2s2 |
80 | s2.b = new([3]T) // @line s2s2b |
81 | print(s2.b) // @pointsto new@s2s2b:12 |
82 | print(&s2.b) // @pointsto s2.b@s2s2:6 |
83 | print(&s2.b[0]) // @pointsto new[*]@s2s2b:12 |
84 | print(&s2.b[0].x) // @pointsto new[*].x@s2s2b:12 |
85 | print(&s2.b[0].y) // @pointsto new[*].y@s2s2b:12 |
86 | print(&s2.c[0].x) // @pointsto |
87 | print(&s2.c[0].y) // @pointsto |
88 | |
89 | var s3 S // @line s2s3 |
90 | s3.c[2] = new(T) // @line s2s3c |
91 | print(&s3.c) // @pointsto s3.c@s2s3:6 |
92 | print(s3.c[1]) // @pointsto new@s2s3c:15 |
93 | print(&s3.c[1]) // @pointsto s3.c[*]@s2s3:6 |
94 | print(&s3.c[1].x) // @pointsto new.x@s2s3c:15 |
95 | print(&s3.c[1].y) // @pointsto new.y@s2s3c:15 |
96 | } |
97 | |
98 | func main() { |
99 | structs1() |
100 | structs2() |
101 | } |
102 |
Members