Skip to content

Commit faaa63a

Browse files
committed
Python: Ensure no cross-talk in global tests
By giving all variables unique names I also added a comment with the function name from the normal tests, so its' easily visible what these tests are testing
1 parent 0642610 commit faaa63a

File tree

1 file changed

+64
-63
lines changed

1 file changed

+64
-63
lines changed

python/ql/test/experimental/dataflow/fieldflow/test_global.py

Lines changed: 64 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
7675
cond = eval("False")
7776

78-
myobj = MyObj(NONSOURCE)
79-
myobj.foo = SOURCE
77+
myobj5 = MyObj(NONSOURCE)
78+
myobj5.foo = SOURCE
8079
if 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
9190
if cond:
92-
myobj.foo = NONSOURCE
93-
SINK_F(myobj.foo)
91+
myobj6.foo = NONSOURCE
92+
SINK_F(myobj6.foo)
9493
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)
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():
126125
obj2 = MyObj(SOURCE)
127126
SINK(obj2.foo) # $ flow="SOURCE, l:-1 -> obj2.foo"
128127

129128

130-
129+
# def test_constructor_assign_kw():
131130
obj3 = MyObj(foo=SOURCE)
132131
SINK(obj3.foo) # $ flow="SOURCE, l:-1 -> obj3.foo"
133132

134133

135-
136134
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
140138

139+
# def test_fields():
141140
SINK(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

Comments
 (0)