Skip to content

Commit 2f0c80a

Browse files
committed
JS: Include summary steps in type tracking
1 parent 440cbb7 commit 2f0c80a

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import javascript
22
private import semmle.javascript.dataflow.TypeTracking
33
private import semmle.javascript.internal.CachedStages
4+
private import sharedlib.SummaryTypeTracker as SummaryTypeTracker
45
private import FlowSteps
56

67
cached
@@ -46,6 +47,12 @@ private module Cached {
4647
LoadStoreStep(PropertyName fromProp, PropertyName toProp) {
4748
SharedTypeTrackingStep::loadStoreStep(_, _, fromProp, toProp)
4849
or
50+
exists(DataFlow::ContentSet loadContent, DataFlow::ContentSet storeContent |
51+
SummaryTypeTracker::basicLoadStoreStep(_, _, loadContent, storeContent) and
52+
fromProp = loadContent.asPropertyName() and
53+
toProp = storeContent.asPropertyName()
54+
)
55+
or
4956
summarizedLoadStoreStep(_, _, fromProp, toProp)
5057
} or
5158
WithoutPropStep(PropertySet props) { SharedTypeTrackingStep::withoutPropStep(_, _, props) }
@@ -205,6 +212,21 @@ private module Cached {
205212
succ = getACallbackSource(parameter).getParameter(i) and
206213
summary = ReturnStep()
207214
)
215+
or
216+
SummaryTypeTracker::levelStepNoCall(pred, succ) and summary = LevelStep()
217+
or
218+
exists(DataFlow::ContentSet content |
219+
SummaryTypeTracker::basicLoadStep(pred, succ, content) and
220+
summary = LoadStep(content.asPropertyName())
221+
or
222+
SummaryTypeTracker::basicStoreStep(pred, succ, content) and
223+
summary = StoreStep(content.asPropertyName())
224+
)
225+
or
226+
exists(DataFlow::ContentSet loadContent, DataFlow::ContentSet storeContent |
227+
SummaryTypeTracker::basicLoadStoreStep(pred, succ, loadContent, storeContent) and
228+
summary = LoadStoreStep(loadContent.asPropertyName(), storeContent.asPropertyName())
229+
)
208230
}
209231
}
210232

javascript/ql/test/library-tests/TypeTracking2/summaries.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ function m0() {
66
function m1() {
77
const fn = mkSummary("Argument[0]", "ReturnValue");
88
const obj = source("m1.1");
9-
sink(fn(obj)); // $ MISSING: track=m1.1
9+
sink(fn(obj)); // $ track=m1.1
1010
sink(fn(obj.p));
1111
sink(fn(obj).p);
1212
sink(fn({ p: obj }));
@@ -19,7 +19,7 @@ function m2() {
1919
sink(fn(obj));
2020
sink(fn(obj.p));
2121
sink(fn(obj).p);
22-
sink(fn({ p: obj })); // $ MISSING: track=m2.1
22+
sink(fn({ p: obj })); // $ track=m2.1
2323
sink(fn({ p: obj }).q);
2424
}
2525

@@ -28,7 +28,7 @@ function m3() {
2828
const obj = source("m3.1");
2929
sink(fn(obj));
3030
sink(fn(obj.p));
31-
sink(fn(obj).p); // $ MISSING: track=m3.1
31+
sink(fn(obj).p); // $ track=m3.1
3232
sink(fn({ p: obj }));
3333
sink(fn({ p: obj }).q);
3434
}
@@ -41,5 +41,5 @@ function m4() {
4141
sink(fn(obj.p));
4242
sink(fn(obj).p);
4343
sink(fn({ p: obj }));
44-
sink(fn({ p: obj }).q); // $ MISSING: track=m4.1
44+
sink(fn({ p: obj }).q); // $ track=m4.1
4545
}

0 commit comments

Comments
 (0)