File tree Expand file tree Collapse file tree 4 files changed +39
-1
lines changed
test/library-tests/Arrays Expand file tree Collapse file tree 4 files changed +39
-1
lines changed Original file line number Diff line number Diff line change 1
1
lgtm,codescanning
2
2
* The dataflow libraries now model dataflow through more array libraries.
3
3
Affected packages are
4
- [ array-from] ( https://npmjs.com/package/array-from )
4
+ [ array-from] ( https://npmjs.com/package/array-from ) ,
5
+ [ array.prototype.find] ( https://npmjs.com/package/array.prototype.find ) ,
6
+ [ array-find] ( https://npmjs.com/package/array-find )
Original file line number Diff line number Diff line change @@ -79,6 +79,11 @@ module ArrayTaintTracking {
79
79
call .( DataFlow:: MethodCallNode ) .getMethodName ( ) = "concat" and
80
80
succ = call and
81
81
pred = call .getAnArgument ( )
82
+ or
83
+ // find
84
+ // `e = arr.find(callback)`
85
+ call = arrayFindCall ( pred ) and
86
+ succ = call
82
87
}
83
88
}
84
89
@@ -297,6 +302,19 @@ private module ArrayDataFlow {
297
302
)
298
303
}
299
304
}
305
+
306
+ /**
307
+ * A step modelling that elements from an array `arr` are received by calling `find`.
308
+ */
309
+ private class ArrayFindStep extends DataFlow:: SharedFlowStep {
310
+ override predicate loadStep ( DataFlow:: Node pred , DataFlow:: Node succ , string prop ) {
311
+ exists ( DataFlow:: CallNode call |
312
+ call = arrayFindCall ( pred ) and
313
+ succ = call and
314
+ prop = arrayElement ( )
315
+ )
316
+ }
317
+ }
300
318
}
301
319
302
320
private import ArrayLibraries
@@ -313,4 +331,15 @@ private module ArrayLibraries {
313
331
or
314
332
result = DataFlow:: moduleImport ( "array-from" ) .getACall ( )
315
333
}
334
+
335
+ /**
336
+ * Gets a call to `Array.prototype.find` or a polyfill implementing the same functionality.
337
+ */
338
+ DataFlow:: CallNode arrayFindCall ( DataFlow:: Node array ) {
339
+ result .( DataFlow:: MethodCallNode ) .getMethodName ( ) = "find" and
340
+ array = result .getReceiver ( )
341
+ or
342
+ result = DataFlow:: moduleImport ( [ "array.prototype.find" , "array-find" ] ) .getACall ( ) and
343
+ array = result .getArgument ( 0 )
344
+ }
316
345
}
Original file line number Diff line number Diff line change 8
8
| arrays.js:2:16:2:23 | "source" | arrays.js:60:10:60:10 | x |
9
9
| arrays.js:2:16:2:23 | "source" | arrays.js:66:10:66:10 | x |
10
10
| arrays.js:2:16:2:23 | "source" | arrays.js:71:10:71:10 | x |
11
+ | arrays.js:2:16:2:23 | "source" | arrays.js:74:8:74:29 | arr.fin ... llback) |
12
+ | arrays.js:2:16:2:23 | "source" | arrays.js:77:8:77:35 | arrayFi ... llback) |
11
13
| arrays.js:18:22:18:29 | "source" | arrays.js:18:50:18:50 | e |
12
14
| arrays.js:22:15:22:22 | "source" | arrays.js:23:8:23:17 | arr2.pop() |
13
15
| arrays.js:25:15:25:22 | "source" | arrays.js:26:8:26:17 | arr3.pop() |
Original file line number Diff line number Diff line change 70
70
for ( const x of arrayFrom ( arr ) ) {
71
71
sink ( x ) ; // NOT OK
72
72
}
73
+
74
+ sink ( arr . find ( someCallback ) ) ; // NOT OK
75
+
76
+ const arrayFind = require ( "array-find" ) ;
77
+ sink ( arrayFind ( arr , someCallback ) ) ; // NOT OK
73
78
} ) ;
You can’t perform that action at this time.
0 commit comments