diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll index 47329d133a4..03975c6a54a 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll @@ -46,6 +46,14 @@ signature module ConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or isAdditionalFlowStep(_, node) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -141,6 +149,17 @@ signature module StateConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or + isAdditionalFlowStep(_, node) or + isAdditionalFlowStep(node, _, _, _) or + isAdditionalFlowStep(_, _, node, _) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll index fe8633e9218..29561b0f0a6 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll @@ -66,6 +66,12 @@ signature module FullStateConfigSig { */ predicate allowImplicitRead(Node node, ContentSet c); + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + predicate neverSkip(Node node); + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -2024,7 +2030,8 @@ module Impl { castNode(this.asNode()) or clearsContentCached(this.asNode(), _) or expectsContentCached(this.asNode(), _) or - neverSkipInPathGraph(this.asNode()) + neverSkipInPathGraph(this.asNode()) or + Config::neverSkip(this.asNode()) } } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll index be70086a93a..b0de9745816 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll index be70086a93a..b0de9745816 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll index be70086a93a..b0de9745816 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll index be70086a93a..b0de9745816 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll index be70086a93a..b0de9745816 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll index 47329d133a4..03975c6a54a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll @@ -46,6 +46,14 @@ signature module ConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or isAdditionalFlowStep(_, node) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -141,6 +149,17 @@ signature module StateConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or + isAdditionalFlowStep(_, node) or + isAdditionalFlowStep(node, _, _, _) or + isAdditionalFlowStep(_, _, node, _) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll index fe8633e9218..29561b0f0a6 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll @@ -66,6 +66,12 @@ signature module FullStateConfigSig { */ predicate allowImplicitRead(Node node, ContentSet c); + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + predicate neverSkip(Node node); + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -2024,7 +2030,8 @@ module Impl { castNode(this.asNode()) or clearsContentCached(this.asNode(), _) or expectsContentCached(this.asNode(), _) or - neverSkipInPathGraph(this.asNode()) + neverSkipInPathGraph(this.asNode()) or + Config::neverSkip(this.asNode()) } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll index be70086a93a..b0de9745816 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll index be70086a93a..b0de9745816 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll index be70086a93a..b0de9745816 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll index be70086a93a..b0de9745816 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll index 47329d133a4..03975c6a54a 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll @@ -46,6 +46,14 @@ signature module ConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or isAdditionalFlowStep(_, node) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -141,6 +149,17 @@ signature module StateConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or + isAdditionalFlowStep(_, node) or + isAdditionalFlowStep(node, _, _, _) or + isAdditionalFlowStep(_, _, node, _) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll index fe8633e9218..29561b0f0a6 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll @@ -66,6 +66,12 @@ signature module FullStateConfigSig { */ predicate allowImplicitRead(Node node, ContentSet c); + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + predicate neverSkip(Node node); + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -2024,7 +2030,8 @@ module Impl { castNode(this.asNode()) or clearsContentCached(this.asNode(), _) or expectsContentCached(this.asNode(), _) or - neverSkipInPathGraph(this.asNode()) + neverSkipInPathGraph(this.asNode()) or + Config::neverSkip(this.asNode()) } } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll index be70086a93a..b0de9745816 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll index be70086a93a..b0de9745816 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll index be70086a93a..b0de9745816 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll index be70086a93a..b0de9745816 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll index be70086a93a..b0de9745816 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll index 47329d133a4..03975c6a54a 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll @@ -46,6 +46,14 @@ signature module ConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or isAdditionalFlowStep(_, node) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -141,6 +149,17 @@ signature module StateConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or + isAdditionalFlowStep(_, node) or + isAdditionalFlowStep(node, _, _, _) or + isAdditionalFlowStep(_, _, node, _) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll index fe8633e9218..29561b0f0a6 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll @@ -66,6 +66,12 @@ signature module FullStateConfigSig { */ predicate allowImplicitRead(Node node, ContentSet c); + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + predicate neverSkip(Node node); + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -2024,7 +2030,8 @@ module Impl { castNode(this.asNode()) or clearsContentCached(this.asNode(), _) or expectsContentCached(this.asNode(), _) or - neverSkipInPathGraph(this.asNode()) + neverSkipInPathGraph(this.asNode()) or + Config::neverSkip(this.asNode()) } } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll index be70086a93a..b0de9745816 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll index be70086a93a..b0de9745816 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplForStringsNewReplacer.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplForStringsNewReplacer.qll index be70086a93a..b0de9745816 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplForStringsNewReplacer.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplForStringsNewReplacer.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll index be70086a93a..b0de9745816 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll index be70086a93a..b0de9745816 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll index be70086a93a..b0de9745816 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll index be70086a93a..b0de9745816 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll index be70086a93a..b0de9745816 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll index 47329d133a4..03975c6a54a 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll @@ -46,6 +46,14 @@ signature module ConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or isAdditionalFlowStep(_, node) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -141,6 +149,17 @@ signature module StateConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or + isAdditionalFlowStep(_, node) or + isAdditionalFlowStep(node, _, _, _) or + isAdditionalFlowStep(_, _, node, _) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll index fe8633e9218..29561b0f0a6 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll @@ -66,6 +66,12 @@ signature module FullStateConfigSig { */ predicate allowImplicitRead(Node node, ContentSet c); + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + predicate neverSkip(Node node); + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -2024,7 +2030,8 @@ module Impl { castNode(this.asNode()) or clearsContentCached(this.asNode(), _) or expectsContentCached(this.asNode(), _) or - neverSkipInPathGraph(this.asNode()) + neverSkipInPathGraph(this.asNode()) or + Config::neverSkip(this.asNode()) } } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll index be70086a93a..b0de9745816 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll index be70086a93a..b0de9745816 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll index be70086a93a..b0de9745816 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll index be70086a93a..b0de9745816 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll index 47329d133a4..03975c6a54a 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll @@ -46,6 +46,14 @@ signature module ConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or isAdditionalFlowStep(_, node) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -141,6 +149,17 @@ signature module StateConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or + isAdditionalFlowStep(_, node) or + isAdditionalFlowStep(node, _, _, _) or + isAdditionalFlowStep(_, _, node, _) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll index fe8633e9218..29561b0f0a6 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll @@ -66,6 +66,12 @@ signature module FullStateConfigSig { */ predicate allowImplicitRead(Node node, ContentSet c); + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + predicate neverSkip(Node node); + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -2024,7 +2030,8 @@ module Impl { castNode(this.asNode()) or clearsContentCached(this.asNode(), _) or expectsContentCached(this.asNode(), _) or - neverSkipInPathGraph(this.asNode()) + neverSkipInPathGraph(this.asNode()) or + Config::neverSkip(this.asNode()) } } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll index be70086a93a..b0de9745816 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll index be70086a93a..b0de9745816 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForHttpClientLibraries.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForHttpClientLibraries.qll index be70086a93a..b0de9745816 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForHttpClientLibraries.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForHttpClientLibraries.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForPathname.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForPathname.qll index be70086a93a..b0de9745816 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForPathname.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForPathname.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll index 47329d133a4..03975c6a54a 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll @@ -46,6 +46,14 @@ signature module ConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or isAdditionalFlowStep(_, node) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -141,6 +149,17 @@ signature module StateConfigSig { */ default predicate allowImplicitRead(Node node, ContentSet c) { none() } + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + default predicate neverSkip(Node node) { + isAdditionalFlowStep(node, _) or + isAdditionalFlowStep(_, node) or + isAdditionalFlowStep(node, _, _, _) or + isAdditionalFlowStep(_, _, node, _) + } + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll index fe8633e9218..29561b0f0a6 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll @@ -66,6 +66,12 @@ signature module FullStateConfigSig { */ predicate allowImplicitRead(Node node, ContentSet c); + /** + * Holds if `node` should never be skipped over in the `PathGraph` and in path + * explanations. + */ + predicate neverSkip(Node node); + /** * Gets the virtual dispatch branching limit when calculating field flow. * This can be overridden to a smaller value to improve performance (a @@ -2024,7 +2030,8 @@ module Impl { castNode(this.asNode()) or clearsContentCached(this.asNode(), _) or expectsContentCached(this.asNode(), _) or - neverSkipInPathGraph(this.asNode()) + neverSkipInPathGraph(this.asNode()) or + Config::neverSkip(this.asNode()) } } diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll index be70086a93a..b0de9745816 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll @@ -313,6 +313,8 @@ private module Config implements FullStateConfigSig { any(Configuration config).allowImplicitRead(node, c) } + predicate neverSkip(Node node) { none() } + int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } FlowFeature getAFeature() { result = any(Configuration config).getAFeature() }