Skip to content

Commit 3e2ebf4

Browse files
committed
Move logic for dealing with groups into a predicate
1 parent f6b9195 commit 3e2ebf4

File tree

1 file changed

+25
-33
lines changed

1 file changed

+25
-33
lines changed

go/ql/lib/semmle/go/dataflow/ExternalFlow.qll

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,20 @@ private import codeql.mad.ModelValidation as SharedModelVal
9393
/** Gets the prefix for a group of packages. */
9494
string groupPrefix() { result = "group:" }
9595

96-
/** Gets a group that `package` is in, according to `packageGrouping`. */
97-
private string getGroup(string package) {
96+
/**
97+
* Gets a package represented by `packageOrGroup`.
98+
*
99+
* If `packageOrGroup` is of the form `group:<groupname>` then `result` is a
100+
* package in the group `<groupname>`, as determined by `packageGrouping`.
101+
* Otherwise, `result` is `packageOrGroup`.
102+
*/
103+
bindingset[packageOrGroup]
104+
private string getPackage(string packageOrGroup) {
105+
not exists(string s | packageOrGroup = groupPrefix() + s) and result = packageOrGroup
106+
or
98107
exists(string group |
99-
FlowExtensions::packageGrouping(group, package) and
100-
result = groupPrefix() + group
108+
FlowExtensions::packageGrouping(group, result) and
109+
packageOrGroup = groupPrefix() + group
101110
)
102111
}
103112

@@ -110,14 +119,10 @@ predicate sourceModel(
110119
string package, string type, boolean subtypes, string name, string signature, string ext,
111120
string output, string kind, string provenance, QlBuiltins::ExtensionId madId
112121
) {
113-
exists(string p |
114-
FlowExtensions::sourceModel(p, type, subtypes, name, signature, ext, output, kind, provenance,
115-
madId)
116-
|
117-
not exists(string s | p = groupPrefix() + s) and package = p
118-
or
119-
// Also look for models that are defined for a group that `package` is part of.
120-
p = getGroup(package)
122+
exists(string packageOrGroup |
123+
package = getPackage(packageOrGroup) and
124+
FlowExtensions::sourceModel(packageOrGroup, type, subtypes, name, signature, ext, output, kind,
125+
provenance, madId)
121126
)
122127
}
123128

@@ -130,14 +135,9 @@ predicate sinkModel(
130135
string package, string type, boolean subtypes, string name, string signature, string ext,
131136
string input, string kind, string provenance, QlBuiltins::ExtensionId madId
132137
) {
133-
exists(string p |
134-
FlowExtensions::sinkModel(p, type, subtypes, name, signature, ext, input, kind, provenance,
135-
madId)
136-
|
137-
not exists(string s | p = groupPrefix() + s) and package = p
138-
or
139-
// Also look for models that are defined for a group that `package` is part of.
140-
p = getGroup(package)
138+
exists(string packageOrGroup | package = getPackage(packageOrGroup) |
139+
FlowExtensions::sinkModel(packageOrGroup, type, subtypes, name, signature, ext, input, kind,
140+
provenance, madId)
141141
)
142142
}
143143

@@ -150,14 +150,9 @@ predicate summaryModel(
150150
string package, string type, boolean subtypes, string name, string signature, string ext,
151151
string input, string output, string kind, string provenance, QlBuiltins::ExtensionId madId
152152
) {
153-
exists(string p |
154-
FlowExtensions::summaryModel(p, type, subtypes, name, signature, ext, input, output, kind,
155-
provenance, madId)
156-
|
157-
not exists(string s | p = groupPrefix() + s) and package = p
158-
or
159-
// Also look for models that are defined for a group that `package` is part of.
160-
p = getGroup(package)
153+
exists(string packageOrGroup | package = getPackage(packageOrGroup) |
154+
FlowExtensions::summaryModel(packageOrGroup, type, subtypes, name, signature, ext, input,
155+
output, kind, provenance, madId)
161156
)
162157
}
163158

@@ -169,11 +164,8 @@ predicate summaryModel(
169164
predicate neutralModel(
170165
string package, string type, string name, string signature, string kind, string provenance
171166
) {
172-
exists(string p | FlowExtensions::neutralModel(p, type, name, signature, kind, provenance) |
173-
not exists(string s | p = groupPrefix() + s) and package = p
174-
or
175-
// Also look for models that are defined for a group that `package` is part of.
176-
p = getGroup(package)
167+
exists(string packageOrGroup | package = getPackage(packageOrGroup) |
168+
FlowExtensions::neutralModel(packageOrGroup, type, name, signature, kind, provenance)
177169
)
178170
}
179171

0 commit comments

Comments
 (0)