From 7f6c0f4080a173e7dc86655a0c2c6f223ca95c50 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 8 Dec 2025 09:43:52 +0100 Subject: [PATCH 1/2] JS: Allow isTypeUsed overrides to be global --- .../dataflow/internal/DataFlowNode.qll | 7 +++++- .../data/internal/ApiGraphModels.qll | 25 +++++++++++++------ .../library-tests/frameworks/data/test.ql | 1 - 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowNode.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowNode.qll index 4a354e1f7593..bc0fcacaf046 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowNode.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowNode.qll @@ -111,9 +111,14 @@ private module Cached { none() and // We want to prune irrelevant models before materialising data flow nodes, so types contributed // directly from CodeQL must expose their pruning info without depending on data flow nodes. - (any(ModelInput::TypeModel tm).isTypeUsed("") implies any()) + (isTypeUsedLocal() implies any()) } + overlay[global] + private predicate isTypeUsedGlobal() { any(ModelInput::TypeModel tm).isTypeUsed("") } + + private predicate isTypeUsedLocal() = forceLocal(isTypeUsedGlobal/0)() + cached private module Backref { cached diff --git a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModels.qll b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModels.qll index 80ec45a3cf17..77b478861c2b 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModels.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModels.qll @@ -393,20 +393,31 @@ predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { ) } +pragma[nomagic] +private predicate isTypeMentionedInModel(string type) { + sourceModel(type, _, _, _) or + sinkModel(type, _, _, _) or + summaryModel(type, _, _, _, _, _) or + typeModel(_, type, _) +} + +overlay[global] +private predicate isTypeUsedGlobal(string type) { + isTypeMentionedInModel(type) and any(TypeModel tm).isTypeUsed(type) +} + +overlay[local] +private predicate isTypeUsedLocal(string type) = forceLocal(isTypeUsedGlobal/1)(type) + /** * Holds if rows involving `type` might be relevant for the analysis of this database. */ predicate isRelevantType(string type) { - ( - sourceModel(type, _, _, _) or - sinkModel(type, _, _, _) or - summaryModel(type, _, _, _, _, _) or - typeModel(_, type, _) - ) and + isTypeMentionedInModel(type) and ( Specific::isTypeUsed(type) or - any(TypeModel model).isTypeUsed(type) + isTypeUsedLocal(type) or exists(TestAllModels t) ) diff --git a/javascript/ql/test/library-tests/frameworks/data/test.ql b/javascript/ql/test/library-tests/frameworks/data/test.ql index 6ba504e921fa..6a1d571351b4 100644 --- a/javascript/ql/test/library-tests/frameworks/data/test.ql +++ b/javascript/ql/test/library-tests/frameworks/data/test.ql @@ -2,7 +2,6 @@ import javascript deprecated import utils.test.ConsistencyChecking import semmle.javascript.frameworks.data.internal.ApiGraphModels as ApiGraphModels -overlay[local] class TypeModelFromCodeQL extends ModelInput::TypeModel { override predicate isTypeUsed(string type) { type = "danger-constant" } From 402e2dfb6493c1127c9b525939664c5b29e8efa9 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 8 Dec 2025 10:02:13 +0100 Subject: [PATCH 2/2] Sync files --- .../data/internal/ApiGraphModels.qll | 25 +++++++++++++------ .../data/internal/ApiGraphModels.qll | 25 +++++++++++++------ 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModels.qll b/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModels.qll index 80ec45a3cf17..77b478861c2b 100644 --- a/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModels.qll +++ b/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModels.qll @@ -393,20 +393,31 @@ predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { ) } +pragma[nomagic] +private predicate isTypeMentionedInModel(string type) { + sourceModel(type, _, _, _) or + sinkModel(type, _, _, _) or + summaryModel(type, _, _, _, _, _) or + typeModel(_, type, _) +} + +overlay[global] +private predicate isTypeUsedGlobal(string type) { + isTypeMentionedInModel(type) and any(TypeModel tm).isTypeUsed(type) +} + +overlay[local] +private predicate isTypeUsedLocal(string type) = forceLocal(isTypeUsedGlobal/1)(type) + /** * Holds if rows involving `type` might be relevant for the analysis of this database. */ predicate isRelevantType(string type) { - ( - sourceModel(type, _, _, _) or - sinkModel(type, _, _, _) or - summaryModel(type, _, _, _, _, _) or - typeModel(_, type, _) - ) and + isTypeMentionedInModel(type) and ( Specific::isTypeUsed(type) or - any(TypeModel model).isTypeUsed(type) + isTypeUsedLocal(type) or exists(TestAllModels t) ) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModels.qll b/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModels.qll index 80ec45a3cf17..77b478861c2b 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModels.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModels.qll @@ -393,20 +393,31 @@ predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { ) } +pragma[nomagic] +private predicate isTypeMentionedInModel(string type) { + sourceModel(type, _, _, _) or + sinkModel(type, _, _, _) or + summaryModel(type, _, _, _, _, _) or + typeModel(_, type, _) +} + +overlay[global] +private predicate isTypeUsedGlobal(string type) { + isTypeMentionedInModel(type) and any(TypeModel tm).isTypeUsed(type) +} + +overlay[local] +private predicate isTypeUsedLocal(string type) = forceLocal(isTypeUsedGlobal/1)(type) + /** * Holds if rows involving `type` might be relevant for the analysis of this database. */ predicate isRelevantType(string type) { - ( - sourceModel(type, _, _, _) or - sinkModel(type, _, _, _) or - summaryModel(type, _, _, _, _, _) or - typeModel(_, type, _) - ) and + isTypeMentionedInModel(type) and ( Specific::isTypeUsed(type) or - any(TypeModel model).isTypeUsed(type) + isTypeUsedLocal(type) or exists(TestAllModels t) )