Data flow: Cache known{Source,Sink}Model

This commit is contained in:
Tom Hvitved
2025-01-09 11:52:15 +01:00
parent a7bb95249b
commit 653d1227e3
2 changed files with 12 additions and 6 deletions

View File

@@ -1014,19 +1014,19 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
private predicate sourceModel(NodeEx node, string model) {
sourceNode(node, _) and
exists(Node n | n = node.asNode() |
knownSourceModel(n, model)
(
model = getSourceModel(node)
or
not knownSourceModel(n, _) and model = ""
not exists(getSourceModel(node)) and model = ""
)
}
private predicate sinkModel(NodeEx node, string model) {
sinkNode(node, _) and
exists(Node n | n = node.asNodeOrImplicitRead() |
knownSinkModel(n, model)
(
model = getSinkModel(node)
or
not knownSinkModel(n, _) and model = ""
not exists(getSinkModel(node)) and model = ""
)
}

View File

@@ -1063,6 +1063,12 @@ module MakeImplCommon<LocationSig Location, InputSig<Location> Lang> {
exists(n.asParamReturnNode())
}
cached
string getSourceModel(NodeEx node) { knownSourceModel(node.asNode(), result) }
cached
string getSinkModel(NodeEx node) { knownSinkModel(node.asNodeOrImplicitRead(), result) }
cached
predicate parameterNode(Node p, DataFlowCallable c, ParameterPosition pos) {
isParameterNode(p, c, pos)