Merge pull request #4649 from yoff/python-dataflow-cfgparameters

Python: Make `ParameterNode` a `CfgNode`
This commit is contained in:
Rasmus Wriedt Larsen
2020-11-11 10:22:12 +01:00
committed by GitHub
22 changed files with 632 additions and 438 deletions

View File

@@ -139,6 +139,11 @@ module EssaFlow {
contextManager.strictlyDominates(var)
)
or
exists(ParameterDefinition pd |
nodeFrom.asCfgNode() = pd.getDefiningNode() and
nodeTo.asVar() = pd.getVariable()
)
or
// First use after definition
// `y = 42`
// `x = f(y)`

View File

@@ -176,21 +176,21 @@ ExprNode exprNode(DataFlowExpr e) { result.getNode().getNode() = e }
* The value of a parameter at function entry, viewed as a node in a data
* flow graph.
*/
class ParameterNode extends EssaNode {
ParameterNode() { var instanceof ParameterDefinition }
class ParameterNode extends CfgNode {
ParameterDefinition def;
ParameterNode() { node = def.getDefiningNode() }
/**
* Holds if this node is the parameter of callable `c` at the
* (zero-based) index `i`.
*/
predicate isParameterOf(DataFlowCallable c, int i) {
var.(ParameterDefinition).getDefiningNode() = c.getParameter(i)
}
predicate isParameterOf(DataFlowCallable c, int i) { node = c.getParameter(i) }
override DataFlowCallable getEnclosingCallable() { this.isParameterOf(result, _) }
/** Gets the `Parameter` this `ParameterNode` represents. */
Parameter getParameter() { result = var.(ParameterDefinition).getParameter() }
Parameter getParameter() { result = def.getParameter() }
}
/**