diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll index 9f76e7c7c95b..1cb89d108890 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll @@ -339,6 +339,14 @@ module BarrierGuard { localFlow(pragma[only_bind_out](outp.getNode(c)), resNode) } + pragma[noinline] + private predicate guardsNode(Node g, Node arg, Node ret) { + exists(ControlFlow::ConditionGuardNode guard | + guards(g, guard, arg) and + guard.dominates(ret.getBasicBlock()) + ) + } + /** * Holds if whenever `p` holds of output `outp` of function `f`, this node * is known to validate the input `inp` of `f`. @@ -357,10 +365,8 @@ module BarrierGuard { ret = outp.getEntryNode(fd) and ( // Case: a function like "if someBarrierGuard(arg) { return true } else { return false }" - exists(ControlFlow::ConditionGuardNode guard | - guards(g, guard, arg) and - guard.dominates(ret.getBasicBlock()) - | + guardsNode(g, arg, ret) and + ( exists(boolean b | onlyPossibleReturnOfBool(fd, outp, ret, b) and p.isBoolean(b)