Skip to content

Commit 70c82c8

Browse files
author
Max Schaefer
committed
JavaScript: Make ModuleVarNode and ExportsVarNode more easily accessible.
1 parent c47d680 commit 70c82c8

File tree

2 files changed

+53
-50
lines changed

2 files changed

+53
-50
lines changed

javascript/ql/src/semmle/javascript/ApiGraphs.qll

Lines changed: 4 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -617,11 +617,11 @@ module API {
617617
cached
618618
predicate use(TApiNode nd, DataFlow::Node ref) {
619619
exists(string m, Module mod | nd = MkModuleDef(m) and mod = importableModule(m) |
620-
ref.(ModuleVarNode).getModule() = mod
620+
ref = DataFlow::moduleVarNode(mod)
621621
)
622622
or
623623
exists(string m, Module mod | nd = MkModuleExport(m) and mod = importableModule(m) |
624-
ref.(ExportsVarNode).getModule() = mod
624+
ref = DataFlow::exportsVarNode(mod)
625625
or
626626
exists(DataFlow::Node base | use(MkModuleDef(m), base) |
627627
ref = trackUseNode(base).getAPropertyRead("exports")
@@ -742,12 +742,9 @@ module API {
742742
or
743743
// additional backwards step from `require('m')` to `exports` or `module.exports` in m
744744
exists(Import imp | imp.getImportedModuleNode() = trackDefNode(nd, t.continue()) |
745-
result.(ExportsVarNode).getModule() = imp.getImportedModule()
745+
result = DataFlow::exportsVarNode(imp.getImportedModule())
746746
or
747-
exists(ModuleVarNode mod |
748-
mod.getModule() = imp.getImportedModule() and
749-
result = mod.(DataFlow::SourceNode).getAPropertyRead("exports")
750-
)
747+
result = DataFlow::moduleVarNode(imp.getImportedModule()).getAPropertyRead("exports")
751748
)
752749
or
753750
t = defStep(nd, result)
@@ -981,46 +978,3 @@ private module Label {
981978
/** Gets the `promisedError` edge label connecting a promise to its rejected value. */
982979
string promisedError() { result = "promisedError" }
983980
}
984-
985-
private class NodeModuleSourcesNodes extends DataFlow::SourceNode::Range {
986-
Variable v;
987-
988-
NodeModuleSourcesNodes() {
989-
exists(NodeModule m |
990-
this = DataFlow::ssaDefinitionNode(SSA::implicitInit(v)) and
991-
v = [m.getModuleVariable(), m.getExportsVariable()]
992-
)
993-
}
994-
995-
Variable getVariable() { result = v }
996-
}
997-
998-
/**
999-
* A CommonJS/AMD `module` variable.
1000-
*/
1001-
private class ModuleVarNode extends DataFlow::Node {
1002-
Module m;
1003-
1004-
ModuleVarNode() {
1005-
this.(NodeModuleSourcesNodes).getVariable() = m.(NodeModule).getModuleVariable()
1006-
or
1007-
DataFlow::parameterNode(this, m.(AmdModule).getDefine().getModuleParameter())
1008-
}
1009-
1010-
Module getModule() { result = m }
1011-
}
1012-
1013-
/**
1014-
* A CommonJS/AMD `exports` variable.
1015-
*/
1016-
private class ExportsVarNode extends DataFlow::Node {
1017-
Module m;
1018-
1019-
ExportsVarNode() {
1020-
this.(NodeModuleSourcesNodes).getVariable() = m.(NodeModule).getExportsVariable()
1021-
or
1022-
DataFlow::parameterNode(this, m.(AmdModule).getDefine().getExportsParameter())
1023-
}
1024-
1025-
Module getModule() { result = m }
1026-
}

javascript/ql/src/semmle/javascript/dataflow/Sources.qll

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,55 @@ module SourceNode {
347347
}
348348
}
349349

350+
private class NodeModuleSourcesNodes extends SourceNode::Range {
351+
Variable v;
352+
353+
NodeModuleSourcesNodes() {
354+
exists(NodeModule m |
355+
this = DataFlow::ssaDefinitionNode(SSA::implicitInit(v)) and
356+
v = [m.getModuleVariable(), m.getExportsVariable()]
357+
)
358+
}
359+
360+
Variable getVariable() { result = v }
361+
}
362+
363+
/**
364+
* A CommonJS/AMD `module` variable.
365+
*/
366+
private class ModuleVarNode extends DataFlow::Node {
367+
Module m;
368+
369+
ModuleVarNode() {
370+
this.(NodeModuleSourcesNodes).getVariable() = m.(NodeModule).getModuleVariable()
371+
or
372+
DataFlow::parameterNode(this, m.(AmdModule).getDefine().getModuleParameter())
373+
}
374+
375+
Module getModule() { result = m }
376+
}
377+
378+
/**
379+
* A CommonJS/AMD `exports` variable.
380+
*/
381+
private class ExportsVarNode extends DataFlow::Node {
382+
Module m;
383+
384+
ExportsVarNode() {
385+
this.(NodeModuleSourcesNodes).getVariable() = m.(NodeModule).getExportsVariable()
386+
or
387+
DataFlow::parameterNode(this, m.(AmdModule).getDefine().getExportsParameter())
388+
}
389+
390+
Module getModule() { result = m }
391+
}
392+
393+
/** Gets the CommonJS/AMD `module` variable for module `m`. */
394+
SourceNode moduleVarNode(Module m) { result.(ModuleVarNode).getModule() = m }
395+
396+
/** Gets the CommonJS/AMD `exports` variable for module `m`. */
397+
SourceNode exportsVarNode(Module m) { result.(ExportsVarNode).getModule() = m }
398+
350399
deprecated class DefaultSourceNode extends SourceNode {
351400
DefaultSourceNode() { this instanceof SourceNode::DefaultRange }
352401
}

0 commit comments

Comments
 (0)