Skip to content

Commit fd67e54

Browse files
committed
wip
1 parent d6a331d commit fd67e54

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

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

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,8 @@ module NameResolution {
356356
name = "$$promise-content" and
357357
result = imprt.getImportedPathExpr()
358358
)
359+
or
360+
storeToExports(result, mod, name)
359361
}
360362

361363
/**
@@ -373,6 +375,58 @@ module NameResolution {
373375
value = target.getAnAssignedExpr().(ObjectExpr).getPropertyByName(prop).getInit()
374376
}
375377

378+
pragma[nomagic]
379+
private GlobalVarAccess globalAccess(Module mod, string name) {
380+
result.getName() = name and
381+
result.getTopLevel() = mod and
382+
name = ["exports", "module"] // manually restrict size of predicate
383+
}
384+
385+
private Node moduleObjectRef(Module mod) {
386+
result = mod.getScope().getVariable("module").getAnAccess()
387+
or
388+
result = globalAccess(mod, "module")
389+
or
390+
commonStep(moduleObjectRef(mod), result)
391+
}
392+
393+
private Node exportsObjectRhs(Module mod) {
394+
exists(AssignExpr assign |
395+
assign.getLhs().(PropAccess).accesses(moduleObjectRef(mod), "exports") and
396+
result = assign.getRhs()
397+
)
398+
or
399+
commonStep(result, exportsObjectRhs(mod))
400+
}
401+
402+
private Node exportsObjectAlias(Module mod) {
403+
result = mod.getScope().getVariable("exports").getAnAccess()
404+
or
405+
result = globalAccess(mod, "exports")
406+
or
407+
result.(ThisExpr).getBindingContainer() = mod and
408+
mod instanceof NodeModule
409+
or
410+
readStep(moduleObjectRef(mod), "exports", result)
411+
or
412+
result = exportsObjectRhs(mod)
413+
or
414+
commonStep(exportsObjectAlias(mod), result)
415+
}
416+
417+
private predicate storeToExports(Node node, Module mod, string name) {
418+
exists(AssignExpr assign |
419+
node = assign.getRhs() and
420+
assign.getLhs().(PropAccess).accesses(exportsObjectAlias(mod), name)
421+
)
422+
or
423+
exists(Property prop |
424+
node = prop.getInit() and
425+
name = prop.getName() and
426+
prop.getObjectExpr() = exportsObjectAlias(mod)
427+
)
428+
}
429+
376430
/** Steps that only apply for this configuration. */
377431
private predicate specificStep(Node node1, Node node2) {
378432
exists(LexicalName var | S::isRelevantVariable(var) |

javascript/ql/test/library-tests/CallGraphs/AnnotatedTest/Test.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ spuriousCallee
22
missingCallee
33
| constructor-field.ts:40:5:40:14 | f3.build() | constructor-field.ts:13:3:13:12 | build() {} | -1 | calls |
44
| constructor-field.ts:71:1:71:11 | bf3.build() | constructor-field.ts:13:3:13:12 | build() {} | -1 | calls |
5+
| reExportLibClient.js:4:1:4:6 | ns.f() | lib.js:3:2:3:14 | function() {} | -1 | calls |
56
badAnnotation
67
accessorCall
78
| accessors.js:12:1:12:5 | obj.f | accessors.js:5:8:5:12 | () {} |

0 commit comments

Comments
 (0)