Python: big refactor and fix tests

Make sure tests are valid
Fix wrong test annotations
Big refactor to make code readable
Big comment to explain code
This commit is contained in:
Rasmus Lerchedahl Petersen
2021-01-13 18:33:08 +01:00
parent b2d95e617d
commit 36a4a5081e
4 changed files with 302 additions and 413 deletions

View File

@@ -127,9 +127,14 @@ module EssaFlow {
nodeTo.(EssaNode).getVar().getDefinition().(AssignmentDefinition).getValue()
or
// Definition
// `a, b = iterable`
// `[a, b] = iterable`
// nodeFrom = `iterable`, cfg node
// nodeTo = `a, b`, cfg node
// nodeTo = `TIterableSequence([a, b])`
exists(UnpackingAssignmentDirectTarget target |
nodeFrom.asExpr() = target.getValue() and
nodeTo = TIterableSequence(target)
)
or
exists(Assign assign, SequenceNode target | target.getNode() = assign.getATarget() |
nodeFrom.asExpr() = assign.getValue() and
nodeTo.asCfgNode() = target
@@ -170,7 +175,7 @@ module EssaFlow {
// If expressions
nodeFrom.asCfgNode() = nodeTo.asCfgNode().(IfExprNode).getAnOperand()
or
unpackingAssignmentDirectFlowStep(nodeFrom, nodeTo)
unpackingAssignmentFlowStep(nodeFrom, nodeTo)
or
// Overflow keyword argument
exists(CallNode call, CallableValue callable |
@@ -1023,115 +1028,117 @@ predicate subscriptReadStep(CfgNode nodeFrom, Content c, CfgNode nodeTo) {
)
}
/**
* The unpacking assignment takes the general form
* ```python
* sequence = iterable
* ```
* where `sequence` is either a tuple or a list and it can contain wildcards.
* The iterable can be any iterable, which means that content will need to change type
* if it should be transferred from the LHS to the RHS.
*
* We may for instance have
* ```python
* (a, b) = ["a", "tainted string"] # RHS has content `ListElement`
* ```
* Due to the abstraction for list content, we do not know whether `"tainted string"`
* ends up in `a` or in `b`, so we want to overapproximate and see it in both.
*
* Using wildcards we may have
* ```python
* (a, *b) = ("a", "b", "tainted string") # RHS has content `TupleElement(2)`
* ```
* Since the starred variables are always assigned type list, `*b` will be
* `["b", "tainted string]`, and we will agsin overapproximate and assign it
* content corresponding to anything found in the RHS.
*
* For a precise transfer
* ```python
* (a, b) = ("a", "tainted string") # RHS has content `TupleElement(1)`
* ```
* we wish to keep the precision, so only `b` receives the tuple content at index 1.
*
* Finally, `sequence` is actually a pattern and can have a more complicated structure,
* such as
* ```python
* (a, [b, *c]) = ("a", ("tainted string", "c")) # RHS has content `TupleElement(1); TupleElement(0)`
* ```
* where `a` should not receive content, but `b` and `c` should. `c` will be `["c"]` so
* should have the content converted and transferred, while `b` should read it.
*
* The strategy for converting content type is to break the transfer up into a read step
* and a store step, together creating a converting transfer step.
* For this we need a synthetic node in the middle, which we call `TIterableElement(receiver)`.
* It is associated with the receiver of the transfer, because we know the receiver type from the syntax.
* Since we sometimes need a converting read step (in the example above, `[b, *c]` reads the content
* `TupleElement(0)` but should have content `ListElement`), we actually need a second synthetic node.
* A converting read step is a read step followed by a converting transfer.
* We can have a uniform treatment by always having two synthetic nodes and so we can view it as
* two stages of the same node. So we read into (or transfer to) `TIterableSequence(receiver)`,
* from which we take a read step to `TIterableElement(receiver)` and then a store step to `receiver`.
* In order to preserve precise content, we also take a flow step from `TIterableSequence(receiver)`
* directly to `receiver`.
*
* The strategy is then via several read-, store-, and flow steps:
* 1. [Flow] Content is transferred from `iterable` to `TIterableSequence(sequence)` via a
* flow step. From here, everything happens on the LHS.
*
* 1. [Flow] Content is transferred from `TIterableSequence(sequence)` to `sequence` via a
* flow step.
*
* 1. [Read] Content is read from `TIterableSequence(sequence)` into `TIterableElement(sequence)`.
* If `sequence` is of type tuple, we will not read tuple content as that would allow
* cross talk.
*
* 1. [Store] Content is stored from `TIterableElement(sequence)` to `sequence`.
* Here the content type is chosen according to the type of sequence.
*
* 1. [Read] Content is read from `sequence` to its elements according to the type of `sequence`.
* If the element is a plain variable, the target is the corresponding essa node.
* If the element is itelf a sequence, with control-flow node `seq`, the target is `TIterableSequence(seq)`.
* If the element is a starred variable, with control-flow node `v`, the target is `TIterableElement(v)`.
*
* 1. [Store] Content is stored from `TIterableElement(v)` to the essa variable for `v`, with
* content type `ListElement`.
*
* 1. [Flow, Read, Store] The last 5 steps are repeated for all recursive elements which are sequences.
*/
module unpackinAssignment {
/** Data flows from an iterable to an assigned variable. */
predicate unpackingAssignmentReadStep(CfgNode nodeFrom, Content c, Node nodeTo) {
unpackingAssignmentToplevelReadStep(nodeFrom, c, nodeTo)
or
unpackingAssignmentInternalReadStep(nodeFrom, c, nodeTo)
or
unpackingAssignmentConvertingReadStep(nodeFrom, c, nodeTo)
or
unpackingAssignmentConvertingInternalReadStep(nodeFrom, c, nodeTo)
/** A direct (or top-level) target of an unpacking assignment */
class UnpackingAssignmentDirectTarget extends ControlFlowNode {
Expr value;
UnpackingAssignmentDirectTarget() {
this instanceof SequenceNode and
exists(Assign assign | this.getNode() = assign.getATarget() | value = assign.getValue())
}
Expr getValue() { result = value }
}
predicate unpackingAssignmentStoreStep(Node nodeFrom, Content c, CfgNode nodeTo) {
unpackingAssignmentConvertingStoreStep(nodeFrom, c, nodeTo)
or
unpackingAssignmentConvertingInternalStoreStep(nodeFrom, c, nodeTo)
/** A (possibly recursive) target of an unpacking assignment */
class UnpackingAssignmentTarget extends ControlFlowNode {
UnpackingAssignmentTarget() {
this instanceof UnpackingAssignmentDirectTarget
or
exists(UnpackingAssignmentTarget parent | this = parent.getAnElement())
}
ControlFlowNode getElement(int i) { result = this.(SequenceNode).getElement(i) }
ControlFlowNode getAnElement() { result = this.getElement(_) }
}
predicate unpackingAssignmentRead(CfgNode nodeFrom, Content c, ControlFlowNode readNode) {
// `a, b = iterable`
// nodeFrom = `a, b`
// readNode = `a`
// c is compatible with type of `a, b` (so tuple if it was `(a, b)`)
exists(Assign assign, SequenceNode target, int index | target.getNode() = assign.getATarget() |
nodeFrom.getNode() = target and
readNode = target.getElement(index) and
(
target instanceof ListNode and
c instanceof ListElementContent
or
target instanceof TupleNode and
c.(TupleElementContent).getIndex() = index
)
predicate unpackingAssignmentFlowStep(Node nodeFrom, Node nodeTo) {
exists(UnpackingAssignmentTarget target | target instanceof SequenceNode |
nodeFrom = TIterableSequence(target) and
nodeTo.asCfgNode() = target
)
}
predicate unpackingAssignmentInternalReadStep(CfgNode nodeFrom, Content c, Node nodeTo) {
// iterable unpacking
// `a, (b, (c, d)) = iterable`
// nodeFrom is `(b, (c, d))`, cfg node
// nodeTo is `b`, essa var
// or `(c, d)`, cfg node
// c is compatible with `b`s (or `(c, d)`s) index
exists(
Assign assign, SequenceNode target, SequenceNode readFrom, int index, ControlFlowNode readTo
|
target.getNode() = assign.getATarget() and
readFrom = target.getAnElement() // use contains to get deeper nesting
|
nodeFrom.getNode() = readFrom and
readTo = readFrom.getElement(index) and
(
readTo instanceof SequenceNode and
nodeTo.asCfgNode() = readTo
or
not readTo instanceof SequenceNode and
nodeTo.asVar().getDefinition().(MultiAssignmentDefinition).getDefiningNode() = readTo
) and
(
readFrom instanceof ListNode and
c instanceof ListElementContent
or
readFrom instanceof TupleNode and
c.(TupleElementContent).getIndex() = index
)
)
}
/** Data flows from an iterable to an assigned variable. */
predicate unpackingAssignmentToplevelReadStep(CfgNode nodeFrom, Content c, Node nodeTo) {
// iterable unpacking
// `a, (b, c) = iterable`
// nodeFrom is `a, (b, c)`, cfg node
// nodeTo is `a`, essa var
// or `(b, c)`, cfg node
// c is compatible with `a`s (or `(b, c)`s) index
exists(ControlFlowNode readNode | unpackingAssignmentRead(nodeFrom, c, readNode) |
(
readNode instanceof SequenceNode and
nodeTo.asCfgNode() = readNode
or
not readNode instanceof SequenceNode and
nodeTo.asVar().getDefinition().(MultiAssignmentDefinition).getDefiningNode() = readNode
)
)
or
unpackingAssignmentInternalReadStep(nodeFrom, c, nodeTo)
}
predicate unpackingAssignmentDirectFlowStep(CfgNode nodeFrom, CfgNode nodeTo) {
// `a, *b = iterable`
// nodeFrom = `a, b`
// nodeTo = `*b`
exists(Assign assign, SequenceNode target | target.getNode() = assign.getATarget() |
nodeFrom.getNode() = target and
nodeTo.getNode() = target.getAnElement() and
nodeTo.asExpr() instanceof Starred
)
}
predicate unpackingAssignmentConvertingReadStep(CfgNode nodeFrom, Content c, Node nodeTo) {
// iterable unpacking
// `a, b = iterable`
// nodeFrom is `iterable`
// nodeTo is synthetic IterableElement
// c is whatever element content `iterable` might carry
// we wish to consume c, so that we can later write it back in the type of the lhs.
exists(Assign assign, SequenceNode target | target.getNode() = assign.getATarget() |
nodeFrom.asExpr() = assign.getValue() and
predicate unpackingAssignmentConvertingReadStep(Node nodeFrom, Content c, Node nodeTo) {
exists(UnpackingAssignmentTarget target | target instanceof SequenceNode |
nodeFrom = TIterableSequence(target) and
nodeTo = TIterableElement(target) and
(
c instanceof ListElementContent
@@ -1149,15 +1156,10 @@ module unpackinAssignment {
)
}
predicate unpackingAssignmentConvertingStoreStep(Node nodeFrom, Content c, CfgNode nodeTo) {
// iterable unpacking
// `a, b = iterable`
// nodeFrom is synthetic IterableElement
// nodeTo is `a, b`
// c is consistent with the type of the lhs.
exists(Assign assign, SequenceNode target | target.getNode() = assign.getATarget() |
predicate unpackingAssignmentConvertingStoreStep(Node nodeFrom, Content c, Node nodeTo) {
exists(UnpackingAssignmentTarget target | target instanceof SequenceNode |
nodeFrom = TIterableElement(target) and
nodeTo.getNode() = target and
nodeTo.asCfgNode() = target and
(
target instanceof ListNode and
c instanceof ListElementContent
@@ -1170,47 +1172,51 @@ module unpackinAssignment {
)
}
predicate unpackingAssignmentConvertingInternalReadStep(CfgNode nodeFrom, Content c, Node nodeTo) {
exists(Assign assign, SequenceNode target, SequenceNode readFrom |
target.getNode() = assign.getATarget() and
readFrom = target.getAnElement() // use contains to get deeper nesting
predicate unpackingAssignmentElementReadStep(Node nodeFrom, Content c, Node nodeTo) {
exists(UnpackingAssignmentTarget target, int index, ControlFlowNode element |
target instanceof SequenceNode
|
nodeFrom.getNode() = readFrom and
nodeTo = TIterableElement(readFrom) and
nodeFrom.asCfgNode() = target and
element = target.getElement(index) and
(
target instanceof ListNode and
c instanceof ListElementContent
or
c instanceof SetElementContent
or
// do not lose precision by routing tuple content through the `IterableElement`
not readFrom instanceof TupleNode and
// `index` refers to `nodeFrom`, but only the ones in `target` are relevant.
exists(int index | exists(readFrom.getElement(index)) |
c.(TupleElementContent).getIndex() = index
)
// leaving out dict content for now
target instanceof TupleNode and
c.(TupleElementContent).getIndex() = index
) and
(
if element instanceof SequenceNode
then nodeTo = TIterableSequence(element)
else
if element.getNode() instanceof Starred
then nodeTo = TIterableElement(element)
else
nodeTo.asVar().getDefinition().(MultiAssignmentDefinition).getDefiningNode() = element
)
)
}
predicate unpackingAssignmentConvertingInternalStoreStep(Node nodeFrom, Content c, CfgNode nodeTo) {
exists(Assign assign, SequenceNode target, SequenceNode readFrom |
target.getNode() = assign.getATarget() and
readFrom = target.getAnElement() // use contains to get deeper nesting
|
nodeFrom = TIterableElement(readFrom) and
nodeTo.getNode() = readFrom and
(
readFrom instanceof ListNode and
c instanceof ListElementContent
or
readFrom instanceof TupleNode and
exists(int index | exists(readFrom.getElement(index)) |
c.(TupleElementContent).getIndex() = index
)
)
predicate unpackingAssignmentStarredElementStoreStep(Node nodeFrom, Content c, Node nodeTo) {
exists(ControlFlowNode starred | starred.getNode() instanceof Starred |
nodeFrom = TIterableElement(starred) and
nodeTo.asVar().getDefinition().(MultiAssignmentDefinition).getDefiningNode() = starred and
c instanceof ListElementContent
)
}
/** Data flows from an iterable to an assigned variable. */
predicate unpackingAssignmentReadStep(Node nodeFrom, Content c, Node nodeTo) {
unpackingAssignmentElementReadStep(nodeFrom, c, nodeTo)
or
unpackingAssignmentConvertingReadStep(nodeFrom, c, nodeTo)
}
predicate unpackingAssignmentStoreStep(Node nodeFrom, Content c, Node nodeTo) {
unpackingAssignmentStarredElementStoreStep(nodeFrom, c, nodeTo)
or
unpackingAssignmentConvertingStoreStep(nodeFrom, c, nodeTo)
}
}
import unpackinAssignment

View File

@@ -61,17 +61,15 @@ newtype TNode =
TKwUnpacked(CallNode call, CallableValue callable, string name) {
call_unpacks(call, _, callable, name, _)
} or
/**
* A synthetic node representing that an iterable sequence flows to consumer.
*/
TIterableSequence(UnpackingAssignmentTarget consumer) { consumer instanceof SequenceNode } or
/**
* A synthetic node representing that there may be an iterable element
* for `consumer` to consume.
*/
TIterableElement(SequenceNode consumer) {
exists(Assign assign, SequenceNode target | target.getNode() = assign.getATarget() |
consumer = target
or
consumer = target.getAnElement() // use containts for deeper nesting
)
}
TIterableElement(UnpackingAssignmentTarget consumer)
/** Helper for `Node::getEnclosingCallable`. */
private DataFlowCallable getCallableScope(Scope s) {
@@ -331,11 +329,25 @@ class KwUnpacked extends Node, TKwUnpacked {
}
/**
* A synthetic node representing an iterable element. Use for changing content type
* A synthetic node representing an iterable sequence. Used for changing content type
* for instance from a `ListElement` to a `TupleElement`.
*/
class IterableSequence extends Node, TIterableSequence {
SequenceNode consumer;
IterableSequence() { this = TIterableSequence(consumer) }
override string toString() { result = "IterableSequence" }
override Location getLocation() { result = consumer.getLocation() }
}
/**
* A synthetic node representing an iterable element. Used for changing content type
* for instance from a `ListElement` to a `TupleElement`.
*/
class IterableElement extends Node, TIterableElement {
SequenceNode consumer;
ControlFlowNode consumer;
IterableElement() { this = TIterableElement(consumer) }

View File

@@ -63,7 +63,7 @@ edges
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:509:9:509:14 | ControlFlowNode for SOURCE |
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:521:10:521:15 | ControlFlowNode for SOURCE |
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:529:10:529:15 | ControlFlowNode for SOURCE |
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:529:30:529:35 | ControlFlowNode for SOURCE |
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:538:13:538:18 | ControlFlowNode for SOURCE |
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:546:10:546:15 | ControlFlowNode for SOURCE |
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:546:18:546:23 | ControlFlowNode for SOURCE |
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:556:12:556:17 | ControlFlowNode for SOURCE |
@@ -194,36 +194,45 @@ edges
| test.py:522:5:522:5 | SSA variable a | test.py:523:10:523:10 | ControlFlowNode for a |
| test.py:522:5:522:8 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:522:5:522:5 | SSA variable a |
| test.py:529:10:529:15 | ControlFlowNode for SOURCE | test.py:529:10:529:36 | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:529:10:529:15 | ControlFlowNode for SOURCE | test.py:529:30:529:35 | ControlFlowNode for SOURCE |
| test.py:529:10:529:36 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:530:5:530:13 | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:529:10:529:36 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 1] | test.py:530:5:530:13 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 1] |
| test.py:529:19:529:35 | ControlFlowNode for Tuple [Tuple element at index 1] | test.py:529:10:529:36 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 1] |
| test.py:529:30:529:35 | ControlFlowNode for SOURCE | test.py:529:19:529:35 | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:530:5:530:5 | SSA variable a | test.py:531:10:531:10 | ControlFlowNode for a |
| test.py:530:5:530:13 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:530:5:530:5 | SSA variable a |
| test.py:530:5:530:13 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 1] | test.py:530:9:530:12 | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:530:9:530:12 | ControlFlowNode for Tuple [Tuple element at index 1] | test.py:530:5:530:13 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 1] |
| test.py:530:9:530:12 | ControlFlowNode for Tuple [Tuple element at index 1] | test.py:530:12:530:12 | SSA variable c |
| test.py:530:12:530:12 | SSA variable c | test.py:533:10:533:10 | ControlFlowNode for c |
| test.py:538:9:538:33 | ControlFlowNode for List [List element, List element, List element, List element] | test.py:539:5:539:14 | IterableSequence [List element, List element, List element, List element] |
| test.py:538:10:538:21 | ControlFlowNode for List [List element, List element, List element] | test.py:538:9:538:33 | ControlFlowNode for List [List element, List element, List element, List element] |
| test.py:538:11:538:20 | ControlFlowNode for List [List element, List element] | test.py:538:10:538:21 | ControlFlowNode for List [List element, List element, List element] |
| test.py:538:12:538:19 | ControlFlowNode for List [List element] | test.py:538:11:538:20 | ControlFlowNode for List [List element, List element] |
| test.py:538:13:538:18 | ControlFlowNode for SOURCE | test.py:538:12:538:19 | ControlFlowNode for List [List element] |
| test.py:539:5:539:11 | ControlFlowNode for List [List element, List element, List element] | test.py:539:5:539:14 | ControlFlowNode for Tuple [Tuple element at index 0, List element, List element, List element] |
| test.py:539:5:539:11 | ControlFlowNode for List [List element, List element, List element] | test.py:539:6:539:10 | IterableSequence [List element, List element] |
| test.py:539:5:539:11 | IterableElement [List element, List element] | test.py:539:5:539:11 | ControlFlowNode for List [List element, List element, List element] |
| test.py:539:5:539:11 | IterableSequence [List element, List element, List element] | test.py:539:5:539:11 | IterableElement [List element, List element] |
| test.py:539:5:539:14 | ControlFlowNode for Tuple [Tuple element at index 0, List element, List element, List element] | test.py:539:5:539:11 | IterableSequence [List element, List element, List element] |
| test.py:539:5:539:14 | IterableElement [List element, List element, List element] | test.py:539:5:539:14 | ControlFlowNode for Tuple [Tuple element at index 0, List element, List element, List element] |
| test.py:539:5:539:14 | IterableSequence [List element, List element, List element, List element] | test.py:539:5:539:14 | IterableElement [List element, List element, List element] |
| test.py:539:6:539:10 | ControlFlowNode for List [List element, List element] | test.py:539:5:539:11 | ControlFlowNode for List [List element, List element, List element] |
| test.py:539:6:539:10 | ControlFlowNode for List [List element, List element] | test.py:539:7:539:9 | IterableSequence [List element] |
| test.py:539:6:539:10 | IterableElement [List element] | test.py:539:6:539:10 | ControlFlowNode for List [List element, List element] |
| test.py:539:6:539:10 | IterableSequence [List element, List element] | test.py:539:6:539:10 | IterableElement [List element] |
| test.py:539:7:539:9 | ControlFlowNode for List [List element] | test.py:539:6:539:10 | ControlFlowNode for List [List element, List element] |
| test.py:539:7:539:9 | ControlFlowNode for List [List element] | test.py:539:8:539:8 | SSA variable a |
| test.py:539:7:539:9 | IterableElement | test.py:539:7:539:9 | ControlFlowNode for List [List element] |
| test.py:539:7:539:9 | IterableSequence [List element] | test.py:539:7:539:9 | IterableElement |
| test.py:539:8:539:8 | SSA variable a | test.py:540:10:540:10 | ControlFlowNode for a |
| test.py:546:10:546:15 | ControlFlowNode for SOURCE | test.py:546:10:546:34 | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:546:10:546:15 | ControlFlowNode for SOURCE | test.py:546:18:546:23 | ControlFlowNode for SOURCE |
| test.py:546:10:546:34 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:547:5:547:12 | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:546:10:546:34 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:547:8:547:9 | ControlFlowNode for Starred [Tuple element at index 0] |
| test.py:546:10:546:34 | ControlFlowNode for Tuple [Tuple element at index 1] | test.py:547:5:547:12 | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:546:18:546:23 | ControlFlowNode for SOURCE | test.py:546:10:546:34 | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:547:5:547:5 | SSA variable a | test.py:548:10:548:10 | ControlFlowNode for a |
| test.py:547:5:547:12 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:547:5:547:5 | SSA variable a |
| test.py:547:5:547:12 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:547:8:547:9 | ControlFlowNode for Starred [Tuple element at index 0] |
| test.py:547:5:547:12 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 0] | test.py:547:8:547:9 | SSA variable b [Tuple element at index 0] |
| test.py:547:5:547:12 | ControlFlowNode for Tuple [Tuple element at index 1] | test.py:547:8:547:9 | SSA variable b |
| test.py:547:8:547:9 | ControlFlowNode for Starred [Tuple element at index 0] | test.py:547:5:547:12 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 0] |
| test.py:547:8:547:9 | SSA variable b | test.py:549:12:549:12 | ControlFlowNode for b |
| test.py:547:8:547:9 | SSA variable b [Tuple element at index 0] | test.py:550:10:550:10 | ControlFlowNode for b [Tuple element at index 0] |
| test.py:550:10:550:10 | ControlFlowNode for b [Tuple element at index 0] | test.py:550:10:550:13 | ControlFlowNode for Subscript |
| test.py:556:10:556:61 | ControlFlowNode for List [List element, List element] | test.py:559:28:559:29 | ControlFlowNode for ll [List element, List element] |
| test.py:547:5:547:12 | ControlFlowNode for Tuple [Tuple element at index 1] | test.py:547:8:547:9 | IterableElement |
| test.py:547:8:547:9 | IterableElement | test.py:547:8:547:9 | SSA variable b [List element] |
| test.py:547:8:547:9 | SSA variable b [List element] | test.py:550:10:550:10 | ControlFlowNode for b [List element] |
| test.py:550:10:550:10 | ControlFlowNode for b [List element] | test.py:550:10:550:13 | ControlFlowNode for Subscript |
| test.py:556:10:556:61 | ControlFlowNode for List [List element, List element] | test.py:559:6:559:23 | IterableSequence [List element, List element] |
| test.py:556:10:556:61 | ControlFlowNode for List [List element, List element] | test.py:567:5:567:24 | ControlFlowNode for List [List element, List element] |
| test.py:556:10:556:61 | ControlFlowNode for List [List element, List element] | test.py:567:28:567:29 | ControlFlowNode for ll [List element, List element] |
| test.py:556:10:556:61 | ControlFlowNode for List [List element, List element] | test.py:575:28:575:29 | ControlFlowNode for ll [List element, List element] |
| test.py:556:10:556:61 | ControlFlowNode for List [List element, List element] | test.py:567:5:567:24 | IterableSequence [List element, List element] |
| test.py:556:10:556:61 | ControlFlowNode for List [List element, List element] | test.py:575:6:575:23 | IterableSequence [List element, List element] |
| test.py:556:11:556:37 | ControlFlowNode for List [List element] | test.py:556:10:556:61 | ControlFlowNode for List [List element, List element] |
| test.py:556:12:556:17 | ControlFlowNode for SOURCE | test.py:556:11:556:37 | ControlFlowNode for List [List element] |
| test.py:556:12:556:17 | ControlFlowNode for SOURCE | test.py:556:31:556:36 | ControlFlowNode for SOURCE |
@@ -232,159 +241,78 @@ edges
| test.py:556:31:556:36 | ControlFlowNode for SOURCE | test.py:556:41:556:46 | ControlFlowNode for SOURCE |
| test.py:556:40:556:47 | ControlFlowNode for List [List element] | test.py:556:10:556:61 | ControlFlowNode for List [List element, List element] |
| test.py:556:41:556:46 | ControlFlowNode for SOURCE | test.py:556:40:556:47 | ControlFlowNode for List [List element] |
| test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, List element] | test.py:559:7:559:16 | ControlFlowNode for Tuple [List element] |
| test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 1] | test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 2] | test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 2] |
| test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, List element] | test.py:559:7:559:16 | IterableSequence [List element] |
| test.py:559:6:559:23 | IterableElement [List element] | test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, List element] |
| test.py:559:6:559:23 | IterableSequence [List element, List element] | test.py:559:6:559:23 | IterableElement [List element] |
| test.py:559:7:559:8 | SSA variable a1 | test.py:560:10:560:11 | ControlFlowNode for a1 |
| test.py:559:7:559:16 | ControlFlowNode for Tuple [List element] | test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, List element] |
| test.py:559:7:559:16 | ControlFlowNode for Tuple [List element] | test.py:559:7:559:16 | IterableElement |
| test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:559:7:559:8 | SSA variable a1 |
| test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 1] | test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 1] |
| test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 1] | test.py:559:11:559:12 | SSA variable a2 |
| test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 2] | test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 2] |
| test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 2] | test.py:559:15:559:16 | SSA variable a3 |
| test.py:559:7:559:16 | IterableElement | test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:559:7:559:16 | IterableElement | test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:559:7:559:16 | IterableElement | test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 2] |
| test.py:559:7:559:16 | IterableSequence [List element] | test.py:559:7:559:16 | IterableElement |
| test.py:559:11:559:12 | SSA variable a2 | test.py:561:12:561:13 | ControlFlowNode for a2 |
| test.py:559:15:559:16 | SSA variable a3 | test.py:562:10:562:11 | ControlFlowNode for a3 |
| test.py:559:28:559:29 | ControlFlowNode for ll [List element, List element] | test.py:559:6:559:23 | IterableElement [List element] |
| test.py:567:5:567:24 | ControlFlowNode for List [List element, List element] | test.py:567:7:567:16 | ControlFlowNode for Tuple [List element] |
| test.py:567:5:567:24 | ControlFlowNode for List [List element, Tuple element at index 0] | test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:567:5:567:24 | ControlFlowNode for List [List element, Tuple element at index 1] | test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:567:5:567:24 | ControlFlowNode for List [List element, Tuple element at index 2] | test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 2] |
| test.py:567:5:567:24 | ControlFlowNode for List [List element, List element] | test.py:567:7:567:16 | IterableSequence [List element] |
| test.py:567:5:567:24 | IterableElement [List element] | test.py:567:5:567:24 | ControlFlowNode for List [List element, List element] |
| test.py:567:5:567:24 | IterableSequence [List element, List element] | test.py:567:5:567:24 | IterableElement [List element] |
| test.py:567:7:567:8 | SSA variable a1 | test.py:568:10:568:11 | ControlFlowNode for a1 |
| test.py:567:7:567:16 | ControlFlowNode for Tuple [List element] | test.py:567:5:567:24 | ControlFlowNode for List [List element, List element] |
| test.py:567:7:567:16 | ControlFlowNode for Tuple [List element] | test.py:567:7:567:16 | IterableElement |
| test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:567:5:567:24 | ControlFlowNode for List [List element, Tuple element at index 0] |
| test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:567:7:567:8 | SSA variable a1 |
| test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 1] | test.py:567:5:567:24 | ControlFlowNode for List [List element, Tuple element at index 1] |
| test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 1] | test.py:567:11:567:12 | SSA variable a2 |
| test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 2] | test.py:567:5:567:24 | ControlFlowNode for List [List element, Tuple element at index 2] |
| test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 2] | test.py:567:15:567:16 | SSA variable a3 |
| test.py:567:7:567:16 | IterableElement | test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:567:7:567:16 | IterableElement | test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:567:7:567:16 | IterableElement | test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 2] |
| test.py:567:7:567:16 | IterableSequence [List element] | test.py:567:7:567:16 | IterableElement |
| test.py:567:11:567:12 | SSA variable a2 | test.py:569:12:569:13 | ControlFlowNode for a2 |
| test.py:567:15:567:16 | SSA variable a3 | test.py:570:10:570:11 | ControlFlowNode for a3 |
| test.py:567:28:567:29 | ControlFlowNode for ll [List element, List element] | test.py:567:5:567:24 | IterableElement [List element] |
| test.py:575:6:575:17 | ControlFlowNode for List [List element] | test.py:575:6:575:17 | IterableElement |
| test.py:575:6:575:17 | ControlFlowNode for List [List element] | test.py:575:6:575:23 | ControlFlowNode for Tuple [Tuple element at index 0, List element] |
| test.py:575:6:575:17 | ControlFlowNode for List [List element] | test.py:575:7:575:8 | SSA variable a1 |
| test.py:575:6:575:17 | ControlFlowNode for List [List element] | test.py:575:11:575:12 | SSA variable a2 |
| test.py:575:6:575:17 | ControlFlowNode for List [List element] | test.py:575:15:575:16 | SSA variable a3 |
| test.py:575:6:575:17 | IterableElement | test.py:575:6:575:17 | ControlFlowNode for List [List element] |
| test.py:575:6:575:23 | ControlFlowNode for Tuple [Tuple element at index 0, List element] | test.py:575:6:575:17 | ControlFlowNode for List [List element] |
| test.py:575:6:575:17 | IterableSequence [List element] | test.py:575:6:575:17 | IterableElement |
| test.py:575:6:575:23 | ControlFlowNode for Tuple [Tuple element at index 0, List element] | test.py:575:6:575:17 | IterableSequence [List element] |
| test.py:575:6:575:23 | IterableElement [List element] | test.py:575:6:575:23 | ControlFlowNode for Tuple [Tuple element at index 0, List element] |
| test.py:575:6:575:23 | IterableSequence [List element, List element] | test.py:575:6:575:23 | IterableElement [List element] |
| test.py:575:7:575:8 | SSA variable a1 | test.py:576:10:576:11 | ControlFlowNode for a1 |
| test.py:575:11:575:12 | SSA variable a2 | test.py:577:12:577:13 | ControlFlowNode for a2 |
| test.py:575:15:575:16 | SSA variable a3 | test.py:578:10:578:11 | ControlFlowNode for a3 |
| test.py:575:28:575:29 | ControlFlowNode for ll [List element, List element] | test.py:575:6:575:23 | IterableElement [List element] |
| test.py:584:11:584:47 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:587:5:587:19 | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] |
| test.py:584:11:584:47 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:587:17:587:18 | ControlFlowNode for Starred [Tuple element at index 0, Tuple element at index 0] |
| test.py:584:11:584:47 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:587:23:587:24 | ControlFlowNode for tt [Tuple element at index 0, Tuple element at index 0] |
| test.py:584:11:584:47 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:596:6:596:18 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:584:11:584:47 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:605:5:605:19 | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] |
| test.py:584:11:584:47 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:605:17:605:18 | ControlFlowNode for Starred [Tuple element at index 0, Tuple element at index 0] |
| test.py:584:11:584:47 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:605:23:605:24 | ControlFlowNode for tt [Tuple element at index 0, Tuple element at index 0] |
| test.py:584:11:584:47 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:587:5:587:19 | IterableSequence [Tuple element at index 0, Tuple element at index 0] |
| test.py:584:11:584:47 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:614:6:614:18 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:584:12:584:36 | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:584:12:584:36 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:584:11:584:47 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, List element, List element] | test.py:587:6:587:14 | ControlFlowNode for List [List element, List element] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, List element, Tuple element at index 0] | test.py:587:6:587:14 | ControlFlowNode for List [List element, Tuple element at index 0] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, List element] | test.py:587:6:587:14 | ControlFlowNode for List [List element] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, List element] | test.py:587:17:587:18 | ControlFlowNode for Starred [List element, List element] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, List element] | test.py:587:17:587:18 | SSA variable b [List element] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, Tuple element at index 0, Tuple element at index 0] | test.py:587:6:587:14 | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, Tuple element at index 0] | test.py:587:6:587:14 | ControlFlowNode for List [Tuple element at index 0] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, Tuple element at index 0] | test.py:587:17:587:18 | ControlFlowNode for Starred [List element, Tuple element at index 0] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, Tuple element at index 0] | test.py:587:17:587:18 | SSA variable b [Tuple element at index 0] |
| test.py:587:5:587:19 | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] | test.py:587:17:587:18 | ControlFlowNode for Starred [Tuple element at index 0, Tuple element at index 0] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, List element] | test.py:587:6:587:14 | IterableSequence [List element] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, Tuple element at index 0] | test.py:587:6:587:14 | IterableSequence [Tuple element at index 0] |
| test.py:587:5:587:19 | IterableElement [Tuple element at index 0] | test.py:587:5:587:19 | ControlFlowNode for List [List element, Tuple element at index 0] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element, List element] | test.py:587:5:587:19 | ControlFlowNode for List [List element, List element, List element] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element, List element] | test.py:587:6:587:14 | IterableElement [List element] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element, List element] | test.py:587:7:587:8 | SSA variable a1 [List element] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element, List element] | test.py:587:11:587:13 | SSA variable a2 [List element] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element, Tuple element at index 0] | test.py:587:5:587:19 | ControlFlowNode for List [List element, List element, Tuple element at index 0] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element, Tuple element at index 0] | test.py:587:6:587:14 | IterableElement [Tuple element at index 0] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element, Tuple element at index 0] | test.py:587:7:587:8 | SSA variable a1 [Tuple element at index 0] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element, Tuple element at index 0] | test.py:587:11:587:13 | SSA variable a2 [Tuple element at index 0] |
| test.py:587:5:587:19 | IterableSequence [Tuple element at index 0, Tuple element at index 0] | test.py:587:5:587:19 | IterableElement [Tuple element at index 0] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element] | test.py:587:5:587:19 | ControlFlowNode for List [List element, List element] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element] | test.py:587:6:587:14 | IterableElement |
| test.py:587:6:587:14 | ControlFlowNode for List [List element] | test.py:587:7:587:8 | SSA variable a1 |
| test.py:587:6:587:14 | ControlFlowNode for List [List element] | test.py:587:11:587:13 | SSA variable a2 |
| test.py:587:6:587:14 | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] | test.py:587:5:587:19 | ControlFlowNode for List [List element, Tuple element at index 0, Tuple element at index 0] |
| test.py:587:6:587:14 | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] | test.py:587:6:587:14 | IterableElement [Tuple element at index 0] |
| test.py:587:6:587:14 | ControlFlowNode for List [Tuple element at index 0] | test.py:587:5:587:19 | ControlFlowNode for List [List element, Tuple element at index 0] |
| test.py:587:6:587:14 | ControlFlowNode for List [Tuple element at index 0] | test.py:587:6:587:14 | IterableElement |
| test.py:587:6:587:14 | ControlFlowNode for List [List element] | test.py:587:11:587:13 | IterableElement |
| test.py:587:6:587:14 | IterableElement | test.py:587:6:587:14 | ControlFlowNode for List [List element] |
| test.py:587:6:587:14 | IterableElement [List element] | test.py:587:6:587:14 | ControlFlowNode for List [List element, List element] |
| test.py:587:6:587:14 | IterableElement [Tuple element at index 0] | test.py:587:6:587:14 | ControlFlowNode for List [List element, Tuple element at index 0] |
| test.py:587:6:587:14 | IterableSequence [List element] | test.py:587:6:587:14 | IterableElement |
| test.py:587:6:587:14 | IterableSequence [Tuple element at index 0] | test.py:587:6:587:14 | IterableElement |
| test.py:587:7:587:8 | SSA variable a1 | test.py:588:10:588:11 | ControlFlowNode for a1 |
| test.py:587:7:587:8 | SSA variable a1 [List element] | test.py:591:12:591:13 | ControlFlowNode for a1 [List element] |
| test.py:587:7:587:8 | SSA variable a1 [Tuple element at index 0] | test.py:591:12:591:13 | ControlFlowNode for a1 [Tuple element at index 0] |
| test.py:587:11:587:13 | SSA variable a2 | test.py:589:12:589:13 | ControlFlowNode for a2 |
| test.py:587:11:587:13 | SSA variable a2 [List element] | test.py:590:10:590:11 | ControlFlowNode for a2 [List element] |
| test.py:587:11:587:13 | SSA variable a2 [Tuple element at index 0] | test.py:590:10:590:11 | ControlFlowNode for a2 [Tuple element at index 0] |
| test.py:587:17:587:18 | ControlFlowNode for Starred [List element, List element] | test.py:587:5:587:19 | ControlFlowNode for List [List element, List element, List element] |
| test.py:587:17:587:18 | ControlFlowNode for Starred [List element, Tuple element at index 0] | test.py:587:5:587:19 | ControlFlowNode for List [List element, List element, Tuple element at index 0] |
| test.py:587:17:587:18 | ControlFlowNode for Starred [Tuple element at index 0, Tuple element at index 0] | test.py:587:5:587:19 | ControlFlowNode for List [List element, Tuple element at index 0, Tuple element at index 0] |
| test.py:587:17:587:18 | SSA variable b [List element] | test.py:593:12:593:12 | ControlFlowNode for b [List element] |
| test.py:587:17:587:18 | SSA variable b [Tuple element at index 0] | test.py:593:12:593:12 | ControlFlowNode for b [Tuple element at index 0] |
| test.py:587:23:587:24 | ControlFlowNode for tt [Tuple element at index 0, Tuple element at index 0] | test.py:587:5:587:19 | IterableElement [Tuple element at index 0] |
| test.py:590:10:590:11 | ControlFlowNode for a2 [List element] | test.py:590:10:590:14 | ControlFlowNode for Subscript |
| test.py:590:10:590:11 | ControlFlowNode for a2 [Tuple element at index 0] | test.py:590:10:590:14 | ControlFlowNode for Subscript |
| test.py:591:12:591:13 | ControlFlowNode for a1 [List element] | test.py:591:12:591:16 | ControlFlowNode for Subscript |
| test.py:591:12:591:13 | ControlFlowNode for a1 [Tuple element at index 0] | test.py:591:12:591:16 | ControlFlowNode for Subscript |
| test.py:593:12:593:12 | ControlFlowNode for b [List element] | test.py:593:12:593:15 | ControlFlowNode for Subscript |
| test.py:593:12:593:12 | ControlFlowNode for b [Tuple element at index 0] | test.py:593:12:593:15 | ControlFlowNode for Subscript |
| test.py:596:6:596:18 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:596:7:596:13 | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:596:7:596:8 | SSA variable a1 | test.py:597:10:597:11 | ControlFlowNode for a1 |
| test.py:596:7:596:13 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:596:6:596:18 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:596:7:596:13 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:596:7:596:8 | SSA variable a1 |
| test.py:605:5:605:19 | ControlFlowNode for List [List element, List element, Tuple element at index 0] | test.py:605:7:605:13 | ControlFlowNode for Tuple [List element, Tuple element at index 0] |
| test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 0, Tuple element at index 0] | test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 0] | test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 0] | test.py:605:17:605:18 | ControlFlowNode for Starred [List element, Tuple element at index 0] |
| test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 0] | test.py:605:17:605:18 | SSA variable b [Tuple element at index 0] |
| test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 1, Tuple element at index 0] | test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 0] |
| test.py:605:5:605:19 | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] | test.py:605:17:605:18 | ControlFlowNode for Starred [Tuple element at index 0, Tuple element at index 0] |
| test.py:605:5:605:19 | IterableElement [Tuple element at index 0] | test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 0] |
| test.py:605:7:605:8 | SSA variable a1 | test.py:606:10:606:11 | ControlFlowNode for a1 |
| test.py:605:7:605:8 | SSA variable a1 [Tuple element at index 0] | test.py:609:12:609:13 | ControlFlowNode for a1 [Tuple element at index 0] |
| test.py:605:7:605:13 | ControlFlowNode for Tuple [List element, Tuple element at index 0] | test.py:605:5:605:19 | ControlFlowNode for List [List element, List element, Tuple element at index 0] |
| test.py:605:7:605:13 | ControlFlowNode for Tuple [List element, Tuple element at index 0] | test.py:605:7:605:13 | IterableElement [Tuple element at index 0] |
| test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 0, Tuple element at index 0] |
| test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:605:7:605:8 | SSA variable a1 [Tuple element at index 0] |
| test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 0] |
| test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 0] | test.py:605:7:605:8 | SSA variable a1 |
| test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 0] | test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 1, Tuple element at index 0] |
| test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 0] | test.py:605:11:605:13 | SSA variable a2 [Tuple element at index 0] |
| test.py:605:7:605:13 | IterableElement [Tuple element at index 0] | test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:605:7:605:13 | IterableElement [Tuple element at index 0] | test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 0] |
| test.py:605:11:605:13 | SSA variable a2 [Tuple element at index 0] | test.py:608:10:608:11 | ControlFlowNode for a2 [Tuple element at index 0] |
| test.py:605:17:605:18 | ControlFlowNode for Starred [List element, Tuple element at index 0] | test.py:605:5:605:19 | ControlFlowNode for List [List element, List element, Tuple element at index 0] |
| test.py:605:17:605:18 | ControlFlowNode for Starred [Tuple element at index 0, Tuple element at index 0] | test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 0, Tuple element at index 0] |
| test.py:605:17:605:18 | SSA variable b [Tuple element at index 0] | test.py:611:12:611:12 | ControlFlowNode for b [Tuple element at index 0] |
| test.py:605:23:605:24 | ControlFlowNode for tt [Tuple element at index 0, Tuple element at index 0] | test.py:605:5:605:19 | IterableElement [Tuple element at index 0] |
| test.py:608:10:608:11 | ControlFlowNode for a2 [Tuple element at index 0] | test.py:608:10:608:14 | ControlFlowNode for Subscript |
| test.py:609:12:609:13 | ControlFlowNode for a1 [Tuple element at index 0] | test.py:609:12:609:16 | ControlFlowNode for Subscript |
| test.py:611:12:611:12 | ControlFlowNode for b [Tuple element at index 0] | test.py:611:12:611:15 | ControlFlowNode for Subscript |
| test.py:614:6:614:14 | ControlFlowNode for List [List element] | test.py:614:6:614:14 | IterableElement |
| test.py:587:11:587:13 | IterableElement | test.py:587:11:587:13 | SSA variable a2 [List element] |
| test.py:587:11:587:13 | SSA variable a2 [List element] | test.py:590:12:590:13 | ControlFlowNode for a2 [List element] |
| test.py:587:11:587:13 | SSA variable a2 [List element] | test.py:591:10:591:11 | ControlFlowNode for a2 [List element] |
| test.py:590:12:590:13 | ControlFlowNode for a2 [List element] | test.py:590:12:590:16 | ControlFlowNode for Subscript |
| test.py:591:10:591:11 | ControlFlowNode for a2 [List element] | test.py:591:10:591:14 | ControlFlowNode for Subscript |
| test.py:614:6:614:14 | ControlFlowNode for List [List element] | test.py:614:6:614:18 | ControlFlowNode for Tuple [Tuple element at index 0, List element] |
| test.py:614:6:614:14 | ControlFlowNode for List [List element] | test.py:614:7:614:8 | SSA variable a1 |
| test.py:614:6:614:14 | ControlFlowNode for List [List element] | test.py:614:11:614:13 | SSA variable a2 |
| test.py:614:6:614:14 | ControlFlowNode for List [Tuple element at index 0] | test.py:614:6:614:14 | IterableElement |
| test.py:614:6:614:14 | ControlFlowNode for List [Tuple element at index 0] | test.py:614:6:614:18 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:614:6:614:14 | ControlFlowNode for List [List element] | test.py:614:11:614:13 | IterableElement |
| test.py:614:6:614:14 | IterableElement | test.py:614:6:614:14 | ControlFlowNode for List [List element] |
| test.py:614:6:614:18 | ControlFlowNode for Tuple [Tuple element at index 0, List element] | test.py:614:6:614:14 | ControlFlowNode for List [List element] |
| test.py:614:6:614:18 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:614:6:614:14 | ControlFlowNode for List [Tuple element at index 0] |
| test.py:614:6:614:14 | IterableSequence [List element] | test.py:614:6:614:14 | IterableElement |
| test.py:614:6:614:14 | IterableSequence [Tuple element at index 0] | test.py:614:6:614:14 | IterableElement |
| test.py:614:6:614:18 | ControlFlowNode for Tuple [Tuple element at index 0, List element] | test.py:614:6:614:14 | IterableSequence [List element] |
| test.py:614:6:614:18 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | test.py:614:6:614:14 | IterableSequence [Tuple element at index 0] |
| test.py:614:7:614:8 | SSA variable a1 | test.py:615:10:615:11 | ControlFlowNode for a1 |
| test.py:614:11:614:13 | SSA variable a2 | test.py:616:12:616:13 | ControlFlowNode for a2 |
| test.py:614:11:614:13 | IterableElement | test.py:614:11:614:13 | SSA variable a2 [List element] |
| test.py:614:11:614:13 | SSA variable a2 [List element] | test.py:617:12:617:13 | ControlFlowNode for a2 [List element] |
| test.py:614:11:614:13 | SSA variable a2 [List element] | test.py:618:10:618:11 | ControlFlowNode for a2 [List element] |
| test.py:617:12:617:13 | ControlFlowNode for a2 [List element] | test.py:617:12:617:16 | ControlFlowNode for Subscript |
| test.py:618:10:618:11 | ControlFlowNode for a2 [List element] | test.py:618:10:618:14 | ControlFlowNode for Subscript |
| test.py:692:16:692:21 | ControlFlowNode for SOURCE | test.py:695:10:695:36 | ControlFlowNode for return_from_inner_scope() |
nodes
| datamodel.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module datamodel | semmle.label | ModuleVariableNode for Global Variable SOURCE in Module datamodel |
@@ -569,30 +497,39 @@ nodes
| test.py:523:10:523:10 | ControlFlowNode for a | semmle.label | ControlFlowNode for a |
| test.py:529:10:529:15 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
| test.py:529:10:529:36 | ControlFlowNode for Tuple [Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:529:10:529:36 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 1] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 1] |
| test.py:529:19:529:35 | ControlFlowNode for Tuple [Tuple element at index 1] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:529:30:529:35 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
| test.py:530:5:530:5 | SSA variable a | semmle.label | SSA variable a |
| test.py:530:5:530:13 | ControlFlowNode for Tuple [Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:530:5:530:13 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 1] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 1] |
| test.py:530:9:530:12 | ControlFlowNode for Tuple [Tuple element at index 1] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:530:12:530:12 | SSA variable c | semmle.label | SSA variable c |
| test.py:531:10:531:10 | ControlFlowNode for a | semmle.label | ControlFlowNode for a |
| test.py:533:10:533:10 | ControlFlowNode for c | semmle.label | ControlFlowNode for c |
| test.py:538:9:538:33 | ControlFlowNode for List [List element, List element, List element, List element] | semmle.label | ControlFlowNode for List [List element, List element, List element, List element] |
| test.py:538:10:538:21 | ControlFlowNode for List [List element, List element, List element] | semmle.label | ControlFlowNode for List [List element, List element, List element] |
| test.py:538:11:538:20 | ControlFlowNode for List [List element, List element] | semmle.label | ControlFlowNode for List [List element, List element] |
| test.py:538:12:538:19 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] |
| test.py:538:13:538:18 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
| test.py:539:5:539:11 | ControlFlowNode for List [List element, List element, List element] | semmle.label | ControlFlowNode for List [List element, List element, List element] |
| test.py:539:5:539:11 | IterableElement [List element, List element] | semmle.label | IterableElement [List element, List element] |
| test.py:539:5:539:11 | IterableSequence [List element, List element, List element] | semmle.label | IterableSequence [List element, List element, List element] |
| test.py:539:5:539:14 | ControlFlowNode for Tuple [Tuple element at index 0, List element, List element, List element] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0, List element, List element, List element] |
| test.py:539:5:539:14 | IterableElement [List element, List element, List element] | semmle.label | IterableElement [List element, List element, List element] |
| test.py:539:5:539:14 | IterableSequence [List element, List element, List element, List element] | semmle.label | IterableSequence [List element, List element, List element, List element] |
| test.py:539:6:539:10 | ControlFlowNode for List [List element, List element] | semmle.label | ControlFlowNode for List [List element, List element] |
| test.py:539:6:539:10 | IterableElement [List element] | semmle.label | IterableElement [List element] |
| test.py:539:6:539:10 | IterableSequence [List element, List element] | semmle.label | IterableSequence [List element, List element] |
| test.py:539:7:539:9 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] |
| test.py:539:7:539:9 | IterableElement | semmle.label | IterableElement |
| test.py:539:7:539:9 | IterableSequence [List element] | semmle.label | IterableSequence [List element] |
| test.py:539:8:539:8 | SSA variable a | semmle.label | SSA variable a |
| test.py:540:10:540:10 | ControlFlowNode for a | semmle.label | ControlFlowNode for a |
| test.py:546:10:546:15 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
| test.py:546:10:546:34 | ControlFlowNode for Tuple [Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:546:10:546:34 | ControlFlowNode for Tuple [Tuple element at index 1] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:546:18:546:23 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
| test.py:547:5:547:5 | SSA variable a | semmle.label | SSA variable a |
| test.py:547:5:547:12 | ControlFlowNode for Tuple [Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:547:5:547:12 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 0] |
| test.py:547:5:547:12 | ControlFlowNode for Tuple [Tuple element at index 1] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:547:8:547:9 | ControlFlowNode for Starred [Tuple element at index 0] | semmle.label | ControlFlowNode for Starred [Tuple element at index 0] |
| test.py:547:8:547:9 | SSA variable b | semmle.label | SSA variable b |
| test.py:547:8:547:9 | SSA variable b [Tuple element at index 0] | semmle.label | SSA variable b [Tuple element at index 0] |
| test.py:547:8:547:9 | IterableElement | semmle.label | IterableElement |
| test.py:547:8:547:9 | SSA variable b [List element] | semmle.label | SSA variable b [List element] |
| test.py:548:10:548:10 | ControlFlowNode for a | semmle.label | ControlFlowNode for a |
| test.py:549:12:549:12 | ControlFlowNode for b | semmle.label | ControlFlowNode for b |
| test.py:550:10:550:10 | ControlFlowNode for b [Tuple element at index 0] | semmle.label | ControlFlowNode for b [Tuple element at index 0] |
| test.py:550:10:550:10 | ControlFlowNode for b [List element] | semmle.label | ControlFlowNode for b [List element] |
| test.py:550:10:550:13 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
| test.py:556:10:556:61 | ControlFlowNode for List [List element, List element] | semmle.label | ControlFlowNode for List [List element, List element] |
| test.py:556:11:556:37 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] |
@@ -601,129 +538,78 @@ nodes
| test.py:556:40:556:47 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] |
| test.py:556:41:556:46 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
| test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, List element] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0, List element] |
| test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 1] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 1] |
| test.py:559:6:559:23 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 2] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 2] |
| test.py:559:6:559:23 | IterableElement [List element] | semmle.label | IterableElement [List element] |
| test.py:559:6:559:23 | IterableSequence [List element, List element] | semmle.label | IterableSequence [List element, List element] |
| test.py:559:7:559:8 | SSA variable a1 | semmle.label | SSA variable a1 |
| test.py:559:7:559:16 | ControlFlowNode for Tuple [List element] | semmle.label | ControlFlowNode for Tuple [List element] |
| test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 1] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:559:7:559:16 | ControlFlowNode for Tuple [Tuple element at index 2] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 2] |
| test.py:559:7:559:16 | IterableElement | semmle.label | IterableElement |
| test.py:559:7:559:16 | IterableSequence [List element] | semmle.label | IterableSequence [List element] |
| test.py:559:11:559:12 | SSA variable a2 | semmle.label | SSA variable a2 |
| test.py:559:15:559:16 | SSA variable a3 | semmle.label | SSA variable a3 |
| test.py:559:28:559:29 | ControlFlowNode for ll [List element, List element] | semmle.label | ControlFlowNode for ll [List element, List element] |
| test.py:560:10:560:11 | ControlFlowNode for a1 | semmle.label | ControlFlowNode for a1 |
| test.py:561:12:561:13 | ControlFlowNode for a2 | semmle.label | ControlFlowNode for a2 |
| test.py:562:10:562:11 | ControlFlowNode for a3 | semmle.label | ControlFlowNode for a3 |
| test.py:567:5:567:24 | ControlFlowNode for List [List element, List element] | semmle.label | ControlFlowNode for List [List element, List element] |
| test.py:567:5:567:24 | ControlFlowNode for List [List element, Tuple element at index 0] | semmle.label | ControlFlowNode for List [List element, Tuple element at index 0] |
| test.py:567:5:567:24 | ControlFlowNode for List [List element, Tuple element at index 1] | semmle.label | ControlFlowNode for List [List element, Tuple element at index 1] |
| test.py:567:5:567:24 | ControlFlowNode for List [List element, Tuple element at index 2] | semmle.label | ControlFlowNode for List [List element, Tuple element at index 2] |
| test.py:567:5:567:24 | IterableElement [List element] | semmle.label | IterableElement [List element] |
| test.py:567:5:567:24 | IterableSequence [List element, List element] | semmle.label | IterableSequence [List element, List element] |
| test.py:567:7:567:8 | SSA variable a1 | semmle.label | SSA variable a1 |
| test.py:567:7:567:16 | ControlFlowNode for Tuple [List element] | semmle.label | ControlFlowNode for Tuple [List element] |
| test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 1] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 1] |
| test.py:567:7:567:16 | ControlFlowNode for Tuple [Tuple element at index 2] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 2] |
| test.py:567:7:567:16 | IterableElement | semmle.label | IterableElement |
| test.py:567:7:567:16 | IterableSequence [List element] | semmle.label | IterableSequence [List element] |
| test.py:567:11:567:12 | SSA variable a2 | semmle.label | SSA variable a2 |
| test.py:567:15:567:16 | SSA variable a3 | semmle.label | SSA variable a3 |
| test.py:567:28:567:29 | ControlFlowNode for ll [List element, List element] | semmle.label | ControlFlowNode for ll [List element, List element] |
| test.py:568:10:568:11 | ControlFlowNode for a1 | semmle.label | ControlFlowNode for a1 |
| test.py:569:12:569:13 | ControlFlowNode for a2 | semmle.label | ControlFlowNode for a2 |
| test.py:570:10:570:11 | ControlFlowNode for a3 | semmle.label | ControlFlowNode for a3 |
| test.py:575:6:575:17 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] |
| test.py:575:6:575:17 | IterableElement | semmle.label | IterableElement |
| test.py:575:6:575:17 | IterableSequence [List element] | semmle.label | IterableSequence [List element] |
| test.py:575:6:575:23 | ControlFlowNode for Tuple [Tuple element at index 0, List element] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0, List element] |
| test.py:575:6:575:23 | IterableElement [List element] | semmle.label | IterableElement [List element] |
| test.py:575:6:575:23 | IterableSequence [List element, List element] | semmle.label | IterableSequence [List element, List element] |
| test.py:575:7:575:8 | SSA variable a1 | semmle.label | SSA variable a1 |
| test.py:575:11:575:12 | SSA variable a2 | semmle.label | SSA variable a2 |
| test.py:575:15:575:16 | SSA variable a3 | semmle.label | SSA variable a3 |
| test.py:575:28:575:29 | ControlFlowNode for ll [List element, List element] | semmle.label | ControlFlowNode for ll [List element, List element] |
| test.py:576:10:576:11 | ControlFlowNode for a1 | semmle.label | ControlFlowNode for a1 |
| test.py:577:12:577:13 | ControlFlowNode for a2 | semmle.label | ControlFlowNode for a2 |
| test.py:578:10:578:11 | ControlFlowNode for a3 | semmle.label | ControlFlowNode for a3 |
| test.py:584:11:584:47 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:584:12:584:17 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
| test.py:584:12:584:36 | ControlFlowNode for Tuple [Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, List element, List element] | semmle.label | ControlFlowNode for List [List element, List element, List element] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, List element, Tuple element at index 0] | semmle.label | ControlFlowNode for List [List element, List element, Tuple element at index 0] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, List element] | semmle.label | ControlFlowNode for List [List element, List element] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for List [List element, Tuple element at index 0, Tuple element at index 0] |
| test.py:587:5:587:19 | ControlFlowNode for List [List element, Tuple element at index 0] | semmle.label | ControlFlowNode for List [List element, Tuple element at index 0] |
| test.py:587:5:587:19 | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] |
| test.py:587:5:587:19 | IterableElement [Tuple element at index 0] | semmle.label | IterableElement [Tuple element at index 0] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element, List element] | semmle.label | ControlFlowNode for List [List element, List element] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element, Tuple element at index 0] | semmle.label | ControlFlowNode for List [List element, Tuple element at index 0] |
| test.py:587:5:587:19 | IterableSequence [Tuple element at index 0, Tuple element at index 0] | semmle.label | IterableSequence [Tuple element at index 0, Tuple element at index 0] |
| test.py:587:6:587:14 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] |
| test.py:587:6:587:14 | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] |
| test.py:587:6:587:14 | ControlFlowNode for List [Tuple element at index 0] | semmle.label | ControlFlowNode for List [Tuple element at index 0] |
| test.py:587:6:587:14 | IterableElement | semmle.label | IterableElement |
| test.py:587:6:587:14 | IterableElement [List element] | semmle.label | IterableElement [List element] |
| test.py:587:6:587:14 | IterableElement [Tuple element at index 0] | semmle.label | IterableElement [Tuple element at index 0] |
| test.py:587:6:587:14 | IterableSequence [List element] | semmle.label | IterableSequence [List element] |
| test.py:587:6:587:14 | IterableSequence [Tuple element at index 0] | semmle.label | IterableSequence [Tuple element at index 0] |
| test.py:587:7:587:8 | SSA variable a1 | semmle.label | SSA variable a1 |
| test.py:587:7:587:8 | SSA variable a1 [List element] | semmle.label | SSA variable a1 [List element] |
| test.py:587:7:587:8 | SSA variable a1 [Tuple element at index 0] | semmle.label | SSA variable a1 [Tuple element at index 0] |
| test.py:587:11:587:13 | SSA variable a2 | semmle.label | SSA variable a2 |
| test.py:587:11:587:13 | IterableElement | semmle.label | IterableElement |
| test.py:587:11:587:13 | SSA variable a2 [List element] | semmle.label | SSA variable a2 [List element] |
| test.py:587:11:587:13 | SSA variable a2 [Tuple element at index 0] | semmle.label | SSA variable a2 [Tuple element at index 0] |
| test.py:587:17:587:18 | ControlFlowNode for Starred [List element, List element] | semmle.label | ControlFlowNode for Starred [List element, List element] |
| test.py:587:17:587:18 | ControlFlowNode for Starred [List element, Tuple element at index 0] | semmle.label | ControlFlowNode for Starred [List element, Tuple element at index 0] |
| test.py:587:17:587:18 | ControlFlowNode for Starred [Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for Starred [Tuple element at index 0, Tuple element at index 0] |
| test.py:587:17:587:18 | SSA variable b [List element] | semmle.label | SSA variable b [List element] |
| test.py:587:17:587:18 | SSA variable b [Tuple element at index 0] | semmle.label | SSA variable b [Tuple element at index 0] |
| test.py:587:23:587:24 | ControlFlowNode for tt [Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for tt [Tuple element at index 0, Tuple element at index 0] |
| test.py:588:10:588:11 | ControlFlowNode for a1 | semmle.label | ControlFlowNode for a1 |
| test.py:589:12:589:13 | ControlFlowNode for a2 | semmle.label | ControlFlowNode for a2 |
| test.py:590:10:590:11 | ControlFlowNode for a2 [List element] | semmle.label | ControlFlowNode for a2 [List element] |
| test.py:590:10:590:11 | ControlFlowNode for a2 [Tuple element at index 0] | semmle.label | ControlFlowNode for a2 [Tuple element at index 0] |
| test.py:590:10:590:14 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
| test.py:591:12:591:13 | ControlFlowNode for a1 [List element] | semmle.label | ControlFlowNode for a1 [List element] |
| test.py:591:12:591:13 | ControlFlowNode for a1 [Tuple element at index 0] | semmle.label | ControlFlowNode for a1 [Tuple element at index 0] |
| test.py:591:12:591:16 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
| test.py:593:12:593:12 | ControlFlowNode for b [List element] | semmle.label | ControlFlowNode for b [List element] |
| test.py:593:12:593:12 | ControlFlowNode for b [Tuple element at index 0] | semmle.label | ControlFlowNode for b [Tuple element at index 0] |
| test.py:593:12:593:15 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
| test.py:596:6:596:18 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:596:7:596:8 | SSA variable a1 | semmle.label | SSA variable a1 |
| test.py:596:7:596:13 | ControlFlowNode for Tuple [Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:597:10:597:11 | ControlFlowNode for a1 | semmle.label | ControlFlowNode for a1 |
| test.py:605:5:605:19 | ControlFlowNode for List [List element, List element, Tuple element at index 0] | semmle.label | ControlFlowNode for List [List element, List element, Tuple element at index 0] |
| test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for List [List element, Tuple element at index 0, Tuple element at index 0] |
| test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 0] | semmle.label | ControlFlowNode for List [List element, Tuple element at index 0] |
| test.py:605:5:605:19 | ControlFlowNode for List [List element, Tuple element at index 1, Tuple element at index 0] | semmle.label | ControlFlowNode for List [List element, Tuple element at index 1, Tuple element at index 0] |
| test.py:605:5:605:19 | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for List [Tuple element at index 0, Tuple element at index 0] |
| test.py:605:5:605:19 | IterableElement [Tuple element at index 0] | semmle.label | IterableElement [Tuple element at index 0] |
| test.py:605:7:605:8 | SSA variable a1 | semmle.label | SSA variable a1 |
| test.py:605:7:605:8 | SSA variable a1 [Tuple element at index 0] | semmle.label | SSA variable a1 [Tuple element at index 0] |
| test.py:605:7:605:13 | ControlFlowNode for Tuple [List element, Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [List element, Tuple element at index 0] |
| test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0] |
| test.py:605:7:605:13 | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 1, Tuple element at index 0] |
| test.py:605:7:605:13 | IterableElement [Tuple element at index 0] | semmle.label | IterableElement [Tuple element at index 0] |
| test.py:605:11:605:13 | SSA variable a2 [Tuple element at index 0] | semmle.label | SSA variable a2 [Tuple element at index 0] |
| test.py:605:17:605:18 | ControlFlowNode for Starred [List element, Tuple element at index 0] | semmle.label | ControlFlowNode for Starred [List element, Tuple element at index 0] |
| test.py:605:17:605:18 | ControlFlowNode for Starred [Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for Starred [Tuple element at index 0, Tuple element at index 0] |
| test.py:605:17:605:18 | SSA variable b [Tuple element at index 0] | semmle.label | SSA variable b [Tuple element at index 0] |
| test.py:605:23:605:24 | ControlFlowNode for tt [Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for tt [Tuple element at index 0, Tuple element at index 0] |
| test.py:606:10:606:11 | ControlFlowNode for a1 | semmle.label | ControlFlowNode for a1 |
| test.py:608:10:608:11 | ControlFlowNode for a2 [Tuple element at index 0] | semmle.label | ControlFlowNode for a2 [Tuple element at index 0] |
| test.py:608:10:608:14 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
| test.py:609:12:609:13 | ControlFlowNode for a1 [Tuple element at index 0] | semmle.label | ControlFlowNode for a1 [Tuple element at index 0] |
| test.py:609:12:609:16 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
| test.py:611:12:611:12 | ControlFlowNode for b [Tuple element at index 0] | semmle.label | ControlFlowNode for b [Tuple element at index 0] |
| test.py:611:12:611:15 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
| test.py:590:12:590:13 | ControlFlowNode for a2 [List element] | semmle.label | ControlFlowNode for a2 [List element] |
| test.py:590:12:590:16 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
| test.py:591:10:591:11 | ControlFlowNode for a2 [List element] | semmle.label | ControlFlowNode for a2 [List element] |
| test.py:591:10:591:14 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
| test.py:614:6:614:14 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] |
| test.py:614:6:614:14 | ControlFlowNode for List [Tuple element at index 0] | semmle.label | ControlFlowNode for List [Tuple element at index 0] |
| test.py:614:6:614:14 | IterableElement | semmle.label | IterableElement |
| test.py:614:6:614:14 | IterableSequence [List element] | semmle.label | IterableSequence [List element] |
| test.py:614:6:614:14 | IterableSequence [Tuple element at index 0] | semmle.label | IterableSequence [Tuple element at index 0] |
| test.py:614:6:614:18 | ControlFlowNode for Tuple [Tuple element at index 0, List element] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0, List element] |
| test.py:614:6:614:18 | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0, Tuple element at index 0] |
| test.py:614:7:614:8 | SSA variable a1 | semmle.label | SSA variable a1 |
| test.py:614:11:614:13 | SSA variable a2 | semmle.label | SSA variable a2 |
| test.py:614:11:614:13 | IterableElement | semmle.label | IterableElement |
| test.py:614:11:614:13 | SSA variable a2 [List element] | semmle.label | SSA variable a2 [List element] |
| test.py:615:10:615:11 | ControlFlowNode for a1 | semmle.label | ControlFlowNode for a1 |
| test.py:616:12:616:13 | ControlFlowNode for a2 | semmle.label | ControlFlowNode for a2 |
| test.py:617:12:617:13 | ControlFlowNode for a2 [List element] | semmle.label | ControlFlowNode for a2 [List element] |
| test.py:617:12:617:16 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
| test.py:618:10:618:11 | ControlFlowNode for a2 [List element] | semmle.label | ControlFlowNode for a2 [List element] |
| test.py:618:10:618:14 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
| test.py:692:16:692:21 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
| test.py:695:10:695:36 | ControlFlowNode for return_from_inner_scope() | semmle.label | ControlFlowNode for return_from_inner_scope() |
#select
@@ -827,16 +713,13 @@ nodes
| test.py:523:10:523:10 | ControlFlowNode for a | test.py:521:10:521:15 | ControlFlowNode for SOURCE | test.py:523:10:523:10 | ControlFlowNode for a | Flow found |
| test.py:531:10:531:10 | ControlFlowNode for a | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:531:10:531:10 | ControlFlowNode for a | Flow found |
| test.py:531:10:531:10 | ControlFlowNode for a | test.py:529:10:529:15 | ControlFlowNode for SOURCE | test.py:531:10:531:10 | ControlFlowNode for a | Flow found |
| test.py:533:10:533:10 | ControlFlowNode for c | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:533:10:533:10 | ControlFlowNode for c | Flow found |
| test.py:533:10:533:10 | ControlFlowNode for c | test.py:529:10:529:15 | ControlFlowNode for SOURCE | test.py:533:10:533:10 | ControlFlowNode for c | Flow found |
| test.py:533:10:533:10 | ControlFlowNode for c | test.py:529:30:529:35 | ControlFlowNode for SOURCE | test.py:533:10:533:10 | ControlFlowNode for c | Flow found |
| test.py:540:10:540:10 | ControlFlowNode for a | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:540:10:540:10 | ControlFlowNode for a | Flow found |
| test.py:540:10:540:10 | ControlFlowNode for a | test.py:538:13:538:18 | ControlFlowNode for SOURCE | test.py:540:10:540:10 | ControlFlowNode for a | Flow found |
| test.py:548:10:548:10 | ControlFlowNode for a | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:548:10:548:10 | ControlFlowNode for a | Flow found |
| test.py:548:10:548:10 | ControlFlowNode for a | test.py:546:10:546:15 | ControlFlowNode for SOURCE | test.py:548:10:548:10 | ControlFlowNode for a | Flow found |
| test.py:549:12:549:12 | ControlFlowNode for b | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:549:12:549:12 | ControlFlowNode for b | Flow found |
| test.py:549:12:549:12 | ControlFlowNode for b | test.py:546:10:546:15 | ControlFlowNode for SOURCE | test.py:549:12:549:12 | ControlFlowNode for b | Flow found |
| test.py:549:12:549:12 | ControlFlowNode for b | test.py:546:18:546:23 | ControlFlowNode for SOURCE | test.py:549:12:549:12 | ControlFlowNode for b | Flow found |
| test.py:550:10:550:13 | ControlFlowNode for Subscript | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:550:10:550:13 | ControlFlowNode for Subscript | Flow found |
| test.py:550:10:550:13 | ControlFlowNode for Subscript | test.py:546:10:546:15 | ControlFlowNode for SOURCE | test.py:550:10:550:13 | ControlFlowNode for Subscript | Flow found |
| test.py:550:10:550:13 | ControlFlowNode for Subscript | test.py:546:18:546:23 | ControlFlowNode for SOURCE | test.py:550:10:550:13 | ControlFlowNode for Subscript | Flow found |
| test.py:560:10:560:11 | ControlFlowNode for a1 | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:560:10:560:11 | ControlFlowNode for a1 | Flow found |
| test.py:560:10:560:11 | ControlFlowNode for a1 | test.py:556:12:556:17 | ControlFlowNode for SOURCE | test.py:560:10:560:11 | ControlFlowNode for a1 | Flow found |
| test.py:560:10:560:11 | ControlFlowNode for a1 | test.py:556:31:556:36 | ControlFlowNode for SOURCE | test.py:560:10:560:11 | ControlFlowNode for a1 | Flow found |
@@ -875,27 +758,15 @@ nodes
| test.py:578:10:578:11 | ControlFlowNode for a3 | test.py:556:41:556:46 | ControlFlowNode for SOURCE | test.py:578:10:578:11 | ControlFlowNode for a3 | Flow found |
| test.py:588:10:588:11 | ControlFlowNode for a1 | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:588:10:588:11 | ControlFlowNode for a1 | Flow found |
| test.py:588:10:588:11 | ControlFlowNode for a1 | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:588:10:588:11 | ControlFlowNode for a1 | Flow found |
| test.py:589:12:589:13 | ControlFlowNode for a2 | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:589:12:589:13 | ControlFlowNode for a2 | Flow found |
| test.py:589:12:589:13 | ControlFlowNode for a2 | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:589:12:589:13 | ControlFlowNode for a2 | Flow found |
| test.py:590:10:590:14 | ControlFlowNode for Subscript | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:590:10:590:14 | ControlFlowNode for Subscript | Flow found |
| test.py:590:10:590:14 | ControlFlowNode for Subscript | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:590:10:590:14 | ControlFlowNode for Subscript | Flow found |
| test.py:591:12:591:16 | ControlFlowNode for Subscript | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:591:12:591:16 | ControlFlowNode for Subscript | Flow found |
| test.py:591:12:591:16 | ControlFlowNode for Subscript | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:591:12:591:16 | ControlFlowNode for Subscript | Flow found |
| test.py:593:12:593:15 | ControlFlowNode for Subscript | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:593:12:593:15 | ControlFlowNode for Subscript | Flow found |
| test.py:593:12:593:15 | ControlFlowNode for Subscript | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:593:12:593:15 | ControlFlowNode for Subscript | Flow found |
| test.py:597:10:597:11 | ControlFlowNode for a1 | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:597:10:597:11 | ControlFlowNode for a1 | Flow found |
| test.py:597:10:597:11 | ControlFlowNode for a1 | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:597:10:597:11 | ControlFlowNode for a1 | Flow found |
| test.py:606:10:606:11 | ControlFlowNode for a1 | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:606:10:606:11 | ControlFlowNode for a1 | Flow found |
| test.py:606:10:606:11 | ControlFlowNode for a1 | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:606:10:606:11 | ControlFlowNode for a1 | Flow found |
| test.py:608:10:608:14 | ControlFlowNode for Subscript | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:608:10:608:14 | ControlFlowNode for Subscript | Flow found |
| test.py:608:10:608:14 | ControlFlowNode for Subscript | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:608:10:608:14 | ControlFlowNode for Subscript | Flow found |
| test.py:609:12:609:16 | ControlFlowNode for Subscript | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:609:12:609:16 | ControlFlowNode for Subscript | Flow found |
| test.py:609:12:609:16 | ControlFlowNode for Subscript | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:609:12:609:16 | ControlFlowNode for Subscript | Flow found |
| test.py:611:12:611:15 | ControlFlowNode for Subscript | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:611:12:611:15 | ControlFlowNode for Subscript | Flow found |
| test.py:611:12:611:15 | ControlFlowNode for Subscript | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:611:12:611:15 | ControlFlowNode for Subscript | Flow found |
| test.py:590:12:590:16 | ControlFlowNode for Subscript | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:590:12:590:16 | ControlFlowNode for Subscript | Flow found |
| test.py:590:12:590:16 | ControlFlowNode for Subscript | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:590:12:590:16 | ControlFlowNode for Subscript | Flow found |
| test.py:591:10:591:14 | ControlFlowNode for Subscript | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:591:10:591:14 | ControlFlowNode for Subscript | Flow found |
| test.py:591:10:591:14 | ControlFlowNode for Subscript | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:591:10:591:14 | ControlFlowNode for Subscript | Flow found |
| test.py:615:10:615:11 | ControlFlowNode for a1 | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:615:10:615:11 | ControlFlowNode for a1 | Flow found |
| test.py:615:10:615:11 | ControlFlowNode for a1 | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:615:10:615:11 | ControlFlowNode for a1 | Flow found |
| test.py:616:12:616:13 | ControlFlowNode for a2 | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:616:12:616:13 | ControlFlowNode for a2 | Flow found |
| test.py:616:12:616:13 | ControlFlowNode for a2 | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:616:12:616:13 | ControlFlowNode for a2 | Flow found |
| test.py:617:12:617:16 | ControlFlowNode for Subscript | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:617:12:617:16 | ControlFlowNode for Subscript | Flow found |
| test.py:617:12:617:16 | ControlFlowNode for Subscript | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:617:12:617:16 | ControlFlowNode for Subscript | Flow found |
| test.py:618:10:618:14 | ControlFlowNode for Subscript | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:618:10:618:14 | ControlFlowNode for Subscript | Flow found |
| test.py:618:10:618:14 | ControlFlowNode for Subscript | test.py:584:12:584:17 | ControlFlowNode for SOURCE | test.py:618:10:618:14 | ControlFlowNode for Subscript | Flow found |
| test.py:695:10:695:36 | ControlFlowNode for return_from_inner_scope() | test.py:20:10:20:17 | ControlFlowNode for Str | test.py:695:10:695:36 | ControlFlowNode for return_from_inner_scope() | Flow found |
| test.py:695:10:695:36 | ControlFlowNode for return_from_inner_scope() | test.py:692:16:692:21 | ControlFlowNode for SOURCE | test.py:695:10:695:36 | ControlFlowNode for return_from_inner_scope() | Flow found |

View File

@@ -530,23 +530,23 @@ def test_nested_unpacking_assignment():
a, (b, c) = t
SINK(a)
SINK_F(b)
SINK(c)
SINK(c) # Flow not found
@expects(2)
def test_deeply_nested_unpacking_assignment():
t = [[[[SOURCE]]], NONSOURCE]
[[[a]]], b = t
SINK(a) # Flow not found
SINK(a)
SINK_F(b)
@expects(3)
@expects(4)
def test_iterated_unpacking_assignment():
t = (SOURCE, SOURCE, NONSOURCE)
a, *b, c = t
SINK(a)
SINK_F(b) # FP
SINK_F(b)
SINK(b[0])
SINK_F(c)
@@ -579,34 +579,34 @@ def test_unpacking_assignment_conversion():
SINK_F(b) # The list itself is not tainted
SINK_F(c)
@expects(24)
def test_iterated_unpacking_assignment_conversion():
tt = ((SOURCE, NONSOURCE, SOURCE),NONSOURCE)
# list
[[a1, *a2], *b] = tt
SINK(a1)
SINK_F(a2) # FP, The list itself is not tainted
SINK(a2[0])
SINK_F(a1[0]) # FP here due to list abstraction
SINK_F(a2) # The list itself is not tainted
SINK_F(a2[0]) # FP here due to list abstraction
SINK(a2[1]) # FP here due to list abstraction
SINK_F(b) # The list itself is not tainted
SINK_F(b[0]) # FP here due to list abstraction
SINK_F(b[0]) # Expected FP here due to list abstraction
# tuple
((a1, *a2), *b) = tt
SINK(a1)
SINK(a1) # Flow not found
SINK_F(a2) # The list itself is not tainted
SINK(a2[0]) # Flow not found
SINK_F(a1[0])
SINK_F(a2[0])
SINK(a2[1]) # Flow not found
SINK_F(b) # The list itself is not tainted
SINK_F(b[0])
# mixed
[(a1, *a2), *b] = tt
SINK(a1)
SINK(a1) # Flow not found
SINK_F(a2) # The list itself is not tainted
SINK(a2[0]) # Flow not found
SINK_F(a1[0]) # FP
SINK_F(a2[0])
SINK(a2[1]) # Flow not found
SINK_F(b) # The list itself is not tainted
SINK_F(b[0]) # FP here due to list abstraction
@@ -614,8 +614,8 @@ def test_iterated_unpacking_assignment_conversion():
([a1, *a2], *b) = tt
SINK(a1)
SINK_F(a2) # The list itself is not tainted
SINK(a2[0]) # Flow not found
SINK_F(a1[0]) # Expect FP here due to list abstraction
SINK_F(a2[0])
SINK(a2[1]) # FP here due to list abstraction
SINK_F(b) # The list itself is not tainted
SINK_F(b[0])