@@ -44,100 +44,99 @@ def setFoo(obj, x):
44
44
SINK_F (obj .foo )
45
45
obj .foo = x
46
46
47
+ # def test_indirect_assign():
48
+ myobj1 = MyObj ("OK" )
49
+ setFoo (myobj1 , SOURCE )
50
+ SINK (myobj1 .foo ) # $ flow="SOURCE, l:-1 -> myobj1.foo"
47
51
48
- myobj = MyObj ("OK" )
49
52
50
- setFoo (myobj , SOURCE )
51
- SINK (myobj .foo ) # $ flow="SOURCE, l:-1 -> myobj.foo"
53
+ # def test_indirect_assign_method():
54
+ myobj2 = MyObj ("OK" )
55
+ myobj2 .setFoo (SOURCE )
56
+ SINK (myobj2 .foo ) # $ flow="SOURCE, l:-1 -> myobj2.foo"
52
57
53
58
59
+ # def test_direct_assign():
60
+ myobj3 = MyObj (NONSOURCE )
61
+ myobj3 .foo = SOURCE
62
+ SINK (myobj3 .foo ) # $ flow="SOURCE, l:-1 -> myobj3.foo"
54
63
55
- myobj = MyObj ("OK" )
56
64
57
- myobj .setFoo (SOURCE )
58
- SINK (myobj .foo ) # $ flow="SOURCE, l:-1 -> myobj.foo"
59
-
60
-
61
-
62
- myobj = MyObj (NONSOURCE )
63
- myobj .foo = SOURCE
64
- SINK (myobj .foo ) # $ flow="SOURCE, l:-1 -> myobj.foo"
65
-
66
-
67
-
68
- myobj = MyObj (NONSOURCE )
69
- myobj .foo = SOURCE
70
- myobj .foo = NONSOURCE
71
- SINK_F (myobj .foo )
65
+ # def test_direct_assign_overwrite():
66
+ myobj4 = MyObj (NONSOURCE )
67
+ myobj4 .foo = SOURCE
68
+ myobj4 .foo = NONSOURCE
69
+ SINK_F (myobj4 .foo )
72
70
71
+ # def test_direct_if_assign(cond = False):
73
72
74
73
# this way, our analysis isn't able to understand that `cond` is just False,
75
74
# and therefore isn't able to determine that the if below will not hold.
76
75
cond = eval ("False" )
77
76
78
- myobj = MyObj (NONSOURCE )
79
- myobj .foo = SOURCE
77
+ myobj5 = MyObj (NONSOURCE )
78
+ myobj5 .foo = SOURCE
80
79
if cond :
81
- myobj .foo = NONSOURCE
82
- SINK_F (myobj .foo )
80
+ myobj5 .foo = NONSOURCE
81
+ SINK_F (myobj5 .foo )
83
82
# SPLITTING happens here, so in one version there is flow, and in the other there isn't
84
83
# that's why it has both a flow and a MISSING: flow annotation
85
- SINK (myobj .foo ) # $ flow="SOURCE, l:-6 -> myobj.foo" MISSING: flow
86
-
84
+ SINK (myobj5 .foo ) # $ flow="SOURCE, l:-6 -> myobj5.foo" MISSING: flow
87
85
88
86
89
- myobj = MyObj (NONSOURCE )
90
- myobj .foo = SOURCE
87
+ # def test_direct_if_always_assign(cond = True):
88
+ myobj6 = MyObj (NONSOURCE )
89
+ myobj6 .foo = SOURCE
91
90
if cond :
92
- myobj .foo = NONSOURCE
93
- SINK_F (myobj .foo )
91
+ myobj6 .foo = NONSOURCE
92
+ SINK_F (myobj6 .foo )
94
93
else :
95
- myobj .foo = NONSOURCE
96
- SINK_F (myobj .foo )
97
- SINK_F (myobj .foo )
94
+ myobj6 .foo = NONSOURCE
95
+ SINK_F (myobj6 .foo )
96
+ SINK_F (myobj6 .foo )
98
97
99
98
99
+ # def test_getattr():
100
+ myobj7 = MyObj (NONSOURCE )
101
+ myobj7 .foo = SOURCE
102
+ SINK (getattr (myobj7 , "foo" )) # $ flow="SOURCE, l:-1 -> getattr(..)"
100
103
101
- myobj = MyObj (NONSOURCE )
102
- myobj .foo = SOURCE
103
- SINK (getattr (myobj , "foo" )) # $ flow="SOURCE, l:-1 -> getattr(..)"
104
104
105
+ # def test_setattr():
106
+ myobj8 = MyObj (NONSOURCE )
107
+ setattr (myobj8 , "foo" , SOURCE )
108
+ SINK (myobj8 .foo ) # $ flow="SOURCE, l:-1 -> myobj8.foo"
105
109
106
110
107
- myobj = MyObj (NONSOURCE )
108
- setattr (myobj , "foo" , SOURCE )
109
- SINK (myobj .foo ) # $ flow="SOURCE, l:-1 -> myobj.foo"
111
+ # def test_setattr_getattr():
112
+ myobj9 = MyObj (NONSOURCE )
113
+ setattr (myobj9 , "foo" , SOURCE )
114
+ SINK (getattr (myobj9 , "foo" )) # $ flow="SOURCE, l:-1 -> getattr(..)"
110
115
111
116
112
-
113
- myobj = MyObj (NONSOURCE )
114
- setattr (myobj , "foo" , SOURCE )
115
- SINK (getattr (myobj , "foo" )) # $ flow="SOURCE, l:-1 -> getattr(..)"
116
-
117
-
118
-
119
- myobj = MyObj (NONSOURCE )
120
- setattr (myobj , "foo" , SOURCE )
121
- setattr (myobj , "foo" , NONSOURCE )
122
- SINK_F (getattr (myobj , "foo" ))
123
-
117
+ # def test_setattr_getattr_overwrite():
118
+ myobj10 = MyObj (NONSOURCE )
119
+ setattr (myobj10 , "foo" , SOURCE )
120
+ setattr (myobj10 , "foo" , NONSOURCE )
121
+ SINK_F (getattr (myobj10 , "foo" ))
124
122
125
123
124
+ # def test_constructor_assign():
126
125
obj2 = MyObj (SOURCE )
127
126
SINK (obj2 .foo ) # $ flow="SOURCE, l:-1 -> obj2.foo"
128
127
129
128
130
-
129
+ # def test_constructor_assign_kw():
131
130
obj3 = MyObj (foo = SOURCE )
132
131
SINK (obj3 .foo ) # $ flow="SOURCE, l:-1 -> obj3.foo"
133
132
134
133
135
-
136
134
def fields_with_local_flow (x ):
137
- obj = MyObj (x )
138
- a = obj .foo
139
- return a
135
+ obj0 = MyObj (x )
136
+ a0 = obj0 .foo
137
+ return a0
140
138
139
+ # def test_fields():
141
140
SINK (fields_with_local_flow (SOURCE )) # $ flow="SOURCE -> fields_with_local_flow(..)"
142
141
143
142
# ------------------------------------------------------------------------------
@@ -151,17 +150,19 @@ def __init__(self):
151
150
def getObj (self ):
152
151
return self .obj
153
152
154
- x = SOURCE
155
- a = NestedObj ()
156
- a .obj .foo = x
157
- SINK (a .obj .foo ) # $ flow="SOURCE, l:-3 -> a.obj.foo"
158
153
154
+ # def test_nested_obj():
155
+ x1 = SOURCE
156
+ a1 = NestedObj ()
157
+ a1 .obj .foo = x1
158
+ SINK (a1 .obj .foo ) # $ flow="SOURCE, l:-3 -> a1.obj.foo"
159
159
160
160
161
- x = SOURCE
162
- a = NestedObj ()
163
- a .getObj ().foo = x
164
- SINK (a .obj .foo ) # $ flow="SOURCE, l:-3 -> a.obj.foo"
161
+ # def test_nested_obj_method():
162
+ x2 = SOURCE
163
+ a2 = NestedObj ()
164
+ a2 .getObj ().foo = x2
165
+ SINK (a2 .obj .foo ) # $ flow="SOURCE, l:-3 -> a2.obj.foo"
165
166
166
167
# ------------------------------------------------------------------------------
167
168
# Global scope interaction
0 commit comments