Skip to content

Commit e6290d0

Browse files
committed
wip
1 parent b4b1810 commit e6290d0

File tree

7 files changed

+15
-81
lines changed

7 files changed

+15
-81
lines changed

javascript/ql/lib/semmle/javascript/PackageExports.qll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,7 @@ private DataFlow::Node getAnExportFromModule(Module mod) {
237237
// exports saved to the global object
238238
result = DataFlow::globalObjectRef().getAPropertyWrite().getRhs() and
239239
result.getTopLevel() = mod
240-
or
241-
result.analyze().getAValue() = TAbstractModuleObject(mod)
240+
// TODO: perhaps rely on name resolution here?
242241
}
243242

244243
/**

javascript/ql/lib/semmle/javascript/dataflow/TypeInference.qll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ class AnalyzedNode extends DataFlow::Node {
169169
class AnalyzedValueNode extends AnalyzedNode, DataFlow::ValueNode { }
170170

171171
/**
172+
* DEPRECATED. Type inference is no longer used for reasoning about module exports.
173+
*
172174
* A module for which analysis results are available.
173175
*
174176
* The type inference supports AMD, CommonJS and ES2015 modules. All three
@@ -177,7 +179,7 @@ class AnalyzedValueNode extends AnalyzedNode, DataFlow::ValueNode { }
177179
* exports are modeled as property writes on `module.exports`, and imports
178180
* as property reads on any potential value of `module.exports`.
179181
*/
180-
class AnalyzedModule extends TopLevel instanceof Module {
182+
deprecated class AnalyzedModule extends TopLevel instanceof Module {
181183
/** Gets the name of this module. */
182184
string getName() { result = super.getName() }
183185

javascript/ql/lib/semmle/javascript/dataflow/internal/AbstractPropertiesImpl.qll

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,6 @@ newtype TAbstractProperty =
3030
* of the concrete objects represented by `baseVal`.
3131
*/
3232
AbstractValue getAnInitialPropertyValue(DefiniteAbstractValue baseVal, string propertyName) {
33-
// initially, `module.exports === exports`
34-
exists(Module m |
35-
baseVal = TAbstractModuleObject(m) and
36-
propertyName = "exports" and
37-
result = TAbstractExportsObject(m)
38-
)
39-
or
4033
// class members
4134
result = getAnInitialMemberValue(getMember(baseVal, propertyName))
4235
or
@@ -77,11 +70,7 @@ private AbstractValue getAnInitialMemberValue(MemberDefinition m) {
7770
* Holds if `baseVal` is an abstract value whose properties we track for the purposes
7871
* of `getALocalValue`.
7972
*/
80-
predicate shouldAlwaysTrackProperties(AbstractValue baseVal) {
81-
baseVal instanceof AbstractModuleObject or
82-
baseVal instanceof AbstractExportsObject or
83-
baseVal instanceof AbstractCallable
84-
}
73+
predicate shouldAlwaysTrackProperties(AbstractValue baseVal) { baseVal instanceof AbstractCallable }
8574

8675
/** Holds if `baseVal` is an abstract value whose properties we track. */
8776
predicate shouldTrackProperties(AbstractValue baseVal) {

javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSteps.qll

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,7 @@ import javascript
88
deprecated import semmle.javascript.dataflow.Configuration
99
import semmle.javascript.dataflow.internal.CallGraphs
1010
private import semmle.javascript.internal.CachedStages
11-
12-
/**
13-
* Holds if flow should be tracked through properties of `obj`.
14-
*
15-
* Flow is tracked through `module` and `module.exports` objects.
16-
*/
17-
predicate shouldTrackProperties(AbstractValue obj) {
18-
obj instanceof AbstractExportsObject or
19-
obj instanceof AbstractModuleObject
20-
}
11+
private import semmle.javascript.internal.NameResolution
2112

2213
/**
2314
* Holds if `source` corresponds to an expression returned by `f`, and
@@ -337,28 +328,16 @@ private module CachedSteps {
337328
)
338329
}
339330

340-
/**
341-
* Holds if there is an assignment to property `prop` of an object represented by `obj`
342-
* with right hand side `rhs` somewhere, and properties of `obj` should be tracked.
343-
*/
344-
pragma[noinline]
345-
private predicate trackedPropertyWrite(AbstractValue obj, string prop, DataFlow::Node rhs) {
346-
exists(AnalyzedPropertyWrite pw |
347-
pw.writes(obj, prop, rhs) and
348-
shouldTrackProperties(obj) and
349-
// avoid introducing spurious global flow
350-
not pw.baseIsIncomplete("global")
351-
)
352-
}
353-
354331
/**
355332
* Holds if there is a flow step from `pred` to `succ` through an object property.
356333
*/
357334
cached
358335
predicate propertyFlowStep(DataFlow::Node pred, DataFlow::Node succ) {
359-
exists(AbstractValue obj, string prop |
360-
trackedPropertyWrite(obj, prop, pred) and
361-
succ.(AnalyzedPropertyRead).reads(obj, prop)
336+
// TODO: Ensure name resolution has good enough support for NodeJS and AMD
337+
exists(NameResolution::Node node1, NameResolution::Node node2 |
338+
NameResolution::ValueFlow::resolvedReadStep(node1, node2) and
339+
pred = DataFlow::valueNode(node1) and
340+
succ = DataFlow::valueNode(node2)
362341
)
363342
}
364343

javascript/ql/lib/semmle/javascript/dataflow/internal/InterProceduralTypeInference.qll

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,6 @@ private class AnalyzedThisInBoundFunction extends AnalyzedThisExpr {
4545
}
4646
}
4747

48-
/**
49-
* Flow analysis for `this` expressions in node modules.
50-
*
51-
* These expressions are assumed to refer to the `module.exports` object.
52-
*/
53-
private class AnalyzedThisAsModuleExports extends DataFlow::AnalyzedNode, DataFlow::ThisNode {
54-
NodeModule m;
55-
56-
AnalyzedThisAsModuleExports() { m = this.getBindingContainer() }
57-
58-
override AbstractValue getALocalValue() { result = TAbstractExportsObject(m) }
59-
}
60-
6148
/**
6249
* Flow analysis for `this` expressions inside a function that is instantiated.
6350
*

javascript/ql/lib/semmle/javascript/dataflow/internal/VariableTypeInference.qll

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -159,28 +159,6 @@ private class AnalyzedRestParameter extends AnalyzedValueNode {
159159
override AbstractValue getALocalValue() { result = TAbstractOtherObject() }
160160
}
161161

162-
/**
163-
* Flow analysis for `module` and `exports` parameters of AMD modules.
164-
*/
165-
private class AnalyzedAmdParameter extends AnalyzedVarDef {
166-
AbstractValue implicitInitVal;
167-
168-
AnalyzedAmdParameter() {
169-
exists(AmdModule m, AmdModuleDefinition mdef | mdef = m.getDefine() |
170-
this = mdef.getModuleParameter() and
171-
implicitInitVal = TAbstractModuleObject(m)
172-
or
173-
this = mdef.getExportsParameter() and
174-
implicitInitVal = TAbstractExportsObject(m)
175-
)
176-
}
177-
178-
override AbstractValue getAnAssignedValue() {
179-
result = super.getAnAssignedValue() or
180-
result = implicitInitVal
181-
}
182-
}
183-
184162
/**
185163
* An SSA definitions that has been analyzed.
186164
*/
@@ -355,10 +333,6 @@ private predicate nodeBuiltins(Variable var, AbstractValue av) {
355333
exists(Module m, string name | var = m.getScope().getVariable(name) |
356334
name = "require" and av = TIndefiniteAbstractValue("heap")
357335
or
358-
name = "module" and av = TAbstractModuleObject(m)
359-
or
360-
name = "exports" and av = TAbstractExportsObject(m)
361-
or
362336
name = "arguments" and av = TAbstractOtherObject()
363337
or
364338
(name = "__filename" or name = "__dirname") and

javascript/ql/lib/semmle/javascript/internal/NameResolution.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,10 @@ module NameResolution {
386386
node2.(JSDocLocalTypeAccess).getALexicalName() = var
387387
)
388388
or
389+
resolvedReadStep(node1, node2)
390+
}
391+
392+
predicate resolvedReadStep(Node node1, Node node2) {
389393
exists(Node base, string name, ModuleLike mod |
390394
readStep(base, name, node2) and
391395
base = trackModule(mod) and

0 commit comments

Comments
 (0)