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" } 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) )