@@ -57,6 +57,59 @@ def test_indirect_assign_method():
5757 SINK (myobj .foo ) # $ MISSING: flow
5858
5959
60+ def test_direct_assign ():
61+ myobj = MyObj (NONSOURCE )
62+ myobj .foo = SOURCE
63+ SINK (myobj .foo ) # $ flow="SOURCE, l:-1 -> myobj.foo"
64+
65+
66+ def test_direct_assign_overwrite ():
67+ myobj = MyObj (NONSOURCE )
68+ myobj .foo = SOURCE
69+ myobj .foo = NONSOURCE
70+ SINK_F (myobj .foo ) # $ SPURIOUS: flow="SOURCE, l:-2 -> myobj.foo"
71+
72+
73+ def test_direct_if_assign (cond = False ):
74+ myobj = MyObj (NONSOURCE )
75+ myobj .foo = SOURCE
76+ if cond :
77+ myobj .foo = NONSOURCE
78+ SINK_F (myobj .foo ) # $ SPURIOUS: flow="SOURCE, l:-3 -> myobj.foo"
79+ SINK (myobj .foo ) # $ flow="SOURCE, l:-4 -> myobj.foo"
80+
81+
82+ @expects (2 )
83+ def test_direct_if_always_assign (cond = True ):
84+ myobj = MyObj (NONSOURCE )
85+ myobj .foo = SOURCE
86+ if cond :
87+ myobj .foo = NONSOURCE
88+ SINK_F (myobj .foo ) # $ SPURIOUS: flow="SOURCE, l:-3 -> myobj.foo"
89+ else :
90+ myobj .foo = NONSOURCE
91+ SINK_F (myobj .foo ) # $ SPURIOUS: flow="SOURCE, l:-6 -> myobj.foo"
92+ SINK_F (myobj .foo ) # $ SPURIOUS: flow="SOURCE, l:-7 -> myobj.foo"
93+
94+
95+ def test_getattr ():
96+ myobj = MyObj (NONSOURCE )
97+ myobj .foo = SOURCE
98+ SINK (getattr (myobj , "foo" )) # $ MISSING: flow
99+
100+
101+ def test_setattr ():
102+ myobj = MyObj (NONSOURCE )
103+ setattr (myobj , "foo" , SOURCE )
104+ SINK (myobj .foo ) # $ MISSING: flow
105+
106+
107+ def test_setattr_getattr ():
108+ myobj = MyObj (NONSOURCE )
109+ setattr (myobj , "foo" , SOURCE )
110+ SINK (getattr (myobj , "foo" )) # $ MISSING: flow
111+
112+
60113def test_constructor_assign ():
61114 obj = MyObj (SOURCE )
62115 SINK (obj .foo ) # $ flow="SOURCE, l:-1 -> obj.foo"
0 commit comments