Skip to content

Commit db1499d

Browse files
committed
Python: Add test for variable reference in list comprehension
1 parent fab6813 commit db1499d

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

python/ql/test/experimental/dataflow/coverage/localFlow.expected

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
| test.py:42:10:42:26 | ControlFlowNode for Tuple | test.py:42:5:42:5 | SSA variable x |
66
| test.py:43:5:43:5 | SSA variable y | test.py:44:10:44:10 | ControlFlowNode for y |
77
| test.py:43:9:43:12 | ControlFlowNode for Subscript | test.py:43:5:43:5 | SSA variable y |
8-
| test.py:187:1:187:53 | GSSA Variable SINK | test.py:189:5:189:8 | ControlFlowNode for SINK |
9-
| test.py:187:1:187:53 | GSSA Variable SOURCE | test.py:188:25:188:30 | ControlFlowNode for SOURCE |
10-
| test.py:188:5:188:5 | SSA variable x | test.py:189:10:189:10 | ControlFlowNode for x |
11-
| test.py:188:9:188:68 | ControlFlowNode for .0 | test.py:188:9:188:68 | SSA variable .0 |
12-
| test.py:188:9:188:68 | ControlFlowNode for ListComp | test.py:188:5:188:5 | SSA variable x |
13-
| test.py:188:9:188:68 | SSA variable .0 | test.py:188:9:188:68 | ControlFlowNode for .0 |
14-
| test.py:188:16:188:16 | SSA variable v | test.py:188:45:188:45 | ControlFlowNode for v |
15-
| test.py:188:40:188:40 | SSA variable u | test.py:188:56:188:56 | ControlFlowNode for u |
16-
| test.py:188:51:188:51 | SSA variable z | test.py:188:67:188:67 | ControlFlowNode for z |
17-
| test.py:188:62:188:62 | SSA variable y | test.py:188:10:188:10 | ControlFlowNode for y |
8+
| test.py:208:1:208:53 | GSSA Variable SINK | test.py:210:5:210:8 | ControlFlowNode for SINK |
9+
| test.py:208:1:208:53 | GSSA Variable SOURCE | test.py:209:25:209:30 | ControlFlowNode for SOURCE |
10+
| test.py:209:5:209:5 | SSA variable x | test.py:210:10:210:10 | ControlFlowNode for x |
11+
| test.py:209:9:209:68 | ControlFlowNode for .0 | test.py:209:9:209:68 | SSA variable .0 |
12+
| test.py:209:9:209:68 | ControlFlowNode for ListComp | test.py:209:5:209:5 | SSA variable x |
13+
| test.py:209:9:209:68 | SSA variable .0 | test.py:209:9:209:68 | ControlFlowNode for .0 |
14+
| test.py:209:16:209:16 | SSA variable v | test.py:209:45:209:45 | ControlFlowNode for v |
15+
| test.py:209:40:209:40 | SSA variable u | test.py:209:56:209:56 | ControlFlowNode for u |
16+
| test.py:209:51:209:51 | SSA variable z | test.py:209:67:209:67 | ControlFlowNode for z |
17+
| test.py:209:62:209:62 | SSA variable y | test.py:209:10:209:10 | ControlFlowNode for y |

python/ql/test/experimental/dataflow/coverage/test.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,27 @@ def test_nested_list_display():
120120
SINK(x[0]) #$ MISSING:flow="SOURCE, l:-1 -> x[0]"
121121

122122

123+
@expects(6)
124+
def test_list_comprehension_with_tuple_result():
125+
# confirms that this simple case works as expected
126+
t = (SOURCE, NONSOURCE)
127+
SINK(t[0]) # $ flow="SOURCE, l:-1 -> t[0]"
128+
SINK_F(t[1])
129+
130+
# confirms that this simple case works as expected
131+
l1 = [(SOURCE, NONSOURCE) for _ in [1]]
132+
SINK(l1[0][0]) # $ flow="SOURCE, l:-1 -> l1[0][0]"
133+
SINK_F(l1[0][1])
134+
135+
# stops working when using reference to variable, due to variables being captured by
136+
# the function we internally generate for the comprehension body.
137+
s = SOURCE
138+
ns = NONSOURCE
139+
l3 = [(s, ns) for _ in [1]]
140+
SINK(l3[0][0]) # $ MISSING: flow="SOURCE, l:-3 -> l3[0][0]"
141+
SINK_F(l3[0][1])
142+
143+
123144
# 6.2.6. Set displays
124145
def test_set_display():
125146
x = {SOURCE}

0 commit comments

Comments
 (0)