Skip to content

Commit ecf3928

Browse files
committed
Python: Handle comprehensions with multiple fors
1 parent 1cdb6be commit ecf3928

File tree

4 files changed

+270
-186
lines changed

4 files changed

+270
-186
lines changed

python/ql/src/experimental/dataflow/internal/DataFlowPrivate.qll

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -437,16 +437,13 @@ predicate comprehensionReadStep(CfgNode nodeFrom, Content c, EssaNode nodeTo) {
437437
// c denotes element of list or set
438438
exists(Comp comp |
439439
// outermost for
440-
exists(For f |
441-
f = getCompFor(comp) and
442-
nodeFrom.getNode().getNode() = getCompIter(comp) and
443-
nodeTo.getVar().getDefinition().(AssignmentDefinition).getDefiningNode().getNode() =
444-
f.getTarget()
445-
)
440+
nodeFrom.getNode().getNode() = comp.getIterable() and
441+
nodeTo.getVar().getDefinition().(AssignmentDefinition).getDefiningNode().getNode() =
442+
comp.getIterationVariable(0).getAStore()
446443
or
447444
// an inner for
448-
exists(int n |
449-
nodeFrom.getNode().getNode() = comp.getNthInnerLoop(n + 1).getIter() and
445+
exists(int n | n > 0 |
446+
nodeFrom.getNode().getNode() = comp.getNthInnerLoop(n).getIter() and
450447
nodeTo.getVar().getDefinition().(AssignmentDefinition).getDefiningNode().getNode() =
451448
comp.getNthInnerLoop(n).getTarget()
452449
)

0 commit comments

Comments
 (0)