@@ -57,6 +57,59 @@ def test_indirect_assign_method():
57
57
SINK (myobj .foo ) # $ MISSING: flow
58
58
59
59
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
+
60
113
def test_constructor_assign ():
61
114
obj = MyObj (SOURCE )
62
115
SINK (obj .foo ) # $ flow="SOURCE, l:-1 -> obj.foo"
0 commit comments