Skip to content

Commit 97ee8d8

Browse files
committed
refactor implementation to make Label implementations private
1 parent 6060f2e commit 97ee8d8

File tree

4 files changed

+143
-136
lines changed

4 files changed

+143
-136
lines changed

javascript/ql/lib/semmle/javascript/ApiGraphs.qll

Lines changed: 135 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -243,13 +243,13 @@ module API {
243243
* Gets a node such that there is an edge in the API graph between this node and the other
244244
* one, and that edge is labeled with `lbl`.
245245
*/
246-
Node getASuccessor(ApiLabel lbl) { Impl::edge(this, lbl, result) }
246+
Node getASuccessor(Label::ApiLabel lbl) { Impl::edge(this, lbl, result) }
247247

248248
/**
249249
* Gets a node such that there is an edge in the API graph between that other node and
250250
* this one, and that edge is labeled with `lbl`
251251
*/
252-
Node getAPredecessor(ApiLabel lbl) { this = result.getASuccessor(lbl) }
252+
Node getAPredecessor(Label::ApiLabel lbl) { this = result.getASuccessor(lbl) }
253253

254254
/**
255255
* Gets a node such that there is an edge in the API graph between this node and the other
@@ -315,7 +315,7 @@ module API {
315315
length = 0 and
316316
result = ""
317317
or
318-
exists(Node pred, ApiLabel lbl, string predpath |
318+
exists(Node pred, Label::ApiLabel lbl, string predpath |
319319
Impl::edge(pred, lbl, this) and
320320
predpath = pred.getAPath(length - 1) and
321321
exists(string space | if length = 1 then space = "" else space = " " |
@@ -383,9 +383,7 @@ module API {
383383
abstract DataFlow::Node getARhs();
384384

385385
/** Gets an API-node for this entry point. */
386-
API::Node getNode() {
387-
result = root().getASuccessor(any(Label::LabelEntryPoint l | l.getEntryPoint() = this))
388-
}
386+
API::Node getNode() { result = root().getASuccessor(Label::entryPoint(this)) }
389387
}
390388

391389
/**
@@ -474,11 +472,14 @@ module API {
474472
* incoming edge from `base` labeled `lbl` in the API graph.
475473
*/
476474
cached
477-
predicate rhs(TApiNode base, ApiLabel lbl, DataFlow::Node rhs) {
475+
predicate rhs(TApiNode base, Label::ApiLabel lbl, DataFlow::Node rhs) {
478476
hasSemantics(rhs) and
479477
(
480478
base = MkRoot() and
481-
rhs = lbl.(Label::LabelEntryPoint).getEntryPoint().getARhs()
479+
exists(EntryPoint e |
480+
lbl = Label::entryPoint(e) and
481+
rhs = e.getARhs()
482+
)
482483
or
483484
exists(string m, string prop |
484485
base = MkModuleExport(m) and
@@ -590,7 +591,7 @@ module API {
590591
*/
591592
pragma[noinline]
592593
private predicate propertyRead(
593-
DataFlow::SourceNode pred, string propDesc, ApiLabel lbl, DataFlow::Node ref
594+
DataFlow::SourceNode pred, string propDesc, Label::ApiLabel lbl, DataFlow::Node ref
594595
) {
595596
ref = pred.getAPropertyRead() and
596597
lbl = Label::memberFromRef(ref) and
@@ -614,11 +615,14 @@ module API {
614615
* `lbl` in the API graph.
615616
*/
616617
cached
617-
predicate use(TApiNode base, ApiLabel lbl, DataFlow::Node ref) {
618+
predicate use(TApiNode base, Label::ApiLabel lbl, DataFlow::Node ref) {
618619
hasSemantics(ref) and
619620
(
620621
base = MkRoot() and
621-
ref = lbl.(Label::LabelEntryPoint).getEntryPoint().getAUse()
622+
exists(EntryPoint e |
623+
lbl = Label::entryPoint(e) and
624+
ref = e.getAUse()
625+
)
622626
or
623627
// property reads
624628
exists(DataFlow::SourceNode src, DataFlow::SourceNode pred, string propDesc |
@@ -863,7 +867,7 @@ module API {
863867
* Holds if there is an edge from `pred` to `succ` in the API graph that is labeled with `lbl`.
864868
*/
865869
cached
866-
predicate edge(TApiNode pred, ApiLabel lbl, TApiNode succ) {
870+
predicate edge(TApiNode pred, Label::ApiLabel lbl, TApiNode succ) {
867871
Stages::APIStage::ref() and
868872
exists(string m |
869873
pred = MkRoot() and
@@ -941,8 +945,6 @@ module API {
941945
}
942946
}
943947

944-
import Label as EdgeLabel
945-
946948
/**
947949
* An `InvokeNode` that is connected to the API graph.
948950
*
@@ -999,121 +1001,24 @@ module API {
9991001
/** A `new` call connected to the API graph. */
10001002
class NewNode extends InvokeNode, DataFlow::NewNode { }
10011003

1002-
/** A label in the API-graph */
1003-
abstract class ApiLabel extends Label::TLabel {
1004-
string toString() { result = "???" }
1005-
}
1006-
1007-
private module Label {
1008-
newtype TLabel =
1009-
MkLabelMod(string mod) {
1010-
exists(Impl::MkModuleExport(mod)) or
1011-
exists(Impl::MkModuleImport(mod))
1012-
} or
1013-
MkLabelInstance() or
1014-
MkLabelMember(string prop) {
1015-
exports(_, prop, _) or
1016-
exists(any(DataFlow::ClassNode c).getInstanceMethod(prop)) or
1017-
prop = "exports" or
1018-
prop = any(CanonicalName c).getName() or
1019-
prop = any(DataFlow::PropRef p).getPropertyName() or
1020-
exists(Impl::MkTypeUse(_, prop)) or
1021-
exists(any(Module m).getAnExportedValue(prop))
1022-
} or
1023-
MkLabelUnknownMember() or
1024-
MkLabelParameter(int i) {
1025-
i =
1026-
[-1 .. max(int args |
1027-
args = any(InvokeExpr invk).getNumArgument() or
1028-
args = any(Function f).getNumParameter()
1029-
)] or
1030-
i = [0 .. 10]
1031-
} or
1032-
MkLabelReturn() or
1033-
MkLabelPromised() or
1034-
MkLabelPromisedError() or
1035-
MkLabelEntryPoint(API::EntryPoint e)
1036-
1037-
class LabelEntryPoint extends ApiLabel {
1038-
API::EntryPoint e;
1039-
1040-
LabelEntryPoint() { this = MkLabelEntryPoint(e) }
1041-
1042-
API::EntryPoint getEntryPoint() { result = e }
1043-
1044-
override string toString() { result = e }
1045-
}
1046-
1047-
class LabelPromised extends ApiLabel {
1048-
LabelPromised() { this = MkLabelPromised() }
1049-
1050-
override string toString() { result = "promised" }
1051-
}
1052-
1053-
class LabelPromisedError extends ApiLabel {
1054-
LabelPromisedError() { this = MkLabelPromisedError() }
1055-
1056-
override string toString() { result = "promised" }
1057-
}
1058-
1059-
class LabelReturn extends ApiLabel {
1060-
LabelReturn() { this = MkLabelReturn() }
1061-
1062-
override string toString() { result = "return" }
1063-
}
1064-
1065-
class LabelMod extends ApiLabel {
1066-
string mod;
1067-
1068-
LabelMod() { this = MkLabelMod(mod) }
1069-
1070-
string getMod() { result = mod }
1071-
1072-
override string toString() { result = "module " + mod }
1073-
}
1074-
1075-
class LabelInstance extends ApiLabel {
1076-
LabelInstance() { this = MkLabelInstance() }
1077-
1078-
override string toString() { result = "instance" }
1079-
}
1080-
1081-
class LabelMember extends ApiLabel {
1082-
string prop;
1083-
1084-
LabelMember() { this = MkLabelMember(prop) }
1085-
1086-
string getProperty() { result = prop }
1087-
1088-
override string toString() { result = "member " + prop }
1089-
}
1090-
1091-
class LabelUnknownMember extends ApiLabel {
1092-
LabelUnknownMember() { this = MkLabelUnknownMember() }
1093-
1094-
override string toString() { result = "member *" }
1095-
}
1096-
1097-
class LabelParameter extends ApiLabel {
1098-
int i;
1099-
1100-
LabelParameter() { this = MkLabelParameter(i) }
1101-
1102-
override string toString() { result = "parameter " + i }
1103-
1104-
int getIndex() { result = i }
1004+
/** Provides classes modeling the various edges (labels) in the API graph. */
1005+
module Label {
1006+
/** A label in the API-graph */
1007+
abstract class ApiLabel extends EdgeImpls::TLabel {
1008+
/** Gets a string representation of this label. */
1009+
string toString() { result = "???" }
11051010
}
11061011

11071012
/** Gets the edge label for the module `m`. */
1108-
LabelMod mod(string m) { result.getMod() = m }
1013+
EdgeImpls::LabelMod mod(string m) { result.getMod() = m }
11091014

11101015
/** Gets the `member` edge label for member `m`. */
11111016
bindingset[m]
11121017
bindingset[result]
1113-
LabelMember member(string m) { result.getProperty() = m }
1018+
EdgeImpls::LabelMember member(string m) { result.getProperty() = m }
11141019

11151020
/** Gets the `member` edge label for the unknown member. */
1116-
LabelUnknownMember unknownMember() { any() }
1021+
EdgeImpls::LabelUnknownMember unknownMember() { any() }
11171022

11181023
/**
11191024
* Gets a property name referred to by the given dynamic property access,
@@ -1151,26 +1056,130 @@ module API {
11511056
}
11521057

11531058
/** Gets the `instance` edge label. */
1154-
LabelInstance instance() { any() }
1059+
EdgeImpls::LabelInstance instance() { any() }
11551060

11561061
/**
11571062
* Gets the `parameter` edge label for the `i`th parameter.
11581063
*
11591064
* The receiver is considered to be parameter -1.
11601065
*/
1161-
LabelParameter parameter(int i) { result.getIndex() = i }
1066+
EdgeImpls::LabelParameter parameter(int i) { result.getIndex() = i }
11621067

11631068
/** Gets the `parameter` edge label for the receiver. */
1164-
LabelParameter receiver() { result = parameter(-1) }
1069+
EdgeImpls::LabelParameter receiver() { result = parameter(-1) }
11651070

11661071
/** Gets the `return` edge label. */
1167-
LabelReturn return() { any() }
1072+
EdgeImpls::LabelReturn return() { any() }
11681073

11691074
/** Gets the `promised` edge label connecting a promise to its contained value. */
1170-
MkLabelPromised promised() { any() }
1075+
EdgeImpls::LabelPromised promised() { any() }
11711076

11721077
/** Gets the `promisedError` edge label connecting a promise to its rejected value. */
1173-
MkLabelPromisedError promisedError() { any() }
1078+
EdgeImpls::LabelPromisedError promisedError() { any() }
1079+
1080+
/** Gets an entry-point label for the entry-point `e`. */
1081+
EdgeImpls::LabelEntryPoint entryPoint(API::EntryPoint e) { result.getEntryPoint() = e }
1082+
1083+
private module EdgeImpls {
1084+
newtype TLabel =
1085+
MkLabelMod(string mod) {
1086+
exists(Impl::MkModuleExport(mod)) or
1087+
exists(Impl::MkModuleImport(mod))
1088+
} or
1089+
MkLabelInstance() or
1090+
MkLabelMember(string prop) {
1091+
exports(_, prop, _) or
1092+
exists(any(DataFlow::ClassNode c).getInstanceMethod(prop)) or
1093+
prop = "exports" or
1094+
prop = any(CanonicalName c).getName() or
1095+
prop = any(DataFlow::PropRef p).getPropertyName() or
1096+
exists(Impl::MkTypeUse(_, prop)) or
1097+
exists(any(Module m).getAnExportedValue(prop))
1098+
} or
1099+
MkLabelUnknownMember() or
1100+
MkLabelParameter(int i) {
1101+
i =
1102+
[-1 .. max(int args |
1103+
args = any(InvokeExpr invk).getNumArgument() or
1104+
args = any(Function f).getNumParameter()
1105+
)] or
1106+
i = [0 .. 10]
1107+
} or
1108+
MkLabelReturn() or
1109+
MkLabelPromised() or
1110+
MkLabelPromisedError() or
1111+
MkLabelEntryPoint(API::EntryPoint e)
1112+
1113+
class LabelEntryPoint extends ApiLabel {
1114+
API::EntryPoint e;
1115+
1116+
LabelEntryPoint() { this = MkLabelEntryPoint(e) }
1117+
1118+
API::EntryPoint getEntryPoint() { result = e }
1119+
1120+
override string toString() { result = e }
1121+
}
1122+
1123+
class LabelPromised extends ApiLabel {
1124+
LabelPromised() { this = MkLabelPromised() }
1125+
1126+
override string toString() { result = "promised" }
1127+
}
1128+
1129+
class LabelPromisedError extends ApiLabel {
1130+
LabelPromisedError() { this = MkLabelPromisedError() }
1131+
1132+
override string toString() { result = "promised" }
1133+
}
1134+
1135+
class LabelReturn extends ApiLabel {
1136+
LabelReturn() { this = MkLabelReturn() }
1137+
1138+
override string toString() { result = "return" }
1139+
}
1140+
1141+
class LabelMod extends ApiLabel {
1142+
string mod;
1143+
1144+
LabelMod() { this = MkLabelMod(mod) }
1145+
1146+
string getMod() { result = mod }
1147+
1148+
override string toString() { result = "module " + mod }
1149+
}
1150+
1151+
class LabelInstance extends ApiLabel {
1152+
LabelInstance() { this = MkLabelInstance() }
1153+
1154+
override string toString() { result = "instance" }
1155+
}
1156+
1157+
class LabelMember extends ApiLabel {
1158+
string prop;
1159+
1160+
LabelMember() { this = MkLabelMember(prop) }
1161+
1162+
string getProperty() { result = prop }
1163+
1164+
override string toString() { result = "member " + prop }
1165+
}
1166+
1167+
class LabelUnknownMember extends ApiLabel {
1168+
LabelUnknownMember() { this = MkLabelUnknownMember() }
1169+
1170+
override string toString() { result = "member *" }
1171+
}
1172+
1173+
class LabelParameter extends ApiLabel {
1174+
int i;
1175+
1176+
LabelParameter() { this = MkLabelParameter(i) }
1177+
1178+
override string toString() { result = "parameter " + i }
1179+
1180+
int getIndex() { result = i }
1181+
}
1182+
}
11741183
}
11751184
}
11761185

javascript/ql/lib/semmle/javascript/security/dataflow/RemoteFlowSources.qll

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,17 +117,14 @@ private class RemoteFlowSourceAccessPath extends JSONString {
117117
string getSourceType() { result = sourceType }
118118

119119
/** Gets the `i`th component of the access path specifying this remote flow source. */
120-
API::ApiLabel getComponent(int i) {
120+
API::Label::ApiLabel getComponent(int i) {
121121
exists(string raw | raw = this.getValue().splitAt(".", i + 1) |
122122
i = 0 and
123-
result
124-
.(API::EdgeLabel::LabelEntryPoint)
125-
.getEntryPoint()
126-
.(ExternalRemoteFlowSourceSpecEntryPoint)
127-
.getName() = raw
123+
result =
124+
API::Label::entryPoint(any(ExternalRemoteFlowSourceSpecEntryPoint e | e.getName() = raw))
128125
or
129126
i > 0 and
130-
result = API::EdgeLabel::member(raw)
127+
result = API::Label::member(raw)
131128
)
132129
}
133130

javascript/ql/src/meta/ApiGraphs/ApiGraphEdges.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ import javascript
1212
import meta.MetaMetrics
1313

1414
select projectRoot(),
15-
count(API::Node pred, API::ApiLabel lbl, API::Node succ | succ = pred.getASuccessor(lbl))
15+
count(API::Node pred, API::Label::ApiLabel lbl, API::Node succ | succ = pred.getASuccessor(lbl))

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy