Skip to content

Commit a02213e

Browse files
committed
change LoadStoreStep such that it can store in different property
1 parent 0feb7f8 commit a02213e

3 files changed

Lines changed: 27 additions & 5 deletions

File tree

javascript/ql/src/semmle/javascript/Promises.qll

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ module PromiseTypeTracking {
176176
summary = StoreStep(field) and
177177
step.store(pred, result, field)
178178
or
179-
summary = LoadStoreStep(field) and
179+
summary = LoadStoreStep(field, field) and
180180
step.loadStore(pred, result, field)
181181
)
182182
}
@@ -246,6 +246,12 @@ abstract private class PromiseFlowStep extends DataFlow::AdditionalFlowStep {
246246
final override predicate loadStoreStep(DataFlow::Node pred, DataFlow::Node succ, string prop) {
247247
this.loadStore(pred, succ, prop)
248248
}
249+
250+
final override predicate loadStoreStep(
251+
DataFlow::Node pred, DataFlow::Node succ, string loadProp, string storeProp
252+
) {
253+
none()
254+
}
249255
}
250256

251257
/**

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ class TypeTracker extends TTypeTracker {
5353
TypeTracker append(StepSummary step) {
5454
step = LevelStep() and result = this
5555
or
56-
step = LoadStoreStep(prop) and result = this
56+
exists(string toProp | step = LoadStoreStep(prop, toProp) |
57+
result = MkTypeTracker(hasCall, toProp)
58+
)
5759
or
5860
step = CallStep() and result = MkTypeTracker(true, prop)
5961
or
@@ -213,7 +215,9 @@ class TypeBackTracker extends TTypeBackTracker {
213215
TypeBackTracker prepend(StepSummary step) {
214216
step = LevelStep() and result = this
215217
or
216-
step = LoadStoreStep(prop) and result = this
218+
exists(string fromProp | step = LoadStoreStep(fromProp, prop) |
219+
result = MkTypeBackTracker(hasReturn, fromProp)
220+
)
217221
or
218222
step = CallStep() and hasReturn = false and result = this
219223
or

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ class OptionalPropertyName extends string {
2424
abstract class TypeTrackingPseudoProperty extends string {
2525
bindingset[this]
2626
TypeTrackingPseudoProperty() { any() }
27+
28+
/**
29+
* Gets a property name that `this` can be copied to in a `LoadStoreStep(this, result)`.
30+
*/
31+
string getLoadStoreToProp() { none() }
2732
}
2833

2934
/**
@@ -35,7 +40,12 @@ newtype TStepSummary =
3540
ReturnStep() or
3641
StoreStep(PropertyName prop) or
3742
LoadStep(PropertyName prop) or
38-
LoadStoreStep(PropertyName prop)
43+
LoadStoreStep(PropertyName fromProp, PropertyName toProp) {
44+
fromProp = toProp or
45+
exists(TypeTrackingPseudoProperty prop |
46+
fromProp = prop and toProp = prop.getLoadStoreToProp()
47+
)
48+
}
3949

4050
/**
4151
* INTERNAL: Use `TypeTracker` or `TypeBackTracker` instead.
@@ -55,7 +65,9 @@ class StepSummary extends TStepSummary {
5565
or
5666
exists(string prop | this = LoadStep(prop) | result = "load " + prop)
5767
or
58-
exists(string prop | this = LoadStoreStep(prop) | result = "in " + prop)
68+
exists(string fromProp, string toProp | this = LoadStoreStep(fromProp, toProp) |
69+
result = "copy " + fromProp + " to " + toProp
70+
)
5971
}
6072
}
6173

0 commit comments

Comments
 (0)