diff --git a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll index fcfcfe9ecd1d..a98e5ec8254d 100644 --- a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll +++ b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll @@ -70,6 +70,10 @@ module TypeTracking I> { private class ContentOption = ContentOption::Option; + private predicate isLocalSourceNode(LocalSourceNode n) { + not nonStandardFlowsTo(_, _) and exists(n) + } + cached private module Cached { cached @@ -249,21 +253,9 @@ module TypeTracking I> { returnStep(nodeFrom, nodeTo) and summary = ReturnStep() } - pragma[inline] - private predicate isLocalSourceNode(LocalSourceNode n) { any() } - cached - predicate standardFlowsTo(Node localSource, Node dst) { - not nonStandardFlowsTo(_, _) and - // explicit type check in base case to avoid repeated type tests in recursive case - isLocalSourceNode(localSource) and - dst = localSource - or - exists(Node mid | - standardFlowsTo(localSource, mid) and - simpleLocalSmallStep(mid, dst) - ) - } + predicate simpleLocalSmallStepPlus(Node localSource, Node dst) = + sourceBoundedFastTC(simpleLocalSmallStep/2, isLocalSourceNode/1)(localSource, dst) cached predicate stepNoCall(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { @@ -276,6 +268,14 @@ module TypeTracking I> { } } + pragma[inline] + private predicate standardFlowsTo(Node localSource, Node dst) { + isLocalSourceNode(localSource) and + dst = localSource + or + simpleLocalSmallStepPlus(localSource, dst) + } + import Cached /**