diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll index 52fe174cb1f..9dd71e7d20c 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll @@ -388,23 +388,27 @@ module LocalFlow { module VariableCapture { private import codeql.dataflow.VariableCapture as Shared - class ExprCfgNode extends ControlFlowNode { - ExprCfgNode() { isExpressionNode(this) } - } - - private predicate closureFlowStep(ExprCfgNode nodeFrom, ExprCfgNode nodeTo) { - // TODO: Other languages have an extra case here looking like - // simpleAstFlowStep(nodeFrom, nodeTo) - // we should investigate the potential benefit of adding that. - exists(SsaVariable def | - def.getAUse() = nodeTo and - def.getAnUltimateDefinition().getDefinition().(DefinitionNode).getValue() = nodeFrom - ) - } - private module CaptureInput implements Shared::InputSig { private import python as PY + additional class ExprCfgNode extends ControlFlowNode { + ExprCfgNode() { isExpressionNode(this) } + } + + private predicate closureFlowStep(ExprCfgNode nodeFrom, ExprCfgNode nodeTo) { + // TODO: Other languages have an extra case here looking like + // simpleAstFlowStep(nodeFrom, nodeTo) + // we should investigate the potential benefit of adding that. + exists(SsaVariable def | + def.getAUse() = nodeTo and + def.getAnUltimateDefinition().getDefinition().(DefinitionNode).getValue() = nodeFrom + ) + } + + class Callable extends Scope { + predicate isConstructor() { none() } + } + class BasicBlock extends PY::BasicBlock { Callable getEnclosingCallable() { result = this.getScope() } @@ -482,10 +486,6 @@ module VariableCapture { predicate hasAliasedAccess(Expr f) { closureFlowStep+(this, f) and not closureFlowStep(f, _) } } - - class Callable extends Scope { - predicate isConstructor() { none() } - } } class CapturedVariable = CaptureInput::CapturedVariable;