@@ -44,100 +44,99 @@ def setFoo(obj, x):
4444 SINK_F (obj .foo )
4545 obj .foo = x
4646
47+ # def test_indirect_assign():
48+ myobj1 = MyObj ("OK" )
49+ setFoo (myobj1 , SOURCE )
50+ SINK (myobj1 .foo ) # $ flow="SOURCE, l:-1 -> myobj1.foo"
4751
48- myobj = MyObj ("OK" )
4952
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"
5257
5358
59+ # def test_direct_assign():
60+ myobj3 = MyObj (NONSOURCE )
61+ myobj3 .foo = SOURCE
62+ SINK (myobj3 .foo ) # $ flow="SOURCE, l:-1 -> myobj3.foo"
5463
55- myobj = MyObj ("OK" )
5664
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 )
7270
71+ # def test_direct_if_assign(cond = False):
7372
7473# this way, our analysis isn't able to understand that `cond` is just False,
7574# and therefore isn't able to determine that the if below will not hold.
7675cond = eval ("False" )
7776
78- myobj = MyObj (NONSOURCE )
79- myobj .foo = SOURCE
77+ myobj5 = MyObj (NONSOURCE )
78+ myobj5 .foo = SOURCE
8079if cond :
81- myobj .foo = NONSOURCE
82- SINK_F (myobj .foo )
80+ myobj5 .foo = NONSOURCE
81+ SINK_F (myobj5 .foo )
8382# SPLITTING happens here, so in one version there is flow, and in the other there isn't
8483# 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
8785
8886
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
9190if cond :
92- myobj .foo = NONSOURCE
93- SINK_F (myobj .foo )
91+ myobj6 .foo = NONSOURCE
92+ SINK_F (myobj6 .foo )
9493else :
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 )
9897
9998
99+ # def test_getattr():
100+ myobj7 = MyObj (NONSOURCE )
101+ myobj7 .foo = SOURCE
102+ SINK (getattr (myobj7 , "foo" )) # $ flow="SOURCE, l:-1 -> getattr(..)"
100103
101- myobj = MyObj (NONSOURCE )
102- myobj .foo = SOURCE
103- SINK (getattr (myobj , "foo" )) # $ flow="SOURCE, l:-1 -> getattr(..)"
104104
105+ # def test_setattr():
106+ myobj8 = MyObj (NONSOURCE )
107+ setattr (myobj8 , "foo" , SOURCE )
108+ SINK (myobj8 .foo ) # $ flow="SOURCE, l:-1 -> myobj8.foo"
105109
106110
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(..)"
110115
111116
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" ))
124122
125123
124+ # def test_constructor_assign():
126125obj2 = MyObj (SOURCE )
127126SINK (obj2 .foo ) # $ flow="SOURCE, l:-1 -> obj2.foo"
128127
129128
130-
129+ # def test_constructor_assign_kw():
131130obj3 = MyObj (foo = SOURCE )
132131SINK (obj3 .foo ) # $ flow="SOURCE, l:-1 -> obj3.foo"
133132
134133
135-
136134def 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
140138
139+ # def test_fields():
141140SINK (fields_with_local_flow (SOURCE )) # $ flow="SOURCE -> fields_with_local_flow(..)"
142141
143142# ------------------------------------------------------------------------------
@@ -151,17 +150,19 @@ def __init__(self):
151150 def getObj (self ):
152151 return self .obj
153152
154- x = SOURCE
155- a = NestedObj ()
156- a .obj .foo = x
157- SINK (a .obj .foo ) # $ flow="SOURCE, l:-3 -> a.obj.foo"
158153
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"
159159
160160
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"
165166
166167# ------------------------------------------------------------------------------
167168# Global scope interaction
0 commit comments