Skip to content

Commit f384afb

Browse files
committed
JS: Also summarize loadStore steps
1 parent 3ad83cc commit f384afb

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ private module Cached {
4545
CopyStep(PropertyName prop) or
4646
LoadStoreStep(PropertyName fromProp, PropertyName toProp) {
4747
SharedTypeTrackingStep::loadStoreStep(_, _, fromProp, toProp)
48+
or
49+
summarizedLoadStoreStep(_, _, fromProp, toProp)
4850
} or
4951
WithoutPropStep(PropertySet props) { SharedTypeTrackingStep::withoutPropStep(_, _, props) }
5052
}
@@ -69,6 +71,26 @@ private module Cached {
6971
AccessPath::isAssignedInUniqueFile(global)
7072
}
7173

74+
bindingset[fun]
75+
pragma[inline_late]
76+
private DataFlow::PropRead getStoredPropRead(DataFlow::FunctionNode fun, string storeProp) {
77+
result = fun.getAReturn().getALocalSource().getAPropertySource(storeProp)
78+
}
79+
80+
/**
81+
* Holds if `loadProp` of `parameter` is stored in the `storeProp` property of the return value of `fun`.
82+
*/
83+
pragma[nomagic]
84+
private predicate summarizedLoadStoreStep(
85+
DataFlow::ParameterNode param, DataFlow::FunctionNode fun, string loadProp, string storeProp
86+
) {
87+
exists(DataFlow::PropRead read |
88+
read = getStoredPropRead(fun, storeProp) and
89+
read.getBase().getALocalSource() = param and
90+
read.getPropertyName() = loadProp
91+
)
92+
}
93+
7294
/**
7395
* INTERNAL: Use `TypeBackTracker.smallstep()` instead.
7496
*/
@@ -160,6 +182,11 @@ private module Cached {
160182
fun.getAReturn().getALocalSource().getAPropertySource(prop) = param and
161183
summary = StoreStep(prop)
162184
)
185+
or
186+
exists(string loadProp, string storeProp |
187+
summarizedLoadStoreStep(param, fun, loadProp, storeProp) and
188+
summary = LoadStoreStep(loadProp, storeProp)
189+
)
163190
) and
164191
if param = fun.getAParameter()
165192
then
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
| summarize.js:33:14:33:26 | // track: obj | Failed to track obj here. |

0 commit comments

Comments
 (0)