@@ -39,33 +39,55 @@ def setFoo(self, foo):
39
39
self .foo = foo
40
40
41
41
def setFoo (obj , x ):
42
- SINK_F (obj .foo )
43
42
obj .foo = x
44
43
45
- @expects (2 ) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..)
44
+
45
+ @expects (3 ) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..)
46
46
def test_indirect_assign ():
47
- myobj = MyObj ("OK" )
47
+ myobj = MyObj (NONSOURCE )
48
+ SINK_F (myobj .foo )
48
49
49
50
setFoo (myobj , SOURCE )
50
51
SINK (myobj .foo ) # $ flow="SOURCE, l:-1 -> myobj.foo"
51
52
53
+ setFoo (myobj , NONSOURCE )
54
+ SINK_F (myobj .foo ) # $ SPURIOUS: flow="SOURCE, l:-4 -> myobj.foo"
52
55
56
+
57
+ @expects (3 ) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..)
53
58
def test_indirect_assign_method ():
54
- myobj = MyObj ("OK" )
59
+ myobj = MyObj (NONSOURCE )
60
+ SINK_F (myobj .foo )
55
61
56
62
myobj .setFoo (SOURCE )
57
63
SINK (myobj .foo ) # $ flow="SOURCE, l:-1 -> myobj.foo"
58
64
65
+ myobj .setFoo (NONSOURCE )
66
+ SINK_F (myobj .foo ) # $ SPURIOUS: flow="SOURCE, l:-4 -> myobj.foo"
59
67
60
- def test_direct_assign ():
68
+
69
+ @expects (3 ) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..)
70
+ def test_indirect_assign_bound_method ():
61
71
myobj = MyObj (NONSOURCE )
62
- myobj .foo = SOURCE
63
- SINK (myobj .foo ) # $ flow="SOURCE, l:-1 -> myobj.foo"
72
+ SINK_F (myobj .foo )
73
+
74
+ sf = myobj .setFoo
64
75
76
+ sf (SOURCE )
77
+ SINK (myobj .foo ) # $ MISSING: flow="SOURCE, l:-1 -> myobj.foo"
65
78
66
- def test_direct_assign_overwrite ():
79
+ sf (NONSOURCE )
80
+ SINK_F (myobj .foo )
81
+
82
+
83
+ @expects (3 ) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..)
84
+ def test_direct_assign ():
67
85
myobj = MyObj (NONSOURCE )
86
+ SINK_F (myobj .foo )
87
+
68
88
myobj .foo = SOURCE
89
+ SINK (myobj .foo ) # $ flow="SOURCE, l:-1 -> myobj.foo"
90
+
69
91
myobj .foo = NONSOURCE
70
92
SINK_F (myobj .foo )
71
93
@@ -160,40 +182,6 @@ def test_nested_obj_method():
160
182
a .getObj ().foo = x
161
183
SINK (a .obj .foo ) # $ flow="SOURCE, l:-3 -> a.obj.foo"
162
184
163
- # ------------------------------------------------------------------------------
164
- # Bound Method calls
165
- # ------------------------------------------------------------------------------
166
-
167
- class Foo :
168
- def __init__ (self , x ):
169
- self .x = x
170
-
171
- def update_x (self , x ):
172
- self .x = x
173
-
174
- @expects (7 ) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..)
175
- def test_bound_method_call ():
176
- # direct assignment
177
- foo = Foo (None )
178
- SINK_F (foo .x )
179
- foo .x = SOURCE
180
- SINK (foo .x ) # $ flow="SOURCE, l:-1 -> foo.x"
181
- foo .x = None
182
- SINK_F (foo .x )
183
-
184
- # assignment through function
185
- foo = Foo (SOURCE )
186
- SINK (foo .x ) # $ flow="SOURCE, l:-1 -> foo.x"
187
- foo .update_x (None )
188
- SINK_F (foo .x ) # $ flow="SOURCE, l:-3 -> foo.x"
189
-
190
- # assignment through bound-method calls
191
- foo = Foo (SOURCE )
192
- ux = foo .update_x
193
- SINK (foo .x ) # $ flow="SOURCE, l:-2 -> foo.x"
194
- ux (None )
195
- SINK_F (foo .x ) # $ SPURIOUS: flow="SOURCE, l:-4 -> foo.x"
196
-
197
185
198
186
# ------------------------------------------------------------------------------
199
187
# Crosstalk test -- using different function based on conditional
0 commit comments