Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dfdfd3c

Browse files
committed
Python: FIx flow
1 parent 6dc0d69 commit dfdfd3c

3 files changed

Lines changed: 82 additions & 10 deletions

File tree

python/ql/src/semmle/python/dataflow/new/internal/DataFlowPrivate.qll

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1173,7 +1173,7 @@ module unpackinAssignment {
11731173
}
11741174

11751175
predicate unpackingAssignmentElementReadStep(Node nodeFrom, Content c, Node nodeTo) {
1176-
exists(UnpackingAssignmentTarget target, int index, ControlFlowNode element |
1176+
exists(UnpackingAssignmentTarget target, int index, ControlFlowNode element, boolean precise |
11771177
target instanceof SequenceNode
11781178
|
11791179
nodeFrom.asCfgNode() = target and
@@ -1183,16 +1183,24 @@ module unpackinAssignment {
11831183
c instanceof ListElementContent
11841184
or
11851185
target instanceof TupleNode and
1186-
c.(TupleElementContent).getIndex() = index
1186+
if precise = true
1187+
then c.(TupleElementContent).getIndex() = index
1188+
else c instanceof TupleElementContent // This could get big if big tuples exist
11871189
) and
11881190
(
11891191
if element instanceof SequenceNode
1190-
then nodeTo = TIterableSequence(element)
1192+
then
1193+
nodeTo = TIterableSequence(element) and
1194+
precise = true
11911195
else
11921196
if element.getNode() instanceof Starred
1193-
then nodeTo = TIterableElement(element)
1194-
else
1195-
nodeTo.asVar().getDefinition().(MultiAssignmentDefinition).getDefiningNode() = element
1197+
then
1198+
nodeTo = TIterableElement(element) and
1199+
precise = false
1200+
else (
1201+
nodeTo.asVar().getDefinition().(MultiAssignmentDefinition).getDefiningNode() = element and
1202+
precise = true
1203+
)
11961204
)
11971205
)
11981206
}

0 commit comments

Comments
 (0)