diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/FlowVar.qll b/cpp/ql/src/semmle/code/cpp/dataflow/internal/FlowVar.qll index 963b648727fb..1e22c1b1997e 100644 --- a/cpp/ql/src/semmle/code/cpp/dataflow/internal/FlowVar.qll +++ b/cpp/ql/src/semmle/code/cpp/dataflow/internal/FlowVar.qll @@ -221,9 +221,7 @@ module FlowVar_internal { BlockVar() { this = TBlockVar(sbb, v) } override VariableAccess getAnAccess() { - result.getTarget() = v and - result = getAReachedBlockVarSBB(this).getANode() and - not overwrite(result, _) + variableAccessInSBB(v, getAReachedBlockVarSBB(this), result) } override predicate definedByInitialValue(LocalScopeVariable lsv) { @@ -373,6 +371,15 @@ module FlowVar_internal { ) } + /** Holds if `va` is a read access to `v` in `sbb`, where `v` is modeled by `BlockVar`. */ + pragma[noinline] + private predicate variableAccessInSBB(Variable v, SubBasicBlock sbb, VariableAccess va) { + exists(TBlockVar(_, v)) and + va.getTarget() = v and + va = sbb.getANode() and + not overwrite(va, _) + } + /** * A local variable that is uninitialized immediately after its declaration. */