зеркало из https://github.com/github/codeql.git
Python: Dataflow: Remove IterationDefinition ESSA definition and add iteration assignment to ESSA assignment definition.
Enhance points-to and taint-tracking to add operational step sequence to next(iter(seq)) in for statement.
This commit is contained in:
Родитель
927d72414b
Коммит
9d6df78d44
|
@ -741,6 +741,8 @@ class DefinitionNode extends ControlFlowNode {
|
|||
exists(Assign a | a.getATarget().(Tuple).getAnElt().getAFlowNode() = this)
|
||||
or
|
||||
exists(Assign a | a.getATarget().(List).getAnElt().getAFlowNode() = this)
|
||||
or
|
||||
exists(For for | for.getTarget().getAFlowNode() = this)
|
||||
}
|
||||
|
||||
/** flow node corresponding to the value assigned for the definition corresponding to this flow node */
|
||||
|
@ -860,7 +862,7 @@ class DictNode extends ControlFlowNode {
|
|||
|
||||
}
|
||||
|
||||
private Expr assigned_value(Expr lhs) {
|
||||
private AstNode assigned_value(Expr lhs) {
|
||||
/* lhs = result */
|
||||
exists(Assign a | a.getATarget() = lhs and result = a.getValue())
|
||||
or
|
||||
|
@ -877,6 +879,8 @@ private Expr assigned_value(Expr lhs) {
|
|||
lhs = target.getElt(index) and
|
||||
result = values.getElt(index)
|
||||
)
|
||||
or
|
||||
result.(For).getTarget() = lhs
|
||||
}
|
||||
|
||||
/** A flow node for a `for` statement. */
|
||||
|
|
|
@ -58,12 +58,10 @@ abstract class PythonSsaSourceVariable extends SsaSourceVariable {
|
|||
or
|
||||
SsaSource::assignment_definition(this, def, _)
|
||||
or
|
||||
SsaSource::multi_assignment_definition(this, def)
|
||||
SsaSource::multi_assignment_definition(this, def, _, _)
|
||||
or
|
||||
SsaSource::deletion_definition(this, def)
|
||||
or
|
||||
SsaSource::iteration_defined_variable(this, def, _)
|
||||
or
|
||||
SsaSource::init_module_submodule_defn(this, def)
|
||||
or
|
||||
SsaSource::parameter_definition(this, def)
|
||||
|
@ -381,10 +379,11 @@ cached module SsaSource {
|
|||
}
|
||||
|
||||
/** Holds if `v` is defined by multiple assignment at `defn`. */
|
||||
cached predicate multi_assignment_definition(Variable v, ControlFlowNode defn) {
|
||||
cached predicate multi_assignment_definition(Variable v, ControlFlowNode defn, int n, SequenceNode lhs) {
|
||||
defn.(NameNode).defines(v) and
|
||||
not exists(defn.(DefinitionNode).getValue()) and
|
||||
exists(SequenceNode s | s.getAnElement() = defn)
|
||||
lhs.getElement(n) = defn and
|
||||
lhs.getBasicBlock().dominates(defn.getBasicBlock())
|
||||
}
|
||||
|
||||
/** Holds if `v` is defined by a `for` statement, the definition being `defn` */
|
||||
|
|
|
@ -48,6 +48,9 @@ abstract class CallableObjectInternal extends ObjectInternal {
|
|||
|
||||
override string strValue() { none() }
|
||||
|
||||
/* Callables aren't iterable */
|
||||
override ObjectInternal getIterNext() { none() }
|
||||
|
||||
}
|
||||
|
||||
/** Class representing Python functions */
|
||||
|
|
|
@ -89,6 +89,10 @@ abstract class ClassObjectInternal extends ObjectInternal {
|
|||
}
|
||||
|
||||
override predicate subscriptUnknown() { none() }
|
||||
|
||||
/* Classes aren't usually iterable, but can e.g. Enums */
|
||||
override ObjectInternal getIterNext() { result = ObjectInternal::unknown() }
|
||||
|
||||
}
|
||||
|
||||
/** Class representing Python source classes */
|
||||
|
|
|
@ -83,6 +83,9 @@ private abstract class BooleanObjectInternal extends ConstantObjectInternal {
|
|||
none()
|
||||
}
|
||||
|
||||
/* Booleans aren't iterable */
|
||||
override ObjectInternal getIterNext() { none() }
|
||||
|
||||
}
|
||||
|
||||
private class TrueObjectInternal extends BooleanObjectInternal, TTrue {
|
||||
|
@ -165,6 +168,9 @@ private class NoneObjectInternal extends ConstantObjectInternal, TNone {
|
|||
|
||||
override int length() { none() }
|
||||
|
||||
/* None isn't iterable */
|
||||
override ObjectInternal getIterNext() { none() }
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -203,6 +209,9 @@ private class IntObjectInternal extends ConstantObjectInternal, TInt {
|
|||
|
||||
override int length() { none() }
|
||||
|
||||
/* ints aren't iterable */
|
||||
override ObjectInternal getIterNext() { none() }
|
||||
|
||||
}
|
||||
|
||||
private class FloatObjectInternal extends ConstantObjectInternal, TFloat {
|
||||
|
@ -248,6 +257,9 @@ private class FloatObjectInternal extends ConstantObjectInternal, TFloat {
|
|||
|
||||
override int length() { none() }
|
||||
|
||||
/* floats aren't iterable */
|
||||
override ObjectInternal getIterNext() { none() }
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -290,6 +302,10 @@ private class UnicodeObjectInternal extends ConstantObjectInternal, TUnicode {
|
|||
result = this.strValue().length()
|
||||
}
|
||||
|
||||
override ObjectInternal getIterNext() {
|
||||
result = TUnknownInstance(this.getClass())
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class BytesObjectInternal extends ConstantObjectInternal, TBytes {
|
||||
|
@ -331,6 +347,10 @@ private class BytesObjectInternal extends ConstantObjectInternal, TBytes {
|
|||
result = this.strValue().length()
|
||||
}
|
||||
|
||||
override ObjectInternal getIterNext() {
|
||||
result = TUnknownInstance(this.getClass())
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -91,6 +91,9 @@ class PropertyInternal extends ObjectInternal, TProperty {
|
|||
)
|
||||
}
|
||||
|
||||
/* Properties aren't iterable */
|
||||
override ObjectInternal getIterNext() { none() }
|
||||
|
||||
}
|
||||
|
||||
/** A class representing classmethods in Python */
|
||||
|
@ -176,6 +179,9 @@ class ClassMethodObjectInternal extends ObjectInternal, TClassMethod {
|
|||
result = this.getFunction().getName()
|
||||
}
|
||||
|
||||
/* Classmethods aren't iterable */
|
||||
override ObjectInternal getIterNext() { none() }
|
||||
|
||||
}
|
||||
|
||||
class StaticMethodObjectInternal extends ObjectInternal, TStaticMethod {
|
||||
|
@ -247,4 +253,7 @@ class StaticMethodObjectInternal extends ObjectInternal, TStaticMethod {
|
|||
result = this.getFunction().getName()
|
||||
}
|
||||
|
||||
/* Staticmethods aren't iterable */
|
||||
override ObjectInternal getIterNext() { none() }
|
||||
|
||||
}
|
||||
|
|
|
@ -51,6 +51,8 @@ abstract class InstanceObject extends ObjectInternal {
|
|||
|
||||
override string getName() { none() }
|
||||
|
||||
override ObjectInternal getIterNext() { result = ObjectInternal::unknown() }
|
||||
|
||||
}
|
||||
|
||||
private predicate self_variable_reaching_init_exit(EssaVariable self) {
|
||||
|
@ -366,6 +368,8 @@ class UnknownInstanceInternal extends TUnknownInstance, ObjectInternal {
|
|||
|
||||
override string getName() { none() }
|
||||
|
||||
override ObjectInternal getIterNext() { result = ObjectInternal::unknown() }
|
||||
|
||||
}
|
||||
|
||||
private int lengthFromClass(ClassObjectInternal cls) {
|
||||
|
@ -472,5 +476,7 @@ class SuperInstance extends TSuperInstance, ObjectInternal {
|
|||
|
||||
override string getName() { none() }
|
||||
|
||||
override ObjectInternal getIterNext() { result = ObjectInternal::unknown() }
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -52,6 +52,9 @@ abstract class ModuleObjectInternal extends ObjectInternal {
|
|||
any(PackageObjectInternal package).getInitModule() = this
|
||||
}
|
||||
|
||||
/* Modules aren't iterable */
|
||||
override ObjectInternal getIterNext() { none() }
|
||||
|
||||
}
|
||||
|
||||
/** A class representing built-in modules */
|
||||
|
@ -408,5 +411,8 @@ class AbsentModuleAttributeObjectInternal extends ObjectInternal, TAbsentModuleA
|
|||
/* We know what this is called, but not its innate name */
|
||||
override string getName() { none() }
|
||||
|
||||
/* Modules aren't iterable */
|
||||
override ObjectInternal getIterNext() { none() }
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -167,6 +167,12 @@ class ObjectInternal extends TObject {
|
|||
*/
|
||||
abstract string getName();
|
||||
|
||||
/** Gets the 'object' resulting from iterating over this object.
|
||||
* Used in the context `for i in this:`. The result is the 'object'
|
||||
* assigned to `i`.
|
||||
*/
|
||||
abstract ObjectInternal getIterNext();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -249,6 +255,9 @@ class BuiltinOpaqueObjectInternal extends ObjectInternal, TBuiltinOpaqueObject {
|
|||
override string getName() {
|
||||
result = this.getBuiltin().getName()
|
||||
}
|
||||
|
||||
override ObjectInternal getIterNext() { result = ObjectInternal::unknown() }
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -326,6 +335,8 @@ class UnknownInternal extends ObjectInternal, TUnknown {
|
|||
|
||||
override string getName() { none() }
|
||||
|
||||
override ObjectInternal getIterNext() { result = ObjectInternal::unknown() }
|
||||
|
||||
}
|
||||
|
||||
class UndefinedInternal extends ObjectInternal, TUndefined {
|
||||
|
@ -404,6 +415,8 @@ class UndefinedInternal extends ObjectInternal, TUndefined {
|
|||
|
||||
override string getName() { none() }
|
||||
|
||||
override ObjectInternal getIterNext() { none() }
|
||||
|
||||
}
|
||||
|
||||
module ObjectInternal {
|
||||
|
|
|
@ -32,6 +32,8 @@ abstract class SequenceObjectInternal extends ObjectInternal {
|
|||
|
||||
override string getName() { none() }
|
||||
|
||||
override ObjectInternal getIterNext() { result = this.getItem(_) }
|
||||
|
||||
}
|
||||
|
||||
abstract class TupleObjectInternal extends SequenceObjectInternal {
|
||||
|
|
|
@ -234,13 +234,21 @@ class ExceptionCapture extends PyNodeDefinition {
|
|||
class MultiAssignmentDefinition extends PyNodeDefinition {
|
||||
|
||||
MultiAssignmentDefinition() {
|
||||
SsaSource::multi_assignment_definition(this.getSourceVariable(), this.getDefiningNode())
|
||||
SsaSource::multi_assignment_definition(this.getSourceVariable(), this.getDefiningNode(), _, _)
|
||||
}
|
||||
|
||||
override string getRepresentation() {
|
||||
result = "..."
|
||||
exists(ControlFlowNode value, int n |
|
||||
this.indexOf(n, value) and
|
||||
result = value.(DefinitionNode).getValue().getNode().toString() + "[" + n + "]"
|
||||
)
|
||||
}
|
||||
|
||||
predicate indexOf(int index, SequenceNode lhs) {
|
||||
SsaSource::multi_assignment_definition(this.getSourceVariable(), this.getDefiningNode(), index, lhs)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -294,21 +302,27 @@ class ParameterDefinition extends PyNodeDefinition {
|
|||
|
||||
}
|
||||
|
||||
/** A definition of a variable in a for loop `for v in ...:` */
|
||||
class IterationDefinition extends PyNodeDefinition {
|
||||
|
||||
ControlFlowNode sequence;
|
||||
private newtype TIterationDefinition =
|
||||
TIterationDefinition_(SsaSourceVariable var, ControlFlowNode def, ControlFlowNode sequence) {
|
||||
SsaSource::iteration_defined_variable(var, def, sequence)
|
||||
}
|
||||
|
||||
IterationDefinition() {
|
||||
SsaSource::iteration_defined_variable(this.getSourceVariable(), this.getDefiningNode(), sequence)
|
||||
/** DEPRECATED. For backwards compatibility only.
|
||||
* A definition of a variable in a for loop `for v in ...:` */
|
||||
deprecated class IterationDefinition extends TIterationDefinition {
|
||||
|
||||
string toString() {
|
||||
result = "IterationDefinition"
|
||||
}
|
||||
|
||||
ControlFlowNode getSequence() {
|
||||
result = sequence
|
||||
this = TIterationDefinition_(_, _, result)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/** A deletion of a variable `del v` */
|
||||
class DeletionDefinition extends PyNodeDefinition {
|
||||
|
||||
|
|
|
@ -208,6 +208,8 @@ cached module PointsToInternal {
|
|||
AttributePointsTo::pointsTo(f, context, value, origin)
|
||||
or
|
||||
f.(PointsToExtension).pointsTo(context, value, origin)
|
||||
or
|
||||
iteration_points_to(f, context, value, origin)
|
||||
}
|
||||
|
||||
/** Holds if the attribute `name` is required for `obj`
|
||||
|
@ -368,6 +370,20 @@ cached module PointsToInternal {
|
|||
//)
|
||||
}
|
||||
|
||||
/* Treat `ForNode` as intermediate step between sequence and iteration variable.
|
||||
* In otherwords treat `for i in x:` as being equivalent to `i = next(iter(x))`
|
||||
* attaching the value of `next(iter(x))` to the `ForNode`.
|
||||
*/
|
||||
pragma [noinline]
|
||||
private predicate iteration_points_to(ForNode for, PointsToContext context, ObjectInternal value, ControlFlowNode origin) {
|
||||
exists(ControlFlowNode seqNode, ObjectInternal seq |
|
||||
for.iterates(_, seqNode) and
|
||||
pointsTo(seqNode, context, seq, _) and
|
||||
value = seq.getIterNext() and
|
||||
origin = for
|
||||
)
|
||||
}
|
||||
|
||||
/** Holds if the ESSA definition `def` refers to `(value, origin)` given the context `context`. */
|
||||
private predicate ssa_definition_points_to(EssaDefinition def, PointsToContext context, ObjectInternal value, CfgOrigin origin) {
|
||||
ssa_phi_points_to(def, context, value, origin)
|
||||
|
@ -394,6 +410,8 @@ cached module PointsToInternal {
|
|||
or
|
||||
assignment_points_to(def, context, value, origin)
|
||||
or
|
||||
multi_assignment_points_to(def, context, value, origin)
|
||||
or
|
||||
self_parameter_points_to(def, context, value, origin)
|
||||
or
|
||||
delete_points_to(def, context, value, origin)
|
||||
|
@ -403,8 +421,6 @@ cached module PointsToInternal {
|
|||
scope_entry_points_to(def, context, value, origin)
|
||||
or
|
||||
InterModulePointsTo::implicit_submodule_points_to(def, value, origin) and context.isImport()
|
||||
or
|
||||
iteration_definition_points_to(def, context, value, origin)
|
||||
/*
|
||||
* No points-to for non-local function entry definitions yet.
|
||||
*/
|
||||
|
@ -484,6 +500,16 @@ cached module PointsToInternal {
|
|||
pointsTo(def.getValue(), context, value, origin)
|
||||
}
|
||||
|
||||
pragma [noinline]
|
||||
private predicate multi_assignment_points_to(MultiAssignmentDefinition def, PointsToContext context, ObjectInternal value, ControlFlowNode origin) {
|
||||
exists(int index, ControlFlowNode rhs, SequenceObjectInternal sequence |
|
||||
def.indexOf(index, rhs) and
|
||||
pointsTo(rhs, context, sequence, _) and
|
||||
value = sequence.getItem(index) and
|
||||
origin = def.getDefiningNode()
|
||||
)
|
||||
}
|
||||
|
||||
/** Points-to for deletion: `del name`. */
|
||||
pragma [noinline]
|
||||
private predicate delete_points_to(DeletionDefinition def, PointsToContext context, ObjectInternal value, ControlFlowNode origin) {
|
||||
|
@ -563,11 +589,6 @@ cached module PointsToInternal {
|
|||
)
|
||||
}
|
||||
|
||||
private predicate iteration_definition_points_to(IterationDefinition def, PointsToContext context, ObjectInternal value, ControlFlowNode origin) {
|
||||
pointsTo(def.getSequence(), context, ObjectInternal::unknown(), _) and
|
||||
value = ObjectInternal::unknown() and origin = def.getDefiningNode()
|
||||
}
|
||||
|
||||
/** Holds if `f` is an expression node `tval if cond else fval` and points to `(value, origin)`. */
|
||||
private predicate if_exp_points_to(IfExprNode f, PointsToContext context, ObjectInternal value, ControlFlowNode origin) {
|
||||
pointsTo(f.getAnOperand(), context, value, origin)
|
||||
|
|
|
@ -1102,8 +1102,8 @@ library module TaintFlowImplementation {
|
|||
}
|
||||
|
||||
/** Holds if `v` is defined by a `for` statement, the definition being `defn` */
|
||||
cached predicate iteration_step(TaintedNode fromnode, TrackedValue totaint, CallContext tocontext, ControlFlowNode iter) {
|
||||
exists(ForNode for | for.iterates(iter, fromnode.getNode())) and
|
||||
cached predicate iteration_step(TaintedNode fromnode, TrackedValue totaint, CallContext tocontext, ForNode for) {
|
||||
for.iterates(_, fromnode.getNode()) and
|
||||
totaint = TTrackedTaint(fromnode.getTaintKind().getTaintForIteration()) and
|
||||
tocontext = fromnode.getContext()
|
||||
}
|
||||
|
@ -1202,9 +1202,6 @@ library module TaintFlowImplementation {
|
|||
tainted_with(def, context, origin)
|
||||
or
|
||||
tainted_exception_capture(def, context, origin)
|
||||
or
|
||||
tainted_iteration(def, context, origin)
|
||||
|
||||
}
|
||||
|
||||
predicate tainted_scope_entry(ScopeEntryDefinition def, CallContext context, TaintedNode origin) {
|
||||
|
@ -1407,11 +1404,6 @@ library module TaintFlowImplementation {
|
|||
context = fromnode.getContext()
|
||||
}
|
||||
|
||||
pragma [noinline]
|
||||
private predicate tainted_iteration(IterationDefinition def, CallContext context, TaintedNode fromnode) {
|
||||
def.getDefiningNode() = fromnode.getNode() and
|
||||
context = fromnode.getContext()
|
||||
}
|
||||
|
||||
/* A call that returns a copy (or similar) of the argument */
|
||||
predicate copyCall(ControlFlowNode fromnode, CallNode tonode) {
|
||||
|
|
|
@ -30,9 +30,9 @@
|
|||
| a_simple.py:18 | y_0 = ScopeEntryDefinition |
|
||||
| a_simple.py:19 | x_0 = None |
|
||||
| a_simple.py:20 | x_1 = phi(x_0, x_2) |
|
||||
| a_simple.py:20 | x_2 = ... |
|
||||
| a_simple.py:20 | x_2 = For[0] |
|
||||
| a_simple.py:20 | y_1 = phi(y_0, y_2) |
|
||||
| a_simple.py:20 | y_2 = ... |
|
||||
| a_simple.py:20 | y_2 = For[1] |
|
||||
| a_simple.py:23 | with_definition_0 = FunctionExpr |
|
||||
| a_simple.py:23 | x_0 = ParameterDefinition |
|
||||
| a_simple.py:24 | y_0 = with |
|
||||
|
@ -41,12 +41,27 @@
|
|||
| a_simple.py:27 | q_0 = ScopeEntryDefinition |
|
||||
| a_simple.py:27 | x_0 = ParameterDefinition |
|
||||
| a_simple.py:29 | p_1 = phi(p_0, p_2) |
|
||||
| a_simple.py:29 | p_2 = ... |
|
||||
| a_simple.py:29 | p_2 = For[0] |
|
||||
| a_simple.py:29 | q_1 = phi(q_0, q_2) |
|
||||
| a_simple.py:29 | q_2 = ... |
|
||||
| a_simple.py:29 | q_2 = For[1] |
|
||||
| a_simple.py:34 | args_0 = ParameterDefinition |
|
||||
| a_simple.py:34 | f_0 = FunctionExpr |
|
||||
| a_simple.py:34 | kwargs_0 = ParameterDefinition |
|
||||
| a_simple.py:38 | a_0 = ParameterDefinition |
|
||||
| a_simple.py:38 | b_0 = ParameterDefinition |
|
||||
| a_simple.py:38 | c_0 = ParameterDefinition |
|
||||
| a_simple.py:38 | multi_assign_and_packing_0 = FunctionExpr |
|
||||
| a_simple.py:39 | t_0 = Tuple |
|
||||
| a_simple.py:40 | w_0 = Tuple |
|
||||
| a_simple.py:41 | p_0 = t[0] |
|
||||
| a_simple.py:41 | q_0 = t[1] |
|
||||
| a_simple.py:41 | r_0 = t[2] |
|
||||
| a_simple.py:42 | x_0 = w[0] |
|
||||
| a_simple.py:42 | y_0 = w[1] |
|
||||
| a_simple.py:42 | z_0 = w[2] |
|
||||
| a_simple.py:49 | g_0 = a |
|
||||
| a_simple.py:49 | h_0 = b |
|
||||
| a_simple.py:49 | i_0 = c |
|
||||
| b_condition.py:0 | __name___0 = ScopeEntryDefinition |
|
||||
| b_condition.py:0 | __package___0 = ScopeEntryDefinition |
|
||||
| b_condition.py:0 | double_attr_check_0 = ScopeEntryDefinition |
|
||||
|
@ -101,7 +116,7 @@
|
|||
| b_condition.py:55 | v_0 = ScopeEntryDefinition |
|
||||
| b_condition.py:56 | v_1 = Pi(v_3) [false] |
|
||||
| b_condition.py:56 | v_2 = phi(v_0, v_1, v_5) |
|
||||
| b_condition.py:56 | v_3 = IterationDefinition |
|
||||
| b_condition.py:56 | v_3 = For |
|
||||
| b_condition.py:58 | v_4 = Pi(v_3) [true] |
|
||||
| b_condition.py:58 | v_5 = ArgumentRefinement(v_4) |
|
||||
| b_condition.py:61 | double_attr_check_1 = FunctionExpr |
|
||||
|
@ -687,8 +702,8 @@
|
|||
| r_regressions.py:42 | find_library_0 = FunctionExpr |
|
||||
| r_regressions.py:42 | gv_14 = ScopeEntryDefinition |
|
||||
| r_regressions.py:42 | name_0 = ParameterDefinition |
|
||||
| r_regressions.py:43 | __0 = ... |
|
||||
| r_regressions.py:43 | data_0 = ... |
|
||||
| r_regressions.py:43 | __0 = x()[1] |
|
||||
| r_regressions.py:43 | data_0 = x()[0] |
|
||||
| r_regressions.py:43 | gv_15 = CallsiteRefinement(gv_14) |
|
||||
| r_regressions.py:46 | fail_0 = FunctionExpr |
|
||||
| r_regressions.py:46 | gv_16 = ScopeEntryDefinition |
|
||||
|
|
|
@ -30,6 +30,21 @@
|
|||
| a_simple.py:34 | Global Variable f | AssignmentDefinition |
|
||||
| a_simple.py:34 | Local Variable args | ParameterDefinition |
|
||||
| a_simple.py:34 | Local Variable kwargs | ParameterDefinition |
|
||||
| a_simple.py:38 | Global Variable multi_assign_and_packing | AssignmentDefinition |
|
||||
| a_simple.py:38 | Local Variable a | ParameterDefinition |
|
||||
| a_simple.py:38 | Local Variable b | ParameterDefinition |
|
||||
| a_simple.py:38 | Local Variable c | ParameterDefinition |
|
||||
| a_simple.py:39 | Local Variable t | AssignmentDefinition |
|
||||
| a_simple.py:40 | Local Variable w | AssignmentDefinition |
|
||||
| a_simple.py:41 | Local Variable p | MultiAssignmentDefinition |
|
||||
| a_simple.py:41 | Local Variable q | MultiAssignmentDefinition |
|
||||
| a_simple.py:41 | Local Variable r | MultiAssignmentDefinition |
|
||||
| a_simple.py:42 | Local Variable x | MultiAssignmentDefinition |
|
||||
| a_simple.py:42 | Local Variable y | MultiAssignmentDefinition |
|
||||
| a_simple.py:42 | Local Variable z | MultiAssignmentDefinition |
|
||||
| a_simple.py:49 | Local Variable g | AssignmentDefinition |
|
||||
| a_simple.py:49 | Local Variable h | AssignmentDefinition |
|
||||
| a_simple.py:49 | Local Variable i | AssignmentDefinition |
|
||||
| b_condition.py:0 | Global Variable __name__ | ScopeEntryDefinition |
|
||||
| b_condition.py:0 | Global Variable __package__ | ScopeEntryDefinition |
|
||||
| b_condition.py:0 | Global Variable double_attr_check | ScopeEntryDefinition |
|
||||
|
@ -82,7 +97,7 @@
|
|||
| b_condition.py:55 | Global Variable loop | AssignmentDefinition |
|
||||
| b_condition.py:55 | Local Variable seq | ParameterDefinition |
|
||||
| b_condition.py:55 | Local Variable v | ScopeEntryDefinition |
|
||||
| b_condition.py:56 | Local Variable v | IterationDefinition |
|
||||
| b_condition.py:56 | Local Variable v | AssignmentDefinition |
|
||||
| b_condition.py:56 | Local Variable v | PhiFunction |
|
||||
| b_condition.py:56 | Local Variable v | PyEdgeRefinement |
|
||||
| b_condition.py:58 | Local Variable v | ArgumentRefinement |
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
| a_simple.py:0 | Module code.a_simple | f1 | float 1.0 |
|
||||
| a_simple.py:0 | Module code.a_simple | func | Function func |
|
||||
| a_simple.py:0 | Module code.a_simple | i1 | int 0 |
|
||||
| a_simple.py:0 | Module code.a_simple | multi_assign_and_packing | Function multi_assign_and_packing |
|
||||
| a_simple.py:0 | Module code.a_simple | multi_loop | Function multi_loop |
|
||||
| a_simple.py:0 | Module code.a_simple | multi_loop_in_try | Function multi_loop_in_try |
|
||||
| a_simple.py:0 | Module code.a_simple | s | Tuple |
|
||||
|
|
|
@ -1,8 +1,19 @@
|
|||
| a_simple.py:20 | ControlFlowNode for For | 20 |
|
||||
| a_simple.py:20 | ControlFlowNode for seq | 18 |
|
||||
| a_simple.py:24 | ControlFlowNode for x | 23 |
|
||||
| a_simple.py:29 | ControlFlowNode for For | 29 |
|
||||
| a_simple.py:29 | ControlFlowNode for x | 27 |
|
||||
| a_simple.py:35 | ControlFlowNode for Subscript | 35 |
|
||||
| a_simple.py:36 | ControlFlowNode for Subscript | 36 |
|
||||
| a_simple.py:40 | ControlFlowNode for a | 38 |
|
||||
| a_simple.py:40 | ControlFlowNode for b | 38 |
|
||||
| a_simple.py:40 | ControlFlowNode for c | 38 |
|
||||
| a_simple.py:49 | ControlFlowNode for a | 38 |
|
||||
| a_simple.py:49 | ControlFlowNode for b | 38 |
|
||||
| a_simple.py:49 | ControlFlowNode for c | 38 |
|
||||
| a_simple.py:50 | ControlFlowNode for g | 38 |
|
||||
| a_simple.py:51 | ControlFlowNode for h | 38 |
|
||||
| a_simple.py:52 | ControlFlowNode for i | 38 |
|
||||
| b_condition.py:5 | ControlFlowNode for IfExp | 5 |
|
||||
| b_condition.py:5 | ControlFlowNode for cond | 5 |
|
||||
| b_condition.py:5 | ControlFlowNode for unknown | 5 |
|
||||
|
@ -68,6 +79,7 @@
|
|||
| b_condition.py:44 | ControlFlowNode for v2 | 39 |
|
||||
| b_condition.py:51 | ControlFlowNode for x | 50 |
|
||||
| b_condition.py:52 | ControlFlowNode for x | 50 |
|
||||
| b_condition.py:56 | ControlFlowNode for For | 56 |
|
||||
| b_condition.py:56 | ControlFlowNode for seq | 55 |
|
||||
| b_condition.py:57 | ControlFlowNode for v | 56 |
|
||||
| b_condition.py:58 | ControlFlowNode for use | 58 |
|
||||
|
|
|
@ -41,6 +41,32 @@ WARNING: Predicate points_to has been deprecated and may be removed in future (P
|
|||
| a_simple.py:36 | ControlFlowNode for UnaryExpr | bool False | builtin-class bool | 36 | runtime |
|
||||
| a_simple.py:36 | ControlFlowNode for UnaryExpr | bool True | builtin-class bool | 36 | runtime |
|
||||
| a_simple.py:36 | ControlFlowNode for kwargs | kwargs | builtin-class dict | 34 | runtime |
|
||||
| a_simple.py:38 | ControlFlowNode for FunctionExpr | Function multi_assign_and_packing | builtin-class function | 38 | import |
|
||||
| a_simple.py:38 | ControlFlowNode for Str | 'b' | builtin-class str | 38 | import |
|
||||
| a_simple.py:38 | ControlFlowNode for Str | 'c' | builtin-class str | 38 | import |
|
||||
| a_simple.py:38 | ControlFlowNode for multi_assign_and_packing | Function multi_assign_and_packing | builtin-class function | 38 | import |
|
||||
| a_simple.py:39 | ControlFlowNode for IntegerLiteral | int 1 | builtin-class int | 39 | runtime |
|
||||
| a_simple.py:39 | ControlFlowNode for IntegerLiteral | int 2 | builtin-class int | 39 | runtime |
|
||||
| a_simple.py:39 | ControlFlowNode for IntegerLiteral | int 3 | builtin-class int | 39 | runtime |
|
||||
| a_simple.py:39 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 39 | runtime |
|
||||
| a_simple.py:39 | ControlFlowNode for t | Tuple | builtin-class tuple | 39 | runtime |
|
||||
| a_simple.py:40 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 40 | runtime |
|
||||
| a_simple.py:40 | ControlFlowNode for b | 'b' | builtin-class str | 38 | runtime |
|
||||
| a_simple.py:40 | ControlFlowNode for c | 'c' | builtin-class str | 38 | runtime |
|
||||
| a_simple.py:40 | ControlFlowNode for w | Tuple | builtin-class tuple | 40 | runtime |
|
||||
| a_simple.py:41 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 39 | runtime |
|
||||
| a_simple.py:41 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 41 | runtime |
|
||||
| a_simple.py:41 | ControlFlowNode for t | Tuple | builtin-class tuple | 39 | runtime |
|
||||
| a_simple.py:42 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 40 | runtime |
|
||||
| a_simple.py:42 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 42 | runtime |
|
||||
| a_simple.py:42 | ControlFlowNode for w | Tuple | builtin-class tuple | 40 | runtime |
|
||||
| a_simple.py:49 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 49 | runtime |
|
||||
| a_simple.py:49 | ControlFlowNode for b | 'b' | builtin-class str | 38 | runtime |
|
||||
| a_simple.py:49 | ControlFlowNode for c | 'c' | builtin-class str | 38 | runtime |
|
||||
| a_simple.py:49 | ControlFlowNode for h | 'b' | builtin-class str | 38 | runtime |
|
||||
| a_simple.py:49 | ControlFlowNode for i | 'c' | builtin-class str | 38 | runtime |
|
||||
| a_simple.py:51 | ControlFlowNode for h | 'b' | builtin-class str | 38 | runtime |
|
||||
| a_simple.py:52 | ControlFlowNode for i | 'c' | builtin-class str | 38 | runtime |
|
||||
| b_condition.py:4 | ControlFlowNode for FunctionExpr | Function f | builtin-class function | 4 | import |
|
||||
| b_condition.py:4 | ControlFlowNode for f | Function f | builtin-class function | 4 | import |
|
||||
| b_condition.py:5 | ControlFlowNode for IfExp | NoneType None | builtin-class NoneType | 5 | runtime |
|
||||
|
|
|
@ -41,6 +41,32 @@ WARNING: Predicate points_to has been deprecated and may be removed in future (P
|
|||
| a_simple.py:36 | ControlFlowNode for UnaryExpr | bool False | builtin-class bool | 36 |
|
||||
| a_simple.py:36 | ControlFlowNode for UnaryExpr | bool True | builtin-class bool | 36 |
|
||||
| a_simple.py:36 | ControlFlowNode for kwargs | kwargs | builtin-class dict | 34 |
|
||||
| a_simple.py:38 | ControlFlowNode for FunctionExpr | Function multi_assign_and_packing | builtin-class function | 38 |
|
||||
| a_simple.py:38 | ControlFlowNode for Str | 'b' | builtin-class str | 38 |
|
||||
| a_simple.py:38 | ControlFlowNode for Str | 'c' | builtin-class str | 38 |
|
||||
| a_simple.py:38 | ControlFlowNode for multi_assign_and_packing | Function multi_assign_and_packing | builtin-class function | 38 |
|
||||
| a_simple.py:39 | ControlFlowNode for IntegerLiteral | int 1 | builtin-class int | 39 |
|
||||
| a_simple.py:39 | ControlFlowNode for IntegerLiteral | int 2 | builtin-class int | 39 |
|
||||
| a_simple.py:39 | ControlFlowNode for IntegerLiteral | int 3 | builtin-class int | 39 |
|
||||
| a_simple.py:39 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 39 |
|
||||
| a_simple.py:39 | ControlFlowNode for t | Tuple | builtin-class tuple | 39 |
|
||||
| a_simple.py:40 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 40 |
|
||||
| a_simple.py:40 | ControlFlowNode for b | 'b' | builtin-class str | 38 |
|
||||
| a_simple.py:40 | ControlFlowNode for c | 'c' | builtin-class str | 38 |
|
||||
| a_simple.py:40 | ControlFlowNode for w | Tuple | builtin-class tuple | 40 |
|
||||
| a_simple.py:41 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 39 |
|
||||
| a_simple.py:41 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 41 |
|
||||
| a_simple.py:41 | ControlFlowNode for t | Tuple | builtin-class tuple | 39 |
|
||||
| a_simple.py:42 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 40 |
|
||||
| a_simple.py:42 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 42 |
|
||||
| a_simple.py:42 | ControlFlowNode for w | Tuple | builtin-class tuple | 40 |
|
||||
| a_simple.py:49 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 49 |
|
||||
| a_simple.py:49 | ControlFlowNode for b | 'b' | builtin-class str | 38 |
|
||||
| a_simple.py:49 | ControlFlowNode for c | 'c' | builtin-class str | 38 |
|
||||
| a_simple.py:49 | ControlFlowNode for h | 'b' | builtin-class str | 38 |
|
||||
| a_simple.py:49 | ControlFlowNode for i | 'c' | builtin-class str | 38 |
|
||||
| a_simple.py:51 | ControlFlowNode for h | 'b' | builtin-class str | 38 |
|
||||
| a_simple.py:52 | ControlFlowNode for i | 'c' | builtin-class str | 38 |
|
||||
| b_condition.py:4 | ControlFlowNode for FunctionExpr | Function f | builtin-class function | 4 |
|
||||
| b_condition.py:4 | ControlFlowNode for f | Function f | builtin-class function | 4 |
|
||||
| b_condition.py:5 | ControlFlowNode for IfExp | NoneType None | builtin-class NoneType | 5 |
|
||||
|
|
|
@ -26,6 +26,13 @@ WARNING: Predicate ssa_variable_points_to has been deprecated and may be removed
|
|||
| a_simple.py:23 | with_definition_0 = FunctionExpr | Function with_definition | builtin-class function |
|
||||
| a_simple.py:27 | multi_loop_in_try_0 = FunctionExpr | Function multi_loop_in_try | builtin-class function |
|
||||
| a_simple.py:34 | f_0 = FunctionExpr | Function f | builtin-class function |
|
||||
| a_simple.py:38 | b_0 = ParameterDefinition | 'b' | builtin-class str |
|
||||
| a_simple.py:38 | c_0 = ParameterDefinition | 'c' | builtin-class str |
|
||||
| a_simple.py:38 | multi_assign_and_packing_0 = FunctionExpr | Function multi_assign_and_packing | builtin-class function |
|
||||
| a_simple.py:39 | t_0 = Tuple | Tuple | builtin-class tuple |
|
||||
| a_simple.py:40 | w_0 = Tuple | Tuple | builtin-class tuple |
|
||||
| a_simple.py:49 | h_0 = b | 'b' | builtin-class str |
|
||||
| a_simple.py:49 | i_0 = c | 'c' | builtin-class str |
|
||||
| b_condition.py:0 | __name___0 = ScopeEntryDefinition | 'code.b_condition' | builtin-class str |
|
||||
| b_condition.py:4 | f_0 = FunctionExpr | Function f | builtin-class function |
|
||||
| b_condition.py:5 | x_0 = IfExp | NoneType None | builtin-class NoneType |
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
| a_simple.py:0 | Global Variable f1 | Entry node for Module code.a_simple | definition |
|
||||
| a_simple.py:0 | Global Variable func | Entry node for Module code.a_simple | definition |
|
||||
| a_simple.py:0 | Global Variable i1 | Entry node for Module code.a_simple | definition |
|
||||
| a_simple.py:0 | Global Variable multi_assign_and_packing | Entry node for Module code.a_simple | definition |
|
||||
| a_simple.py:0 | Global Variable multi_loop | Entry node for Module code.a_simple | definition |
|
||||
| a_simple.py:0 | Global Variable multi_loop_in_try | Entry node for Module code.a_simple | definition |
|
||||
| a_simple.py:0 | Global Variable s | Entry node for Module code.a_simple | definition |
|
||||
|
@ -42,6 +43,32 @@
|
|||
| a_simple.py:34 | Local Variable args | Entry node for Function f | definition |
|
||||
| a_simple.py:34 | Local Variable kwargs | ControlFlowNode for kwargs | definition |
|
||||
| a_simple.py:34 | Local Variable kwargs | Entry node for Function f | definition |
|
||||
| a_simple.py:38 | Global Variable multi_assign_and_packing | ControlFlowNode for multi_assign_and_packing | definition |
|
||||
| a_simple.py:38 | Local Variable a | ControlFlowNode for a | definition |
|
||||
| a_simple.py:38 | Local Variable b | ControlFlowNode for b | definition |
|
||||
| a_simple.py:38 | Local Variable c | ControlFlowNode for c | definition |
|
||||
| a_simple.py:38 | Local Variable g | Entry node for Function multi_assign_and_packing | definition |
|
||||
| a_simple.py:38 | Local Variable h | Entry node for Function multi_assign_and_packing | definition |
|
||||
| a_simple.py:38 | Local Variable i | Entry node for Function multi_assign_and_packing | definition |
|
||||
| a_simple.py:38 | Local Variable p | Entry node for Function multi_assign_and_packing | definition |
|
||||
| a_simple.py:38 | Local Variable q | Entry node for Function multi_assign_and_packing | definition |
|
||||
| a_simple.py:38 | Local Variable r | Entry node for Function multi_assign_and_packing | definition |
|
||||
| a_simple.py:38 | Local Variable t | Entry node for Function multi_assign_and_packing | definition |
|
||||
| a_simple.py:38 | Local Variable w | Entry node for Function multi_assign_and_packing | definition |
|
||||
| a_simple.py:38 | Local Variable x | Entry node for Function multi_assign_and_packing | definition |
|
||||
| a_simple.py:38 | Local Variable y | Entry node for Function multi_assign_and_packing | definition |
|
||||
| a_simple.py:38 | Local Variable z | Entry node for Function multi_assign_and_packing | definition |
|
||||
| a_simple.py:39 | Local Variable t | ControlFlowNode for t | definition |
|
||||
| a_simple.py:40 | Local Variable w | ControlFlowNode for w | definition |
|
||||
| a_simple.py:41 | Local Variable p | ControlFlowNode for p | definition |
|
||||
| a_simple.py:41 | Local Variable q | ControlFlowNode for q | definition |
|
||||
| a_simple.py:41 | Local Variable r | ControlFlowNode for r | definition |
|
||||
| a_simple.py:42 | Local Variable x | ControlFlowNode for x | definition |
|
||||
| a_simple.py:42 | Local Variable y | ControlFlowNode for y | definition |
|
||||
| a_simple.py:42 | Local Variable z | ControlFlowNode for z | definition |
|
||||
| a_simple.py:49 | Local Variable g | ControlFlowNode for g | definition |
|
||||
| a_simple.py:49 | Local Variable h | ControlFlowNode for h | definition |
|
||||
| a_simple.py:49 | Local Variable i | ControlFlowNode for i | definition |
|
||||
| b_condition.py:0 | Global Variable __name__ | Entry node for Module code.b_condition | definition |
|
||||
| b_condition.py:0 | Global Variable __package__ | Entry node for Module code.b_condition | definition |
|
||||
| b_condition.py:0 | Global Variable double_attr_check | Entry node for Module code.b_condition | definition |
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
| a_simple.py:0 | f_0 | Exit node for Module code.a_simple |
|
||||
| a_simple.py:0 | func_0 | Exit node for Module code.a_simple |
|
||||
| a_simple.py:0 | i1_0 | Exit node for Module code.a_simple |
|
||||
| a_simple.py:0 | multi_assign_and_packing_0 | Exit node for Module code.a_simple |
|
||||
| a_simple.py:0 | multi_loop_0 | Exit node for Module code.a_simple |
|
||||
| a_simple.py:0 | multi_loop_in_try_0 | Exit node for Module code.a_simple |
|
||||
| a_simple.py:0 | s_0 | Exit node for Module code.a_simple |
|
||||
|
@ -55,6 +56,37 @@
|
|||
| a_simple.py:34 | kwargs_0 | Exit node for Function f |
|
||||
| a_simple.py:35 | args_0 | ControlFlowNode for args |
|
||||
| a_simple.py:36 | kwargs_0 | ControlFlowNode for kwargs |
|
||||
| a_simple.py:38 | a_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | b_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | c_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | g_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | h_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | i_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | p_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | q_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | r_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | t_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | w_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | x_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | y_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | z_0 | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:40 | a_0 | ControlFlowNode for a |
|
||||
| a_simple.py:40 | b_0 | ControlFlowNode for b |
|
||||
| a_simple.py:40 | c_0 | ControlFlowNode for c |
|
||||
| a_simple.py:41 | t_0 | ControlFlowNode for t |
|
||||
| a_simple.py:42 | w_0 | ControlFlowNode for w |
|
||||
| a_simple.py:43 | p_0 | ControlFlowNode for p |
|
||||
| a_simple.py:44 | q_0 | ControlFlowNode for q |
|
||||
| a_simple.py:45 | r_0 | ControlFlowNode for r |
|
||||
| a_simple.py:46 | x_0 | ControlFlowNode for x |
|
||||
| a_simple.py:47 | y_0 | ControlFlowNode for y |
|
||||
| a_simple.py:48 | z_0 | ControlFlowNode for z |
|
||||
| a_simple.py:49 | a_0 | ControlFlowNode for a |
|
||||
| a_simple.py:49 | b_0 | ControlFlowNode for b |
|
||||
| a_simple.py:49 | c_0 | ControlFlowNode for c |
|
||||
| a_simple.py:50 | g_0 | ControlFlowNode for g |
|
||||
| a_simple.py:51 | h_0 | ControlFlowNode for h |
|
||||
| a_simple.py:52 | i_0 | ControlFlowNode for i |
|
||||
| b_condition.py:0 | __name___0 | Exit node for Module code.b_condition |
|
||||
| b_condition.py:0 | __package___0 | Exit node for Module code.b_condition |
|
||||
| b_condition.py:0 | double_attr_check_1 | Exit node for Module code.b_condition |
|
||||
|
|
|
@ -23,6 +23,32 @@
|
|||
| a_simple.py:36 | ControlFlowNode for UnaryExpr | runtime | bool False | builtin-class bool |
|
||||
| a_simple.py:36 | ControlFlowNode for UnaryExpr | runtime | bool True | builtin-class bool |
|
||||
| a_simple.py:36 | ControlFlowNode for kwargs | runtime | instance of dict | builtin-class dict |
|
||||
| a_simple.py:38 | ControlFlowNode for FunctionExpr | import | Function multi_assign_and_packing | builtin-class function |
|
||||
| a_simple.py:38 | ControlFlowNode for Str | import | 'b' | builtin-class str |
|
||||
| a_simple.py:38 | ControlFlowNode for Str | import | 'c' | builtin-class str |
|
||||
| a_simple.py:39 | ControlFlowNode for IntegerLiteral | runtime | int 1 | builtin-class int |
|
||||
| a_simple.py:39 | ControlFlowNode for IntegerLiteral | runtime | int 2 | builtin-class int |
|
||||
| a_simple.py:39 | ControlFlowNode for IntegerLiteral | runtime | int 3 | builtin-class int |
|
||||
| a_simple.py:39 | ControlFlowNode for Tuple | runtime | (int 1, int 2, int 3, ) | builtin-class tuple |
|
||||
| a_simple.py:40 | ControlFlowNode for Tuple | runtime | (Unknown value, 'b', 'c', ) | builtin-class tuple |
|
||||
| a_simple.py:40 | ControlFlowNode for Tuple | runtime | (Unknown value, 'b', Unknown value, ) | builtin-class tuple |
|
||||
| a_simple.py:40 | ControlFlowNode for Tuple | runtime | (Unknown value, Unknown value, 'c', ) | builtin-class tuple |
|
||||
| a_simple.py:40 | ControlFlowNode for Tuple | runtime | (Unknown value, Unknown value, Unknown value, ) | builtin-class tuple |
|
||||
| a_simple.py:40 | ControlFlowNode for b | runtime | 'b' | builtin-class str |
|
||||
| a_simple.py:40 | ControlFlowNode for c | runtime | 'c' | builtin-class str |
|
||||
| a_simple.py:41 | ControlFlowNode for t | runtime | (int 1, int 2, int 3, ) | builtin-class tuple |
|
||||
| a_simple.py:42 | ControlFlowNode for w | runtime | (Unknown value, 'b', 'c', ) | builtin-class tuple |
|
||||
| a_simple.py:42 | ControlFlowNode for w | runtime | (Unknown value, 'b', Unknown value, ) | builtin-class tuple |
|
||||
| a_simple.py:42 | ControlFlowNode for w | runtime | (Unknown value, Unknown value, 'c', ) | builtin-class tuple |
|
||||
| a_simple.py:42 | ControlFlowNode for w | runtime | (Unknown value, Unknown value, Unknown value, ) | builtin-class tuple |
|
||||
| a_simple.py:49 | ControlFlowNode for Tuple | runtime | (Unknown value, 'b', 'c', ) | builtin-class tuple |
|
||||
| a_simple.py:49 | ControlFlowNode for Tuple | runtime | (Unknown value, 'b', Unknown value, ) | builtin-class tuple |
|
||||
| a_simple.py:49 | ControlFlowNode for Tuple | runtime | (Unknown value, Unknown value, 'c', ) | builtin-class tuple |
|
||||
| a_simple.py:49 | ControlFlowNode for Tuple | runtime | (Unknown value, Unknown value, Unknown value, ) | builtin-class tuple |
|
||||
| a_simple.py:49 | ControlFlowNode for b | runtime | 'b' | builtin-class str |
|
||||
| a_simple.py:49 | ControlFlowNode for c | runtime | 'c' | builtin-class str |
|
||||
| a_simple.py:51 | ControlFlowNode for h | runtime | 'b' | builtin-class str |
|
||||
| a_simple.py:52 | ControlFlowNode for i | runtime | 'c' | builtin-class str |
|
||||
| b_condition.py:4 | ControlFlowNode for FunctionExpr | import | Function f | builtin-class function |
|
||||
| b_condition.py:5 | ControlFlowNode for IfExp | runtime | None | builtin-class NoneType |
|
||||
| b_condition.py:5 | ControlFlowNode for None | runtime | None | builtin-class NoneType |
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
| a_simple.py:0 | f1 | Exit node for Module code.a_simple |
|
||||
| a_simple.py:0 | func | Exit node for Module code.a_simple |
|
||||
| a_simple.py:0 | i1 | Exit node for Module code.a_simple |
|
||||
| a_simple.py:0 | multi_assign_and_packing | Exit node for Module code.a_simple |
|
||||
| a_simple.py:0 | multi_loop | Exit node for Module code.a_simple |
|
||||
| a_simple.py:0 | multi_loop_in_try | Exit node for Module code.a_simple |
|
||||
| a_simple.py:0 | object | Exit node for Module code.a_simple |
|
||||
|
@ -40,6 +41,37 @@
|
|||
| a_simple.py:34 | kwargs | Exit node for Function f |
|
||||
| a_simple.py:35 | args | ControlFlowNode for args |
|
||||
| a_simple.py:36 | kwargs | ControlFlowNode for kwargs |
|
||||
| a_simple.py:38 | a | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | b | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | c | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | g | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | h | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | i | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | p | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | q | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | r | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | t | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | w | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | x | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | y | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:38 | z | Exit node for Function multi_assign_and_packing |
|
||||
| a_simple.py:40 | a | ControlFlowNode for a |
|
||||
| a_simple.py:40 | b | ControlFlowNode for b |
|
||||
| a_simple.py:40 | c | ControlFlowNode for c |
|
||||
| a_simple.py:41 | t | ControlFlowNode for t |
|
||||
| a_simple.py:42 | w | ControlFlowNode for w |
|
||||
| a_simple.py:43 | p | ControlFlowNode for p |
|
||||
| a_simple.py:44 | q | ControlFlowNode for q |
|
||||
| a_simple.py:45 | r | ControlFlowNode for r |
|
||||
| a_simple.py:46 | x | ControlFlowNode for x |
|
||||
| a_simple.py:47 | y | ControlFlowNode for y |
|
||||
| a_simple.py:48 | z | ControlFlowNode for z |
|
||||
| a_simple.py:49 | a | ControlFlowNode for a |
|
||||
| a_simple.py:49 | b | ControlFlowNode for b |
|
||||
| a_simple.py:49 | c | ControlFlowNode for c |
|
||||
| a_simple.py:50 | g | ControlFlowNode for g |
|
||||
| a_simple.py:51 | h | ControlFlowNode for h |
|
||||
| a_simple.py:52 | i | ControlFlowNode for i |
|
||||
| b_condition.py:0 | Exception | Exit node for Module code.b_condition |
|
||||
| b_condition.py:0 | TypeError | Exit node for Module code.b_condition |
|
||||
| b_condition.py:0 | __name__ | Exit node for Module code.b_condition |
|
||||
|
|
|
@ -34,3 +34,19 @@ def multi_loop_in_try(x):
|
|||
def f(*args, **kwargs):
|
||||
not args[0]
|
||||
not kwargs["x"]
|
||||
|
||||
def multi_assign_and_packing(a, b="b", c="c"):
|
||||
t = 1, 2, 3
|
||||
w = a, b, c
|
||||
p, q, r = t
|
||||
x, y, z = w
|
||||
p
|
||||
q
|
||||
r
|
||||
x
|
||||
y
|
||||
z
|
||||
g, h, i = a, b, c
|
||||
g
|
||||
h
|
||||
i
|
||||
|
|
|
@ -181,11 +181,11 @@
|
|||
| test.py:199 | ArgumentRefinement(t_3) | test.py:195 | Taint simple.test | SOURCE |
|
||||
| test.py:199 | Pi(t_0) [false] | test.py:195 | Taint simple.test | SOURCE |
|
||||
| test.py:202 | ITERABLE_SOURCE | test.py:202 | Taint iterable.simple | ITERABLE_SOURCE |
|
||||
| test.py:203 | IterationDefinition | test.py:203 | Taint simple.test | i |
|
||||
| test.py:203 | phi(i_0, i_2) | test.py:203 | Taint simple.test | i |
|
||||
| test.py:203 | For | test.py:203 | Taint simple.test | For |
|
||||
| test.py:203 | phi(i_0, i_2) | test.py:203 | Taint simple.test | For |
|
||||
| test.py:208 | List | test.py:208 | Taint [simple.test] | List |
|
||||
| test.py:209 | IterationDefinition | test.py:209 | Taint simple.test | i |
|
||||
| test.py:209 | phi(i_0, i_2) | test.py:209 | Taint simple.test | i |
|
||||
| test.py:213 | IterationDefinition | test.py:213 | Taint simple.test | x |
|
||||
| test.py:213 | phi(x_2, x_3) | test.py:213 | Taint simple.test | x |
|
||||
| test.py:214 | ArgumentRefinement(x_1) | test.py:213 | Taint simple.test | x |
|
||||
| test.py:209 | For | test.py:209 | Taint simple.test | For |
|
||||
| test.py:209 | phi(i_0, i_2) | test.py:209 | Taint simple.test | For |
|
||||
| test.py:213 | For | test.py:213 | Taint simple.test | For |
|
||||
| test.py:213 | phi(x_2, x_3) | test.py:213 | Taint simple.test | For |
|
||||
| test.py:214 | ArgumentRefinement(x_1) | test.py:213 | Taint simple.test | For |
|
||||
|
|
|
@ -231,13 +231,13 @@
|
|||
| Taint simple.test | test.py:196 | t | |
|
||||
| Taint simple.test | test.py:197 | t | |
|
||||
| Taint simple.test | test.py:199 | t | |
|
||||
| Taint simple.test | test.py:203 | i | |
|
||||
| Taint simple.test | test.py:203 | For | |
|
||||
| Taint simple.test | test.py:204 | i | |
|
||||
| Taint simple.test | test.py:205 | i | |
|
||||
| Taint simple.test | test.py:208 | SOURCE | |
|
||||
| Taint simple.test | test.py:209 | i | |
|
||||
| Taint simple.test | test.py:209 | For | |
|
||||
| Taint simple.test | test.py:210 | i | |
|
||||
| Taint simple.test | test.py:213 | x | |
|
||||
| Taint simple.test | test.py:213 | For | |
|
||||
| Taint simple.test | test.py:214 | x | |
|
||||
| Taint {simple.test} | test.py:169 | Dict | |
|
||||
| Taint {simple.test} | test.py:171 | d | |
|
||||
|
|
|
@ -60,8 +60,8 @@
|
|||
| Taint [simple.test] | test.py:172 | x | | --> | Taint simple.test | test.py:172 | Subscript | |
|
||||
| Taint [simple.test] | test.py:174 | l | | --> | Taint [simple.test] | test.py:174 | list() | |
|
||||
| Taint [simple.test] | test.py:208 | List | | --> | Taint [simple.test] | test.py:209 | seq | |
|
||||
| Taint [simple.test] | test.py:209 | seq | | --> | Taint simple.test | test.py:209 | i | |
|
||||
| Taint [simple.test] | test.py:213 | flow_in_generator() | | --> | Taint simple.test | test.py:213 | x | |
|
||||
| Taint [simple.test] | test.py:209 | seq | | --> | Taint simple.test | test.py:209 | For | |
|
||||
| Taint [simple.test] | test.py:213 | flow_in_generator() | | --> | Taint simple.test | test.py:213 | For | |
|
||||
| Taint basic.custom | test.py:72 | arg | test.py:121 | --> | Taint basic.custom | test.py:73 | arg | test.py:121 |
|
||||
| Taint basic.custom | test.py:73 | arg | test.py:121 | --> | Taint basic.custom | test.py:121 | hub() | |
|
||||
| Taint basic.custom | test.py:120 | CUSTOM_SOURCE | | --> | Taint basic.custom | test.py:121 | t | |
|
||||
|
@ -87,7 +87,7 @@
|
|||
| Taint explicit.carrier | carrier.py:35 | x | | --> | Taint simple.test | carrier.py:35 | Attribute() | |
|
||||
| Taint falsey | test.py:189 | FALSEY | | --> | Taint falsey | test.py:190 | t | |
|
||||
| Taint iterable.simple | test.py:202 | ITERABLE_SOURCE | | --> | Taint iterable.simple | test.py:203 | t | |
|
||||
| Taint iterable.simple | test.py:203 | t | | --> | Taint simple.test | test.py:203 | i | |
|
||||
| Taint iterable.simple | test.py:203 | t | | --> | Taint simple.test | test.py:203 | For | |
|
||||
| Taint paper | rockpaperscissors.py:25 | Attribute() | | --> | Taint paper | rockpaperscissors.py:26 | y | |
|
||||
| Taint paper | rockpaperscissors.py:26 | y | | --> | Taint paper | rockpaperscissors.py:9 | arg | rockpaperscissors.py:26 |
|
||||
| Taint paper | rockpaperscissors.py:30 | Attribute() | | --> | Taint paper | rockpaperscissors.py:32 | y | |
|
||||
|
@ -186,12 +186,12 @@
|
|||
| Taint simple.test | test.py:195 | SOURCE | | --> | Taint simple.test | test.py:196 | t | |
|
||||
| Taint simple.test | test.py:195 | SOURCE | | --> | Taint simple.test | test.py:197 | t | |
|
||||
| Taint simple.test | test.py:195 | SOURCE | | --> | Taint simple.test | test.py:199 | t | |
|
||||
| Taint simple.test | test.py:203 | i | | --> | Taint simple.test | test.py:204 | i | |
|
||||
| Taint simple.test | test.py:203 | i | | --> | Taint simple.test | test.py:205 | i | |
|
||||
| Taint simple.test | test.py:203 | For | | --> | Taint simple.test | test.py:204 | i | |
|
||||
| Taint simple.test | test.py:203 | For | | --> | Taint simple.test | test.py:205 | i | |
|
||||
| Taint simple.test | test.py:208 | SOURCE | | --> | Taint [simple.test] | test.py:208 | List | |
|
||||
| Taint simple.test | test.py:209 | i | | --> | Taint simple.test | test.py:210 | i | |
|
||||
| Taint simple.test | test.py:209 | For | | --> | Taint simple.test | test.py:210 | i | |
|
||||
| Taint simple.test | test.py:210 | i | | --> | Taint [simple.test] | test.py:213 | flow_in_generator() | |
|
||||
| Taint simple.test | test.py:213 | x | | --> | Taint simple.test | test.py:214 | x | |
|
||||
| Taint simple.test | test.py:213 | For | | --> | Taint simple.test | test.py:214 | x | |
|
||||
| Taint {simple.test} | test.py:169 | Dict | | --> | Taint {simple.test} | test.py:171 | d | |
|
||||
| Taint {simple.test} | test.py:169 | Dict | | --> | Taint {simple.test} | test.py:175 | d | |
|
||||
| Taint {simple.test} | test.py:171 | d | | --> | Taint {simple.test} | test.py:173 | y | |
|
||||
|
|
|
@ -183,11 +183,11 @@
|
|||
| test.py:199 | t_3 | test.py:195 | Taint simple.test | SOURCE |
|
||||
| test.py:199 | t_4 | test.py:195 | Taint simple.test | SOURCE |
|
||||
| test.py:202 | t_0 | test.py:202 | Taint iterable.simple | ITERABLE_SOURCE |
|
||||
| test.py:203 | i_1 | test.py:203 | Taint simple.test | i |
|
||||
| test.py:203 | i_2 | test.py:203 | Taint simple.test | i |
|
||||
| test.py:203 | i_1 | test.py:203 | Taint simple.test | For |
|
||||
| test.py:203 | i_2 | test.py:203 | Taint simple.test | For |
|
||||
| test.py:208 | seq_0 | test.py:208 | Taint [simple.test] | List |
|
||||
| test.py:209 | i_1 | test.py:209 | Taint simple.test | i |
|
||||
| test.py:209 | i_2 | test.py:209 | Taint simple.test | i |
|
||||
| test.py:213 | x_0 | test.py:213 | Taint simple.test | x |
|
||||
| test.py:213 | x_1 | test.py:213 | Taint simple.test | x |
|
||||
| test.py:214 | x_2 | test.py:213 | Taint simple.test | x |
|
||||
| test.py:209 | i_1 | test.py:209 | Taint simple.test | For |
|
||||
| test.py:209 | i_2 | test.py:209 | Taint simple.test | For |
|
||||
| test.py:213 | x_0 | test.py:213 | Taint simple.test | For |
|
||||
| test.py:213 | x_1 | test.py:213 | Taint simple.test | For |
|
||||
| test.py:214 | x_2 | test.py:213 | Taint simple.test | For |
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
| 0 | 61 | 61 | 100.0 |
|
||||
| 0 | 77 | 77 | 100.0 |
|
||||
| 1 | 5 | 43 | 11.627906976744185 |
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
| 0 | 61 | 61 | 100.0 |
|
||||
| 0 | 77 | 77 | 100.0 |
|
||||
| 1 | 3 | 43 | 6.976744186046512 |
|
||||
|
|
|
@ -1 +1 @@
|
|||
| 1284 |
|
||||
| 1231 |
|
||||
|
|
Загрузка…
Ссылка в новой задаче