Skip to content

Commit 8e3cf5c

Browse files
committed
add test for data-flow on arrays
1 parent 14740d4 commit 8e3cf5c

2 files changed

Lines changed: 59 additions & 0 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import javascript
2+
3+
class ArrayFlowConfig extends DataFlow::Configuration {
4+
ArrayFlowConfig() { this = "ArrayFlowConfig" }
5+
6+
override predicate isSource(DataFlow::Node source) {
7+
source.asExpr().getStringValue() = "source"
8+
}
9+
10+
override predicate isSink(DataFlow::Node sink) {
11+
sink = any(DataFlow::CallNode call | call.getCalleeName() = "sink").getAnArgument()
12+
}
13+
}
14+
15+
from ArrayFlowConfig config, DataFlow::Node src, DataFlow::Node snk
16+
where config.hasFlow(src, snk)
17+
select src, snk
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
(function () {
2+
let source = "source";
3+
4+
var obj = { foo: source };
5+
sink(obj.foo); // NOT OK
6+
7+
var arr = [];
8+
arr.push(source);
9+
10+
for (var i = 0; i < arr.length; i++) {
11+
sink(arr[i]); // NOT OK
12+
}
13+
14+
15+
arr.forEach((e) => sink(e)); // NOT OK
16+
arr.map((e) => sink(e)); // NOT OK
17+
18+
[1, 2, 3].map(i => "source").forEach(e => sink(e)); // NOT OK.
19+
20+
sink(arr.pop()); // NOT OK
21+
22+
var arr2 = Array.from("source");
23+
sink(arr2.pop()); // NOT OK
24+
25+
var arr3 = ["source"];
26+
sink(arr3.pop()); // NOT OK
27+
28+
var arr4 = [];
29+
arr4.splice(0, 0, "source");
30+
sink(arr4.pop()); // NOT OK
31+
32+
var arr5 = [].concat(arr4);
33+
sink(arr5.pop()); // NOT OK
34+
35+
sink(arr5.slice(2).pop()); // NOT OK
36+
37+
var arr6 = [];
38+
for (var i = 0; i < arr5.length; i++) {
39+
arr6[i] = arr5[i];
40+
}
41+
sink(arr6.pop()); // NOT OK
42+
});

0 commit comments

Comments
 (0)