diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll index 3adc145d1a1a..61cc1d148c6b 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll @@ -118,3 +118,23 @@ class MapSet extends SummarizedCallable { ) } } + +class MapGroupBy extends SummarizedCallable { + MapGroupBy() { this = "Map#groupBy" } + + override DataFlow::CallNode getACallSimple() { + result = mapConstructorRef().getAMemberCall("groupBy") and + result.getNumArgument() = 2 + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + preservesValue = true and + ( + input = "Argument[0].ArrayElement" and + output = ["Argument[1].Parameter[0]", "ReturnValue.MapValue.ArrayElement"] + or + input = "Argument[1].ReturnValue" and + output = "ReturnValue.MapKey" + ) + } +} diff --git a/javascript/ql/lib/utils/test/InlineFlowTest.qll b/javascript/ql/lib/utils/test/InlineFlowTest.qll index 787f5f1540b5..567043f4b524 100644 --- a/javascript/ql/lib/utils/test/InlineFlowTest.qll +++ b/javascript/ql/lib/utils/test/InlineFlowTest.qll @@ -11,7 +11,7 @@ private import semmle.javascript.frameworks.data.internal.ApiGraphModelsExtensio private import internal.InlineExpectationsTestImpl private module FlowTestImpl implements InputSig { - import testUtilities.InlineFlowTestUtil + import utils.test.InlineFlowTestUtil bindingset[src, sink] string getArgString(DataFlow::Node src, DataFlow::Node sink) { diff --git a/javascript/ql/test/library-tests/Arrays/DataFlow.expected b/javascript/ql/test/library-tests/Arrays/DataFlow.expected index 14116c4e2570..e1e80ee50ff0 100644 --- a/javascript/ql/test/library-tests/Arrays/DataFlow.expected +++ b/javascript/ql/test/library-tests/Arrays/DataFlow.expected @@ -18,6 +18,7 @@ flow | arrays.js:2:16:2:23 | "source" | arrays.js:90:10:90:10 | x | | arrays.js:2:16:2:23 | "source" | arrays.js:93:8:93:17 | arr.at(-1) | | arrays.js:2:16:2:23 | "source" | arrays.js:110:8:110:24 | arr8_spread.pop() | +| arrays.js:2:16:2:23 | "source" | arrays.js:112:8:112:33 | arr.fin ... llback) | | arrays.js:18:22:18:29 | "source" | arrays.js:18:50:18:50 | e | | arrays.js:22:15:22:22 | "source" | arrays.js:23:8:23:17 | arr2.pop() | | arrays.js:25:15:25:22 | "source" | arrays.js:26:8:26:17 | arr3.pop() | @@ -31,3 +32,8 @@ flow | arrays.js:97:9:97:16 | "source" | arrays.js:97:8:97:42 | ["sourc ... ).pop() | | arrays.js:100:31:100:38 | "source" | arrays.js:101:8:101:17 | arr8.pop() | | arrays.js:104:55:104:62 | "source" | arrays.js:106:8:106:25 | arr8_variant.pop() | +| arrays.js:115:19:115:26 | "source" | arrays.js:116:50:116:53 | item | +| arrays.js:115:19:115:26 | "source" | arrays.js:117:10:117:16 | element | +| arrays.js:121:19:121:26 | "source" | arrays.js:122:46:122:49 | item | +| arrays.js:121:19:121:26 | "source" | arrays.js:123:10:123:16 | element | +| arrays.js:127:19:127:26 | "source" | arrays.js:128:55:128:58 | item | diff --git a/javascript/ql/test/library-tests/Arrays/DataFlow.ql b/javascript/ql/test/library-tests/Arrays/DataFlow.ql index 0d3a2166203a..addafce54976 100644 --- a/javascript/ql/test/library-tests/Arrays/DataFlow.ql +++ b/javascript/ql/test/library-tests/Arrays/DataFlow.ql @@ -21,6 +21,6 @@ deprecated class LegacyConfig extends DataFlow::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff query predicate flow = TestFlow::flow/2; diff --git a/javascript/ql/test/library-tests/Arrays/TaintFlow.expected b/javascript/ql/test/library-tests/Arrays/TaintFlow.expected index be8aaf12b126..c6456744a299 100644 --- a/javascript/ql/test/library-tests/Arrays/TaintFlow.expected +++ b/javascript/ql/test/library-tests/Arrays/TaintFlow.expected @@ -17,6 +17,7 @@ flow | arrays.js:2:16:2:23 | "source" | arrays.js:90:10:90:10 | x | | arrays.js:2:16:2:23 | "source" | arrays.js:93:8:93:17 | arr.at(-1) | | arrays.js:2:16:2:23 | "source" | arrays.js:110:8:110:24 | arr8_spread.pop() | +| arrays.js:2:16:2:23 | "source" | arrays.js:112:8:112:33 | arr.fin ... llback) | | arrays.js:18:22:18:29 | "source" | arrays.js:18:50:18:50 | e | | arrays.js:22:15:22:22 | "source" | arrays.js:23:8:23:17 | arr2.pop() | | arrays.js:25:15:25:22 | "source" | arrays.js:26:8:26:17 | arr3.pop() | @@ -32,3 +33,13 @@ flow | arrays.js:97:9:97:16 | "source" | arrays.js:97:8:97:42 | ["sourc ... ).pop() | | arrays.js:100:31:100:38 | "source" | arrays.js:101:8:101:17 | arr8.pop() | | arrays.js:104:55:104:62 | "source" | arrays.js:106:8:106:25 | arr8_variant.pop() | +| arrays.js:115:19:115:26 | "source" | arrays.js:116:50:116:53 | item | +| arrays.js:115:19:115:26 | "source" | arrays.js:117:10:117:16 | element | +| arrays.js:121:19:121:26 | "source" | arrays.js:122:46:122:49 | item | +| arrays.js:121:19:121:26 | "source" | arrays.js:123:10:123:16 | element | +| arrays.js:127:19:127:26 | "source" | arrays.js:128:55:128:58 | item | +| arrays.js:132:17:132:24 | source() | arrays.js:133:46:133:49 | item | +| arrays.js:132:17:132:24 | source() | arrays.js:134:10:134:17 | element1 | +| arrays.js:138:17:138:24 | source() | arrays.js:139:50:139:53 | item | +| arrays.js:138:17:138:24 | source() | arrays.js:140:10:140:17 | element1 | +| arrays.js:144:17:144:24 | source() | arrays.js:145:55:145:58 | item | diff --git a/javascript/ql/test/library-tests/Arrays/TaintFlow.ql b/javascript/ql/test/library-tests/Arrays/TaintFlow.ql index 77f2d2c3b561..d6040117674e 100644 --- a/javascript/ql/test/library-tests/Arrays/TaintFlow.ql +++ b/javascript/ql/test/library-tests/Arrays/TaintFlow.ql @@ -21,6 +21,6 @@ deprecated class LegacyConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff query predicate flow = TestFlow::flow/2; diff --git a/javascript/ql/test/library-tests/Arrays/printAst.expected b/javascript/ql/test/library-tests/Arrays/printAst.expected index 7d4c7285c702..e79ac5ce84e7 100644 --- a/javascript/ql/test/library-tests/Arrays/printAst.expected +++ b/javascript/ql/test/library-tests/Arrays/printAst.expected @@ -1,9 +1,9 @@ nodes -| arrays.js:1:1:111:2 | [ParExpr] (functi ... T OK }) | semmle.label | [ParExpr] (functi ... T OK }) | -| arrays.js:1:1:111:3 | [ExprStmt] (functi ... OK }); | semmle.label | [ExprStmt] (functi ... OK }); | -| arrays.js:1:1:111:3 | [ExprStmt] (functi ... OK }); | semmle.order | 1 | -| arrays.js:1:2:111:1 | [FunctionExpr] functio ... OT OK } | semmle.label | [FunctionExpr] functio ... OT OK } | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | semmle.label | [BlockStmt] { let ... OT OK } | +| arrays.js:1:1:148:2 | [ParExpr] (functi ... } }) | semmle.label | [ParExpr] (functi ... } }) | +| arrays.js:1:1:148:3 | [ExprStmt] (functi ... } }); | semmle.label | [ExprStmt] (functi ... } }); | +| arrays.js:1:1:148:3 | [ExprStmt] (functi ... } }); | semmle.order | 1 | +| arrays.js:1:2:148:1 | [FunctionExpr] functio ... K } } | semmle.label | [FunctionExpr] functio ... K } } | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | semmle.label | [BlockStmt] { let ... K } } | | arrays.js:2:3:2:24 | [DeclStmt] let source = ... | semmle.label | [DeclStmt] let source = ... | | arrays.js:2:7:2:12 | [VarDecl] source | semmle.label | [VarDecl] source | | arrays.js:2:7:2:23 | [VariableDeclarator] source = "source" | semmle.label | [VariableDeclarator] source = "source" | @@ -498,6 +498,146 @@ nodes | arrays.js:110:8:110:22 | [DotExpr] arr8_spread.pop | semmle.label | [DotExpr] arr8_spread.pop | | arrays.js:110:8:110:24 | [MethodCallExpr] arr8_spread.pop() | semmle.label | [MethodCallExpr] arr8_spread.pop() | | arrays.js:110:20:110:22 | [Label] pop | semmle.label | [Label] pop | +| arrays.js:112:3:112:6 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:112:3:112:34 | [CallExpr] sink(ar ... lback)) | semmle.label | [CallExpr] sink(ar ... lback)) | +| arrays.js:112:3:112:35 | [ExprStmt] sink(ar ... back)); | semmle.label | [ExprStmt] sink(ar ... back)); | +| arrays.js:112:8:112:10 | [VarRef] arr | semmle.label | [VarRef] arr | +| arrays.js:112:8:112:19 | [DotExpr] arr.findLast | semmle.label | [DotExpr] arr.findLast | +| arrays.js:112:8:112:33 | [MethodCallExpr] arr.fin ... llback) | semmle.label | [MethodCallExpr] arr.fin ... llback) | +| arrays.js:112:12:112:19 | [Label] findLast | semmle.label | [Label] findLast | +| arrays.js:112:21:112:32 | [VarRef] someCallback | semmle.label | [VarRef] someCallback | +| arrays.js:114:3:118:3 | [BlockStmt] { // T ... OK } | semmle.label | [BlockStmt] { // T ... OK } | +| arrays.js:115:5:115:28 | [DeclStmt] const list = ... | semmle.label | [DeclStmt] const list = ... | +| arrays.js:115:11:115:14 | [VarDecl] list | semmle.label | [VarDecl] list | +| arrays.js:115:11:115:27 | [VariableDeclarator] list = ["source"] | semmle.label | [VariableDeclarator] list = ["source"] | +| arrays.js:115:18:115:27 | [ArrayExpr] ["source"] | semmle.label | [ArrayExpr] ["source"] | +| arrays.js:115:19:115:26 | [Literal] "source" | semmle.label | [Literal] "source" | +| arrays.js:116:5:116:56 | [DeclStmt] const element = ... | semmle.label | [DeclStmt] const element = ... | +| arrays.js:116:11:116:17 | [VarDecl] element | semmle.label | [VarDecl] element | +| arrays.js:116:11:116:55 | [VariableDeclarator] element ... (item)) | semmle.label | [VariableDeclarator] element ... (item)) | +| arrays.js:116:21:116:24 | [VarRef] list | semmle.label | [VarRef] list | +| arrays.js:116:21:116:33 | [DotExpr] list.findLast | semmle.label | [DotExpr] list.findLast | +| arrays.js:116:21:116:55 | [MethodCallExpr] list.fi ... (item)) | semmle.label | [MethodCallExpr] list.fi ... (item)) | +| arrays.js:116:26:116:33 | [Label] findLast | semmle.label | [Label] findLast | +| arrays.js:116:35:116:54 | [ArrowFunctionExpr] (item) => sink(item) | semmle.label | [ArrowFunctionExpr] (item) => sink(item) | +| arrays.js:116:36:116:39 | [SimpleParameter] item | semmle.label | [SimpleParameter] item | +| arrays.js:116:45:116:48 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:116:45:116:54 | [CallExpr] sink(item) | semmle.label | [CallExpr] sink(item) | +| arrays.js:116:50:116:53 | [VarRef] item | semmle.label | [VarRef] item | +| arrays.js:117:5:117:8 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:117:5:117:17 | [CallExpr] sink(element) | semmle.label | [CallExpr] sink(element) | +| arrays.js:117:5:117:18 | [ExprStmt] sink(element); | semmle.label | [ExprStmt] sink(element); | +| arrays.js:117:10:117:16 | [VarRef] element | semmle.label | [VarRef] element | +| arrays.js:120:3:124:3 | [BlockStmt] { // T ... OK } | semmle.label | [BlockStmt] { // T ... OK } | +| arrays.js:121:5:121:28 | [DeclStmt] const list = ... | semmle.label | [DeclStmt] const list = ... | +| arrays.js:121:11:121:14 | [VarDecl] list | semmle.label | [VarDecl] list | +| arrays.js:121:11:121:27 | [VariableDeclarator] list = ["source"] | semmle.label | [VariableDeclarator] list = ["source"] | +| arrays.js:121:18:121:27 | [ArrayExpr] ["source"] | semmle.label | [ArrayExpr] ["source"] | +| arrays.js:121:19:121:26 | [Literal] "source" | semmle.label | [Literal] "source" | +| arrays.js:122:5:122:52 | [DeclStmt] const element = ... | semmle.label | [DeclStmt] const element = ... | +| arrays.js:122:11:122:17 | [VarDecl] element | semmle.label | [VarDecl] element | +| arrays.js:122:11:122:51 | [VariableDeclarator] element ... (item)) | semmle.label | [VariableDeclarator] element ... (item)) | +| arrays.js:122:21:122:24 | [VarRef] list | semmle.label | [VarRef] list | +| arrays.js:122:21:122:29 | [DotExpr] list.find | semmle.label | [DotExpr] list.find | +| arrays.js:122:21:122:51 | [MethodCallExpr] list.fi ... (item)) | semmle.label | [MethodCallExpr] list.fi ... (item)) | +| arrays.js:122:26:122:29 | [Label] find | semmle.label | [Label] find | +| arrays.js:122:31:122:50 | [ArrowFunctionExpr] (item) => sink(item) | semmle.label | [ArrowFunctionExpr] (item) => sink(item) | +| arrays.js:122:32:122:35 | [SimpleParameter] item | semmle.label | [SimpleParameter] item | +| arrays.js:122:41:122:44 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:122:41:122:50 | [CallExpr] sink(item) | semmle.label | [CallExpr] sink(item) | +| arrays.js:122:46:122:49 | [VarRef] item | semmle.label | [VarRef] item | +| arrays.js:123:5:123:8 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:123:5:123:17 | [CallExpr] sink(element) | semmle.label | [CallExpr] sink(element) | +| arrays.js:123:5:123:18 | [ExprStmt] sink(element); | semmle.label | [ExprStmt] sink(element); | +| arrays.js:123:10:123:16 | [VarRef] element | semmle.label | [VarRef] element | +| arrays.js:126:3:130:3 | [BlockStmt] { // T ... OK } | semmle.label | [BlockStmt] { // T ... OK } | +| arrays.js:127:5:127:28 | [DeclStmt] const list = ... | semmle.label | [DeclStmt] const list = ... | +| arrays.js:127:11:127:14 | [VarDecl] list | semmle.label | [VarDecl] list | +| arrays.js:127:11:127:27 | [VariableDeclarator] list = ["source"] | semmle.label | [VariableDeclarator] list = ["source"] | +| arrays.js:127:18:127:27 | [ArrayExpr] ["source"] | semmle.label | [ArrayExpr] ["source"] | +| arrays.js:127:19:127:26 | [Literal] "source" | semmle.label | [Literal] "source" | +| arrays.js:128:5:128:61 | [DeclStmt] const element = ... | semmle.label | [DeclStmt] const element = ... | +| arrays.js:128:11:128:17 | [VarDecl] element | semmle.label | [VarDecl] element | +| arrays.js:128:11:128:60 | [VariableDeclarator] element ... (item)) | semmle.label | [VariableDeclarator] element ... (item)) | +| arrays.js:128:21:128:24 | [VarRef] list | semmle.label | [VarRef] list | +| arrays.js:128:21:128:38 | [DotExpr] list.findLastIndex | semmle.label | [DotExpr] list.findLastIndex | +| arrays.js:128:21:128:60 | [MethodCallExpr] list.fi ... (item)) | semmle.label | [MethodCallExpr] list.fi ... (item)) | +| arrays.js:128:26:128:38 | [Label] findLastIndex | semmle.label | [Label] findLastIndex | +| arrays.js:128:40:128:59 | [ArrowFunctionExpr] (item) => sink(item) | semmle.label | [ArrowFunctionExpr] (item) => sink(item) | +| arrays.js:128:41:128:44 | [SimpleParameter] item | semmle.label | [SimpleParameter] item | +| arrays.js:128:50:128:53 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:128:50:128:59 | [CallExpr] sink(item) | semmle.label | [CallExpr] sink(item) | +| arrays.js:128:55:128:58 | [VarRef] item | semmle.label | [VarRef] item | +| arrays.js:129:5:129:8 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:129:5:129:17 | [CallExpr] sink(element) | semmle.label | [CallExpr] sink(element) | +| arrays.js:129:5:129:18 | [ExprStmt] sink(element); | semmle.label | [ExprStmt] sink(element); | +| arrays.js:129:10:129:16 | [VarRef] element | semmle.label | [VarRef] element | +| arrays.js:131:3:135:3 | [BlockStmt] { c ... OK } | semmle.label | [BlockStmt] { c ... OK } | +| arrays.js:132:5:132:25 | [DeclStmt] const arr = ... | semmle.label | [DeclStmt] const arr = ... | +| arrays.js:132:11:132:13 | [VarDecl] arr | semmle.label | [VarDecl] arr | +| arrays.js:132:11:132:24 | [VariableDeclarator] arr = source() | semmle.label | [VariableDeclarator] arr = source() | +| arrays.js:132:17:132:22 | [VarRef] source | semmle.label | [VarRef] source | +| arrays.js:132:17:132:24 | [CallExpr] source() | semmle.label | [CallExpr] source() | +| arrays.js:133:5:133:52 | [DeclStmt] const element1 = ... | semmle.label | [DeclStmt] const element1 = ... | +| arrays.js:133:11:133:18 | [VarDecl] element1 | semmle.label | [VarDecl] element1 | +| arrays.js:133:11:133:51 | [VariableDeclarator] element ... (item)) | semmle.label | [VariableDeclarator] element ... (item)) | +| arrays.js:133:22:133:24 | [VarRef] arr | semmle.label | [VarRef] arr | +| arrays.js:133:22:133:29 | [DotExpr] arr.find | semmle.label | [DotExpr] arr.find | +| arrays.js:133:22:133:51 | [MethodCallExpr] arr.fin ... (item)) | semmle.label | [MethodCallExpr] arr.fin ... (item)) | +| arrays.js:133:26:133:29 | [Label] find | semmle.label | [Label] find | +| arrays.js:133:31:133:50 | [ArrowFunctionExpr] (item) => sink(item) | semmle.label | [ArrowFunctionExpr] (item) => sink(item) | +| arrays.js:133:32:133:35 | [SimpleParameter] item | semmle.label | [SimpleParameter] item | +| arrays.js:133:41:133:44 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:133:41:133:50 | [CallExpr] sink(item) | semmle.label | [CallExpr] sink(item) | +| arrays.js:133:46:133:49 | [VarRef] item | semmle.label | [VarRef] item | +| arrays.js:134:5:134:8 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:134:5:134:18 | [CallExpr] sink(element1) | semmle.label | [CallExpr] sink(element1) | +| arrays.js:134:5:134:19 | [ExprStmt] sink(element1); | semmle.label | [ExprStmt] sink(element1); | +| arrays.js:134:10:134:17 | [VarRef] element1 | semmle.label | [VarRef] element1 | +| arrays.js:137:3:141:3 | [BlockStmt] { c ... OK } | semmle.label | [BlockStmt] { c ... OK } | +| arrays.js:138:5:138:25 | [DeclStmt] const arr = ... | semmle.label | [DeclStmt] const arr = ... | +| arrays.js:138:11:138:13 | [VarDecl] arr | semmle.label | [VarDecl] arr | +| arrays.js:138:11:138:24 | [VariableDeclarator] arr = source() | semmle.label | [VariableDeclarator] arr = source() | +| arrays.js:138:17:138:22 | [VarRef] source | semmle.label | [VarRef] source | +| arrays.js:138:17:138:24 | [CallExpr] source() | semmle.label | [CallExpr] source() | +| arrays.js:139:5:139:56 | [DeclStmt] const element1 = ... | semmle.label | [DeclStmt] const element1 = ... | +| arrays.js:139:11:139:18 | [VarDecl] element1 | semmle.label | [VarDecl] element1 | +| arrays.js:139:11:139:55 | [VariableDeclarator] element ... (item)) | semmle.label | [VariableDeclarator] element ... (item)) | +| arrays.js:139:22:139:24 | [VarRef] arr | semmle.label | [VarRef] arr | +| arrays.js:139:22:139:33 | [DotExpr] arr.findLast | semmle.label | [DotExpr] arr.findLast | +| arrays.js:139:22:139:55 | [MethodCallExpr] arr.fin ... (item)) | semmle.label | [MethodCallExpr] arr.fin ... (item)) | +| arrays.js:139:26:139:33 | [Label] findLast | semmle.label | [Label] findLast | +| arrays.js:139:35:139:54 | [ArrowFunctionExpr] (item) => sink(item) | semmle.label | [ArrowFunctionExpr] (item) => sink(item) | +| arrays.js:139:36:139:39 | [SimpleParameter] item | semmle.label | [SimpleParameter] item | +| arrays.js:139:45:139:48 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:139:45:139:54 | [CallExpr] sink(item) | semmle.label | [CallExpr] sink(item) | +| arrays.js:139:50:139:53 | [VarRef] item | semmle.label | [VarRef] item | +| arrays.js:140:5:140:8 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:140:5:140:18 | [CallExpr] sink(element1) | semmle.label | [CallExpr] sink(element1) | +| arrays.js:140:5:140:19 | [ExprStmt] sink(element1); | semmle.label | [ExprStmt] sink(element1); | +| arrays.js:140:10:140:17 | [VarRef] element1 | semmle.label | [VarRef] element1 | +| arrays.js:143:3:147:3 | [BlockStmt] { c ... OK } | semmle.label | [BlockStmt] { c ... OK } | +| arrays.js:144:5:144:25 | [DeclStmt] const arr = ... | semmle.label | [DeclStmt] const arr = ... | +| arrays.js:144:11:144:13 | [VarDecl] arr | semmle.label | [VarDecl] arr | +| arrays.js:144:11:144:24 | [VariableDeclarator] arr = source() | semmle.label | [VariableDeclarator] arr = source() | +| arrays.js:144:17:144:22 | [VarRef] source | semmle.label | [VarRef] source | +| arrays.js:144:17:144:24 | [CallExpr] source() | semmle.label | [CallExpr] source() | +| arrays.js:145:5:145:61 | [DeclStmt] const element1 = ... | semmle.label | [DeclStmt] const element1 = ... | +| arrays.js:145:11:145:18 | [VarDecl] element1 | semmle.label | [VarDecl] element1 | +| arrays.js:145:11:145:60 | [VariableDeclarator] element ... (item)) | semmle.label | [VariableDeclarator] element ... (item)) | +| arrays.js:145:22:145:24 | [VarRef] arr | semmle.label | [VarRef] arr | +| arrays.js:145:22:145:38 | [DotExpr] arr.findLastIndex | semmle.label | [DotExpr] arr.findLastIndex | +| arrays.js:145:22:145:60 | [MethodCallExpr] arr.fin ... (item)) | semmle.label | [MethodCallExpr] arr.fin ... (item)) | +| arrays.js:145:26:145:38 | [Label] findLastIndex | semmle.label | [Label] findLastIndex | +| arrays.js:145:40:145:59 | [ArrowFunctionExpr] (item) => sink(item) | semmle.label | [ArrowFunctionExpr] (item) => sink(item) | +| arrays.js:145:41:145:44 | [SimpleParameter] item | semmle.label | [SimpleParameter] item | +| arrays.js:145:50:145:53 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:145:50:145:59 | [CallExpr] sink(item) | semmle.label | [CallExpr] sink(item) | +| arrays.js:145:55:145:58 | [VarRef] item | semmle.label | [VarRef] item | +| arrays.js:146:5:146:8 | [VarRef] sink | semmle.label | [VarRef] sink | +| arrays.js:146:5:146:18 | [CallExpr] sink(element1) | semmle.label | [CallExpr] sink(element1) | +| arrays.js:146:5:146:19 | [ExprStmt] sink(element1); | semmle.label | [ExprStmt] sink(element1); | +| arrays.js:146:10:146:17 | [VarRef] element1 | semmle.label | [VarRef] element1 | | file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | | file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | | file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | @@ -556,6 +696,32 @@ nodes | file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | | file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | | file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | +| file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | +| file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | +| file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | +| file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | +| file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | | file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | | file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | | file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | @@ -564,130 +730,144 @@ nodes | file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | | file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | edges -| arrays.js:1:1:111:2 | [ParExpr] (functi ... T OK }) | arrays.js:1:2:111:1 | [FunctionExpr] functio ... OT OK } | semmle.label | 1 | -| arrays.js:1:1:111:2 | [ParExpr] (functi ... T OK }) | arrays.js:1:2:111:1 | [FunctionExpr] functio ... OT OK } | semmle.order | 1 | -| arrays.js:1:1:111:3 | [ExprStmt] (functi ... OK }); | arrays.js:1:1:111:2 | [ParExpr] (functi ... T OK }) | semmle.label | 1 | -| arrays.js:1:1:111:3 | [ExprStmt] (functi ... OK }); | arrays.js:1:1:111:2 | [ParExpr] (functi ... T OK }) | semmle.order | 1 | -| arrays.js:1:2:111:1 | [FunctionExpr] functio ... OT OK } | arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | semmle.label | 5 | -| arrays.js:1:2:111:1 | [FunctionExpr] functio ... OT OK } | arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | semmle.order | 5 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:2:3:2:24 | [DeclStmt] let source = ... | semmle.label | 1 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:2:3:2:24 | [DeclStmt] let source = ... | semmle.order | 1 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:4:3:4:28 | [DeclStmt] var obj = ... | semmle.label | 2 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:4:3:4:28 | [DeclStmt] var obj = ... | semmle.order | 2 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:5:3:5:16 | [ExprStmt] sink(obj.foo); | semmle.label | 3 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:5:3:5:16 | [ExprStmt] sink(obj.foo); | semmle.order | 3 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:7:3:7:15 | [DeclStmt] var arr = ... | semmle.label | 4 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:7:3:7:15 | [DeclStmt] var arr = ... | semmle.order | 4 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:8:3:8:19 | [ExprStmt] arr.push(source); | semmle.label | 5 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:8:3:8:19 | [ExprStmt] arr.push(source); | semmle.order | 5 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:10:3:12:3 | [ForStmt] for (va ... OK } | semmle.label | 6 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:10:3:12:3 | [ForStmt] for (va ... OK } | semmle.order | 6 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:15:3:15:30 | [ExprStmt] arr.for ... nk(e)); | semmle.label | 7 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:15:3:15:30 | [ExprStmt] arr.for ... nk(e)); | semmle.order | 7 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:16:3:16:26 | [ExprStmt] arr.map ... nk(e)); | semmle.label | 8 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:16:3:16:26 | [ExprStmt] arr.map ... nk(e)); | semmle.order | 8 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:18:3:18:53 | [ExprStmt] [1, 2, ... nk(e)); | semmle.label | 9 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:18:3:18:53 | [ExprStmt] [1, 2, ... nk(e)); | semmle.order | 9 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:20:3:20:18 | [ExprStmt] sink(arr.pop()); | semmle.label | 10 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:20:3:20:18 | [ExprStmt] sink(arr.pop()); | semmle.order | 10 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:22:3:22:24 | [DeclStmt] var arr2 = ... | semmle.label | 11 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:22:3:22:24 | [DeclStmt] var arr2 = ... | semmle.order | 11 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:23:3:23:19 | [ExprStmt] sink(arr2.pop()); | semmle.label | 12 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:23:3:23:19 | [ExprStmt] sink(arr2.pop()); | semmle.order | 12 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:25:3:25:24 | [DeclStmt] var arr3 = ... | semmle.label | 13 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:25:3:25:24 | [DeclStmt] var arr3 = ... | semmle.order | 13 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:26:3:26:19 | [ExprStmt] sink(arr3.pop()); | semmle.label | 14 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:26:3:26:19 | [ExprStmt] sink(arr3.pop()); | semmle.order | 14 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:28:3:28:16 | [DeclStmt] var arr4 = ... | semmle.label | 15 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:28:3:28:16 | [DeclStmt] var arr4 = ... | semmle.order | 15 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:29:3:29:30 | [ExprStmt] arr4.sp ... urce"); | semmle.label | 16 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:29:3:29:30 | [ExprStmt] arr4.sp ... urce"); | semmle.order | 16 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:30:3:30:19 | [ExprStmt] sink(arr4.pop()); | semmle.label | 17 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:30:3:30:19 | [ExprStmt] sink(arr4.pop()); | semmle.order | 17 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:32:3:32:24 | [DeclStmt] var arr4_variant = ... | semmle.label | 18 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:32:3:32:24 | [DeclStmt] var arr4_variant = ... | semmle.order | 18 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:33:3:33:46 | [ExprStmt] arr4_va ... urce"); | semmle.label | 19 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:33:3:33:46 | [ExprStmt] arr4_va ... urce"); | semmle.order | 19 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:34:3:34:21 | [ExprStmt] arr4_variant.pop(); | semmle.label | 20 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:34:3:34:21 | [ExprStmt] arr4_variant.pop(); | semmle.order | 20 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:35:3:35:27 | [ExprStmt] sink(ar ... pop()); | semmle.label | 21 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:35:3:35:27 | [ExprStmt] sink(ar ... pop()); | semmle.order | 21 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:37:3:37:23 | [DeclStmt] var arr4_spread = ... | semmle.label | 22 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:37:3:37:23 | [DeclStmt] var arr4_spread = ... | semmle.order | 22 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:38:3:38:35 | [ExprStmt] arr4_sp ... ..arr); | semmle.label | 23 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:38:3:38:35 | [ExprStmt] arr4_sp ... ..arr); | semmle.order | 23 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:39:3:39:26 | [ExprStmt] sink(ar ... pop()); | semmle.label | 24 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:39:3:39:26 | [ExprStmt] sink(ar ... pop()); | semmle.order | 24 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:41:3:41:29 | [DeclStmt] var arr5 = ... | semmle.label | 25 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:41:3:41:29 | [DeclStmt] var arr5 = ... | semmle.order | 25 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:42:3:42:19 | [ExprStmt] sink(arr5.pop()); | semmle.label | 26 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:42:3:42:19 | [ExprStmt] sink(arr5.pop()); | semmle.order | 26 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:44:3:44:28 | [ExprStmt] sink(ar ... pop()); | semmle.label | 27 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:44:3:44:28 | [ExprStmt] sink(ar ... pop()); | semmle.order | 27 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:46:3:46:16 | [DeclStmt] var arr6 = ... | semmle.label | 28 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:46:3:46:16 | [DeclStmt] var arr6 = ... | semmle.order | 28 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:47:3:49:3 | [ForStmt] for (va ... i]; } | semmle.label | 29 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:47:3:49:3 | [ForStmt] for (va ... i]; } | semmle.order | 29 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:50:3:50:19 | [ExprStmt] sink(arr6.pop()); | semmle.label | 30 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:50:3:50:19 | [ExprStmt] sink(arr6.pop()); | semmle.order | 30 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:53:3:56:5 | [ExprStmt] ["sourc ... . }); | semmle.label | 31 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:53:3:56:5 | [ExprStmt] ["sourc ... . }); | semmle.order | 31 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:58:3:58:15 | [ExprStmt] sink(arr[0]); | semmle.label | 32 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:58:3:58:15 | [ExprStmt] sink(arr[0]); | semmle.order | 32 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:60:3:62:3 | [ForOfStmt] for (co ... OK } | semmle.label | 33 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:60:3:62:3 | [ForOfStmt] for (co ... OK } | semmle.order | 33 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:64:3:66:3 | [ForOfStmt] for (co ... OK } | semmle.label | 34 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:64:3:66:3 | [ForOfStmt] for (co ... OK } | semmle.order | 34 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:68:3:70:3 | [ForOfStmt] for (co ... OK } | semmle.label | 35 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:68:3:70:3 | [ForOfStmt] for (co ... OK } | semmle.order | 35 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:72:3:72:16 | [DeclStmt] var arr7 = ... | semmle.label | 36 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:72:3:72:16 | [DeclStmt] var arr7 = ... | semmle.order | 36 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:73:3:73:20 | [ExprStmt] arr7.push(...arr); | semmle.label | 37 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:73:3:73:20 | [ExprStmt] arr7.push(...arr); | semmle.order | 37 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:74:3:76:3 | [ForOfStmt] for (co ... OK } | semmle.label | 38 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:74:3:76:3 | [ForOfStmt] for (co ... OK } | semmle.order | 38 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:78:3:78:42 | [DeclStmt] const arrayFrom = ... | semmle.label | 39 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:78:3:78:42 | [DeclStmt] const arrayFrom = ... | semmle.order | 39 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:79:3:81:3 | [ForOfStmt] for (co ... OK } | semmle.label | 40 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:79:3:81:3 | [ForOfStmt] for (co ... OK } | semmle.order | 40 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:83:3:83:31 | [ExprStmt] sink(ar ... back)); | semmle.label | 41 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:83:3:83:31 | [ExprStmt] sink(ar ... back)); | semmle.order | 41 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:85:3:85:42 | [DeclStmt] const arrayFind = ... | semmle.label | 42 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:85:3:85:42 | [DeclStmt] const arrayFind = ... | semmle.order | 42 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:86:3:86:37 | [ExprStmt] sink(ar ... back)); | semmle.label | 43 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:86:3:86:37 | [ExprStmt] sink(ar ... back)); | semmle.order | 43 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:88:3:88:31 | [DeclStmt] const uniq = ... | semmle.label | 44 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:88:3:88:31 | [DeclStmt] const uniq = ... | semmle.order | 44 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:89:3:91:3 | [ForOfStmt] for (co ... OK } | semmle.label | 45 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:89:3:91:3 | [ForOfStmt] for (co ... OK } | semmle.order | 45 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:93:3:93:19 | [ExprStmt] sink(arr.at(-1)); | semmle.label | 46 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:93:3:93:19 | [ExprStmt] sink(arr.at(-1)); | semmle.order | 46 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:95:3:95:19 | [ExprStmt] sink(["source"]); | semmle.label | 47 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:95:3:95:19 | [ExprStmt] sink(["source"]); | semmle.order | 47 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:96:3:96:42 | [ExprStmt] sink([" ... pop()); | semmle.label | 48 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:96:3:96:42 | [ExprStmt] sink([" ... pop()); | semmle.order | 48 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:97:3:97:44 | [ExprStmt] sink([" ... pop()); | semmle.label | 49 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:97:3:97:44 | [ExprStmt] sink([" ... pop()); | semmle.order | 49 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:99:3:99:16 | [DeclStmt] var arr8 = ... | semmle.label | 50 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:99:3:99:16 | [DeclStmt] var arr8 = ... | semmle.order | 50 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:100:3:100:40 | [ExprStmt] arr8 = ... urce"); | semmle.label | 51 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:100:3:100:40 | [ExprStmt] arr8 = ... urce"); | semmle.order | 51 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:101:3:101:19 | [ExprStmt] sink(arr8.pop()); | semmle.label | 52 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:101:3:101:19 | [ExprStmt] sink(arr8.pop()); | semmle.order | 52 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:103:3:103:24 | [DeclStmt] var arr8_variant = ... | semmle.label | 53 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:103:3:103:24 | [DeclStmt] var arr8_variant = ... | semmle.order | 53 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:104:3:104:64 | [ExprStmt] arr8_va ... urce"); | semmle.label | 54 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:104:3:104:64 | [ExprStmt] arr8_va ... urce"); | semmle.order | 54 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:105:3:105:21 | [ExprStmt] arr8_variant.pop(); | semmle.label | 55 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:105:3:105:21 | [ExprStmt] arr8_variant.pop(); | semmle.order | 55 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:106:3:106:27 | [ExprStmt] sink(ar ... pop()); | semmle.label | 56 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:106:3:106:27 | [ExprStmt] sink(ar ... pop()); | semmle.order | 56 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:108:3:108:23 | [DeclStmt] var arr8_spread = ... | semmle.label | 57 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:108:3:108:23 | [DeclStmt] var arr8_spread = ... | semmle.order | 57 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:109:3:109:52 | [ExprStmt] arr8_sp ... ..arr); | semmle.label | 58 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:109:3:109:52 | [ExprStmt] arr8_sp ... ..arr); | semmle.order | 58 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:110:3:110:26 | [ExprStmt] sink(ar ... pop()); | semmle.label | 59 | -| arrays.js:1:14:111:1 | [BlockStmt] { let ... OT OK } | arrays.js:110:3:110:26 | [ExprStmt] sink(ar ... pop()); | semmle.order | 59 | +| arrays.js:1:1:148:2 | [ParExpr] (functi ... } }) | arrays.js:1:2:148:1 | [FunctionExpr] functio ... K } } | semmle.label | 1 | +| arrays.js:1:1:148:2 | [ParExpr] (functi ... } }) | arrays.js:1:2:148:1 | [FunctionExpr] functio ... K } } | semmle.order | 1 | +| arrays.js:1:1:148:3 | [ExprStmt] (functi ... } }); | arrays.js:1:1:148:2 | [ParExpr] (functi ... } }) | semmle.label | 1 | +| arrays.js:1:1:148:3 | [ExprStmt] (functi ... } }); | arrays.js:1:1:148:2 | [ParExpr] (functi ... } }) | semmle.order | 1 | +| arrays.js:1:2:148:1 | [FunctionExpr] functio ... K } } | arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | semmle.label | 5 | +| arrays.js:1:2:148:1 | [FunctionExpr] functio ... K } } | arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | semmle.order | 5 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:2:3:2:24 | [DeclStmt] let source = ... | semmle.label | 1 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:2:3:2:24 | [DeclStmt] let source = ... | semmle.order | 1 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:4:3:4:28 | [DeclStmt] var obj = ... | semmle.label | 2 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:4:3:4:28 | [DeclStmt] var obj = ... | semmle.order | 2 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:5:3:5:16 | [ExprStmt] sink(obj.foo); | semmle.label | 3 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:5:3:5:16 | [ExprStmt] sink(obj.foo); | semmle.order | 3 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:7:3:7:15 | [DeclStmt] var arr = ... | semmle.label | 4 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:7:3:7:15 | [DeclStmt] var arr = ... | semmle.order | 4 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:8:3:8:19 | [ExprStmt] arr.push(source); | semmle.label | 5 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:8:3:8:19 | [ExprStmt] arr.push(source); | semmle.order | 5 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:10:3:12:3 | [ForStmt] for (va ... OK } | semmle.label | 6 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:10:3:12:3 | [ForStmt] for (va ... OK } | semmle.order | 6 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:15:3:15:30 | [ExprStmt] arr.for ... nk(e)); | semmle.label | 7 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:15:3:15:30 | [ExprStmt] arr.for ... nk(e)); | semmle.order | 7 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:16:3:16:26 | [ExprStmt] arr.map ... nk(e)); | semmle.label | 8 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:16:3:16:26 | [ExprStmt] arr.map ... nk(e)); | semmle.order | 8 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:18:3:18:53 | [ExprStmt] [1, 2, ... nk(e)); | semmle.label | 9 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:18:3:18:53 | [ExprStmt] [1, 2, ... nk(e)); | semmle.order | 9 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:20:3:20:18 | [ExprStmt] sink(arr.pop()); | semmle.label | 10 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:20:3:20:18 | [ExprStmt] sink(arr.pop()); | semmle.order | 10 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:22:3:22:24 | [DeclStmt] var arr2 = ... | semmle.label | 11 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:22:3:22:24 | [DeclStmt] var arr2 = ... | semmle.order | 11 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:23:3:23:19 | [ExprStmt] sink(arr2.pop()); | semmle.label | 12 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:23:3:23:19 | [ExprStmt] sink(arr2.pop()); | semmle.order | 12 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:25:3:25:24 | [DeclStmt] var arr3 = ... | semmle.label | 13 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:25:3:25:24 | [DeclStmt] var arr3 = ... | semmle.order | 13 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:26:3:26:19 | [ExprStmt] sink(arr3.pop()); | semmle.label | 14 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:26:3:26:19 | [ExprStmt] sink(arr3.pop()); | semmle.order | 14 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:28:3:28:16 | [DeclStmt] var arr4 = ... | semmle.label | 15 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:28:3:28:16 | [DeclStmt] var arr4 = ... | semmle.order | 15 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:29:3:29:30 | [ExprStmt] arr4.sp ... urce"); | semmle.label | 16 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:29:3:29:30 | [ExprStmt] arr4.sp ... urce"); | semmle.order | 16 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:30:3:30:19 | [ExprStmt] sink(arr4.pop()); | semmle.label | 17 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:30:3:30:19 | [ExprStmt] sink(arr4.pop()); | semmle.order | 17 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:32:3:32:24 | [DeclStmt] var arr4_variant = ... | semmle.label | 18 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:32:3:32:24 | [DeclStmt] var arr4_variant = ... | semmle.order | 18 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:33:3:33:46 | [ExprStmt] arr4_va ... urce"); | semmle.label | 19 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:33:3:33:46 | [ExprStmt] arr4_va ... urce"); | semmle.order | 19 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:34:3:34:21 | [ExprStmt] arr4_variant.pop(); | semmle.label | 20 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:34:3:34:21 | [ExprStmt] arr4_variant.pop(); | semmle.order | 20 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:35:3:35:27 | [ExprStmt] sink(ar ... pop()); | semmle.label | 21 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:35:3:35:27 | [ExprStmt] sink(ar ... pop()); | semmle.order | 21 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:37:3:37:23 | [DeclStmt] var arr4_spread = ... | semmle.label | 22 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:37:3:37:23 | [DeclStmt] var arr4_spread = ... | semmle.order | 22 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:38:3:38:35 | [ExprStmt] arr4_sp ... ..arr); | semmle.label | 23 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:38:3:38:35 | [ExprStmt] arr4_sp ... ..arr); | semmle.order | 23 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:39:3:39:26 | [ExprStmt] sink(ar ... pop()); | semmle.label | 24 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:39:3:39:26 | [ExprStmt] sink(ar ... pop()); | semmle.order | 24 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:41:3:41:29 | [DeclStmt] var arr5 = ... | semmle.label | 25 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:41:3:41:29 | [DeclStmt] var arr5 = ... | semmle.order | 25 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:42:3:42:19 | [ExprStmt] sink(arr5.pop()); | semmle.label | 26 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:42:3:42:19 | [ExprStmt] sink(arr5.pop()); | semmle.order | 26 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:44:3:44:28 | [ExprStmt] sink(ar ... pop()); | semmle.label | 27 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:44:3:44:28 | [ExprStmt] sink(ar ... pop()); | semmle.order | 27 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:46:3:46:16 | [DeclStmt] var arr6 = ... | semmle.label | 28 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:46:3:46:16 | [DeclStmt] var arr6 = ... | semmle.order | 28 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:47:3:49:3 | [ForStmt] for (va ... i]; } | semmle.label | 29 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:47:3:49:3 | [ForStmt] for (va ... i]; } | semmle.order | 29 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:50:3:50:19 | [ExprStmt] sink(arr6.pop()); | semmle.label | 30 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:50:3:50:19 | [ExprStmt] sink(arr6.pop()); | semmle.order | 30 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:53:3:56:5 | [ExprStmt] ["sourc ... . }); | semmle.label | 31 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:53:3:56:5 | [ExprStmt] ["sourc ... . }); | semmle.order | 31 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:58:3:58:15 | [ExprStmt] sink(arr[0]); | semmle.label | 32 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:58:3:58:15 | [ExprStmt] sink(arr[0]); | semmle.order | 32 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:60:3:62:3 | [ForOfStmt] for (co ... OK } | semmle.label | 33 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:60:3:62:3 | [ForOfStmt] for (co ... OK } | semmle.order | 33 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:64:3:66:3 | [ForOfStmt] for (co ... OK } | semmle.label | 34 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:64:3:66:3 | [ForOfStmt] for (co ... OK } | semmle.order | 34 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:68:3:70:3 | [ForOfStmt] for (co ... OK } | semmle.label | 35 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:68:3:70:3 | [ForOfStmt] for (co ... OK } | semmle.order | 35 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:72:3:72:16 | [DeclStmt] var arr7 = ... | semmle.label | 36 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:72:3:72:16 | [DeclStmt] var arr7 = ... | semmle.order | 36 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:73:3:73:20 | [ExprStmt] arr7.push(...arr); | semmle.label | 37 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:73:3:73:20 | [ExprStmt] arr7.push(...arr); | semmle.order | 37 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:74:3:76:3 | [ForOfStmt] for (co ... OK } | semmle.label | 38 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:74:3:76:3 | [ForOfStmt] for (co ... OK } | semmle.order | 38 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:78:3:78:42 | [DeclStmt] const arrayFrom = ... | semmle.label | 39 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:78:3:78:42 | [DeclStmt] const arrayFrom = ... | semmle.order | 39 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:79:3:81:3 | [ForOfStmt] for (co ... OK } | semmle.label | 40 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:79:3:81:3 | [ForOfStmt] for (co ... OK } | semmle.order | 40 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:83:3:83:31 | [ExprStmt] sink(ar ... back)); | semmle.label | 41 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:83:3:83:31 | [ExprStmt] sink(ar ... back)); | semmle.order | 41 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:85:3:85:42 | [DeclStmt] const arrayFind = ... | semmle.label | 42 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:85:3:85:42 | [DeclStmt] const arrayFind = ... | semmle.order | 42 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:86:3:86:37 | [ExprStmt] sink(ar ... back)); | semmle.label | 43 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:86:3:86:37 | [ExprStmt] sink(ar ... back)); | semmle.order | 43 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:88:3:88:31 | [DeclStmt] const uniq = ... | semmle.label | 44 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:88:3:88:31 | [DeclStmt] const uniq = ... | semmle.order | 44 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:89:3:91:3 | [ForOfStmt] for (co ... OK } | semmle.label | 45 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:89:3:91:3 | [ForOfStmt] for (co ... OK } | semmle.order | 45 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:93:3:93:19 | [ExprStmt] sink(arr.at(-1)); | semmle.label | 46 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:93:3:93:19 | [ExprStmt] sink(arr.at(-1)); | semmle.order | 46 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:95:3:95:19 | [ExprStmt] sink(["source"]); | semmle.label | 47 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:95:3:95:19 | [ExprStmt] sink(["source"]); | semmle.order | 47 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:96:3:96:42 | [ExprStmt] sink([" ... pop()); | semmle.label | 48 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:96:3:96:42 | [ExprStmt] sink([" ... pop()); | semmle.order | 48 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:97:3:97:44 | [ExprStmt] sink([" ... pop()); | semmle.label | 49 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:97:3:97:44 | [ExprStmt] sink([" ... pop()); | semmle.order | 49 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:99:3:99:16 | [DeclStmt] var arr8 = ... | semmle.label | 50 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:99:3:99:16 | [DeclStmt] var arr8 = ... | semmle.order | 50 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:100:3:100:40 | [ExprStmt] arr8 = ... urce"); | semmle.label | 51 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:100:3:100:40 | [ExprStmt] arr8 = ... urce"); | semmle.order | 51 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:101:3:101:19 | [ExprStmt] sink(arr8.pop()); | semmle.label | 52 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:101:3:101:19 | [ExprStmt] sink(arr8.pop()); | semmle.order | 52 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:103:3:103:24 | [DeclStmt] var arr8_variant = ... | semmle.label | 53 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:103:3:103:24 | [DeclStmt] var arr8_variant = ... | semmle.order | 53 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:104:3:104:64 | [ExprStmt] arr8_va ... urce"); | semmle.label | 54 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:104:3:104:64 | [ExprStmt] arr8_va ... urce"); | semmle.order | 54 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:105:3:105:21 | [ExprStmt] arr8_variant.pop(); | semmle.label | 55 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:105:3:105:21 | [ExprStmt] arr8_variant.pop(); | semmle.order | 55 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:106:3:106:27 | [ExprStmt] sink(ar ... pop()); | semmle.label | 56 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:106:3:106:27 | [ExprStmt] sink(ar ... pop()); | semmle.order | 56 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:108:3:108:23 | [DeclStmt] var arr8_spread = ... | semmle.label | 57 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:108:3:108:23 | [DeclStmt] var arr8_spread = ... | semmle.order | 57 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:109:3:109:52 | [ExprStmt] arr8_sp ... ..arr); | semmle.label | 58 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:109:3:109:52 | [ExprStmt] arr8_sp ... ..arr); | semmle.order | 58 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:110:3:110:26 | [ExprStmt] sink(ar ... pop()); | semmle.label | 59 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:110:3:110:26 | [ExprStmt] sink(ar ... pop()); | semmle.order | 59 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:112:3:112:35 | [ExprStmt] sink(ar ... back)); | semmle.label | 60 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:112:3:112:35 | [ExprStmt] sink(ar ... back)); | semmle.order | 60 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:114:3:118:3 | [BlockStmt] { // T ... OK } | semmle.label | 61 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:114:3:118:3 | [BlockStmt] { // T ... OK } | semmle.order | 61 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:120:3:124:3 | [BlockStmt] { // T ... OK } | semmle.label | 62 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:120:3:124:3 | [BlockStmt] { // T ... OK } | semmle.order | 62 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:126:3:130:3 | [BlockStmt] { // T ... OK } | semmle.label | 63 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:126:3:130:3 | [BlockStmt] { // T ... OK } | semmle.order | 63 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:131:3:135:3 | [BlockStmt] { c ... OK } | semmle.label | 64 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:131:3:135:3 | [BlockStmt] { c ... OK } | semmle.order | 64 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:137:3:141:3 | [BlockStmt] { c ... OK } | semmle.label | 65 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:137:3:141:3 | [BlockStmt] { c ... OK } | semmle.order | 65 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:143:3:147:3 | [BlockStmt] { c ... OK } | semmle.label | 66 | +| arrays.js:1:14:148:1 | [BlockStmt] { let ... K } } | arrays.js:143:3:147:3 | [BlockStmt] { c ... OK } | semmle.order | 66 | | arrays.js:2:3:2:24 | [DeclStmt] let source = ... | arrays.js:2:7:2:23 | [VariableDeclarator] source = "source" | semmle.label | 1 | | arrays.js:2:3:2:24 | [DeclStmt] let source = ... | arrays.js:2:7:2:23 | [VariableDeclarator] source = "source" | semmle.order | 1 | | arrays.js:2:7:2:23 | [VariableDeclarator] source = "source" | arrays.js:2:7:2:12 | [VarDecl] source | semmle.label | 1 | @@ -1524,6 +1704,272 @@ edges | arrays.js:110:8:110:22 | [DotExpr] arr8_spread.pop | arrays.js:110:20:110:22 | [Label] pop | semmle.order | 2 | | arrays.js:110:8:110:24 | [MethodCallExpr] arr8_spread.pop() | arrays.js:110:8:110:22 | [DotExpr] arr8_spread.pop | semmle.label | 0 | | arrays.js:110:8:110:24 | [MethodCallExpr] arr8_spread.pop() | arrays.js:110:8:110:22 | [DotExpr] arr8_spread.pop | semmle.order | 0 | +| arrays.js:112:3:112:34 | [CallExpr] sink(ar ... lback)) | arrays.js:112:3:112:6 | [VarRef] sink | semmle.label | 0 | +| arrays.js:112:3:112:34 | [CallExpr] sink(ar ... lback)) | arrays.js:112:3:112:6 | [VarRef] sink | semmle.order | 0 | +| arrays.js:112:3:112:34 | [CallExpr] sink(ar ... lback)) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:112:3:112:34 | [CallExpr] sink(ar ... lback)) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:112:3:112:35 | [ExprStmt] sink(ar ... back)); | arrays.js:112:3:112:34 | [CallExpr] sink(ar ... lback)) | semmle.label | 1 | +| arrays.js:112:3:112:35 | [ExprStmt] sink(ar ... back)); | arrays.js:112:3:112:34 | [CallExpr] sink(ar ... lback)) | semmle.order | 1 | +| arrays.js:112:8:112:19 | [DotExpr] arr.findLast | arrays.js:112:8:112:10 | [VarRef] arr | semmle.label | 1 | +| arrays.js:112:8:112:19 | [DotExpr] arr.findLast | arrays.js:112:8:112:10 | [VarRef] arr | semmle.order | 1 | +| arrays.js:112:8:112:19 | [DotExpr] arr.findLast | arrays.js:112:12:112:19 | [Label] findLast | semmle.label | 2 | +| arrays.js:112:8:112:19 | [DotExpr] arr.findLast | arrays.js:112:12:112:19 | [Label] findLast | semmle.order | 2 | +| arrays.js:112:8:112:33 | [MethodCallExpr] arr.fin ... llback) | arrays.js:112:8:112:19 | [DotExpr] arr.findLast | semmle.label | 0 | +| arrays.js:112:8:112:33 | [MethodCallExpr] arr.fin ... llback) | arrays.js:112:8:112:19 | [DotExpr] arr.findLast | semmle.order | 0 | +| arrays.js:112:8:112:33 | [MethodCallExpr] arr.fin ... llback) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:112:8:112:33 | [MethodCallExpr] arr.fin ... llback) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:114:3:118:3 | [BlockStmt] { // T ... OK } | arrays.js:115:5:115:28 | [DeclStmt] const list = ... | semmle.label | 1 | +| arrays.js:114:3:118:3 | [BlockStmt] { // T ... OK } | arrays.js:115:5:115:28 | [DeclStmt] const list = ... | semmle.order | 1 | +| arrays.js:114:3:118:3 | [BlockStmt] { // T ... OK } | arrays.js:116:5:116:56 | [DeclStmt] const element = ... | semmle.label | 2 | +| arrays.js:114:3:118:3 | [BlockStmt] { // T ... OK } | arrays.js:116:5:116:56 | [DeclStmt] const element = ... | semmle.order | 2 | +| arrays.js:114:3:118:3 | [BlockStmt] { // T ... OK } | arrays.js:117:5:117:18 | [ExprStmt] sink(element); | semmle.label | 3 | +| arrays.js:114:3:118:3 | [BlockStmt] { // T ... OK } | arrays.js:117:5:117:18 | [ExprStmt] sink(element); | semmle.order | 3 | +| arrays.js:115:5:115:28 | [DeclStmt] const list = ... | arrays.js:115:11:115:27 | [VariableDeclarator] list = ["source"] | semmle.label | 1 | +| arrays.js:115:5:115:28 | [DeclStmt] const list = ... | arrays.js:115:11:115:27 | [VariableDeclarator] list = ["source"] | semmle.order | 1 | +| arrays.js:115:11:115:27 | [VariableDeclarator] list = ["source"] | arrays.js:115:11:115:14 | [VarDecl] list | semmle.label | 1 | +| arrays.js:115:11:115:27 | [VariableDeclarator] list = ["source"] | arrays.js:115:11:115:14 | [VarDecl] list | semmle.order | 1 | +| arrays.js:115:11:115:27 | [VariableDeclarator] list = ["source"] | arrays.js:115:18:115:27 | [ArrayExpr] ["source"] | semmle.label | 2 | +| arrays.js:115:11:115:27 | [VariableDeclarator] list = ["source"] | arrays.js:115:18:115:27 | [ArrayExpr] ["source"] | semmle.order | 2 | +| arrays.js:115:18:115:27 | [ArrayExpr] ["source"] | arrays.js:115:19:115:26 | [Literal] "source" | semmle.label | 1 | +| arrays.js:115:18:115:27 | [ArrayExpr] ["source"] | arrays.js:115:19:115:26 | [Literal] "source" | semmle.order | 1 | +| arrays.js:116:5:116:56 | [DeclStmt] const element = ... | arrays.js:116:11:116:55 | [VariableDeclarator] element ... (item)) | semmle.label | 1 | +| arrays.js:116:5:116:56 | [DeclStmt] const element = ... | arrays.js:116:11:116:55 | [VariableDeclarator] element ... (item)) | semmle.order | 1 | +| arrays.js:116:11:116:55 | [VariableDeclarator] element ... (item)) | arrays.js:116:11:116:17 | [VarDecl] element | semmle.label | 1 | +| arrays.js:116:11:116:55 | [VariableDeclarator] element ... (item)) | arrays.js:116:11:116:17 | [VarDecl] element | semmle.order | 1 | +| arrays.js:116:11:116:55 | [VariableDeclarator] element ... (item)) | arrays.js:116:21:116:55 | [MethodCallExpr] list.fi ... (item)) | semmle.label | 2 | +| arrays.js:116:11:116:55 | [VariableDeclarator] element ... (item)) | arrays.js:116:21:116:55 | [MethodCallExpr] list.fi ... (item)) | semmle.order | 2 | +| arrays.js:116:21:116:33 | [DotExpr] list.findLast | arrays.js:116:21:116:24 | [VarRef] list | semmle.label | 1 | +| arrays.js:116:21:116:33 | [DotExpr] list.findLast | arrays.js:116:21:116:24 | [VarRef] list | semmle.order | 1 | +| arrays.js:116:21:116:33 | [DotExpr] list.findLast | arrays.js:116:26:116:33 | [Label] findLast | semmle.label | 2 | +| arrays.js:116:21:116:33 | [DotExpr] list.findLast | arrays.js:116:26:116:33 | [Label] findLast | semmle.order | 2 | +| arrays.js:116:21:116:55 | [MethodCallExpr] list.fi ... (item)) | arrays.js:116:21:116:33 | [DotExpr] list.findLast | semmle.label | 0 | +| arrays.js:116:21:116:55 | [MethodCallExpr] list.fi ... (item)) | arrays.js:116:21:116:33 | [DotExpr] list.findLast | semmle.order | 0 | +| arrays.js:116:21:116:55 | [MethodCallExpr] list.fi ... (item)) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:116:21:116:55 | [MethodCallExpr] list.fi ... (item)) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:116:35:116:54 | [ArrowFunctionExpr] (item) => sink(item) | arrays.js:116:45:116:54 | [CallExpr] sink(item) | semmle.label | 5 | +| arrays.js:116:35:116:54 | [ArrowFunctionExpr] (item) => sink(item) | arrays.js:116:45:116:54 | [CallExpr] sink(item) | semmle.order | 5 | +| arrays.js:116:35:116:54 | [ArrowFunctionExpr] (item) => sink(item) | file://:0:0:0:0 | (Parameters) | semmle.label | 1 | +| arrays.js:116:35:116:54 | [ArrowFunctionExpr] (item) => sink(item) | file://:0:0:0:0 | (Parameters) | semmle.order | 1 | +| arrays.js:116:45:116:54 | [CallExpr] sink(item) | arrays.js:116:45:116:48 | [VarRef] sink | semmle.label | 0 | +| arrays.js:116:45:116:54 | [CallExpr] sink(item) | arrays.js:116:45:116:48 | [VarRef] sink | semmle.order | 0 | +| arrays.js:116:45:116:54 | [CallExpr] sink(item) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:116:45:116:54 | [CallExpr] sink(item) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:117:5:117:17 | [CallExpr] sink(element) | arrays.js:117:5:117:8 | [VarRef] sink | semmle.label | 0 | +| arrays.js:117:5:117:17 | [CallExpr] sink(element) | arrays.js:117:5:117:8 | [VarRef] sink | semmle.order | 0 | +| arrays.js:117:5:117:17 | [CallExpr] sink(element) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:117:5:117:17 | [CallExpr] sink(element) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:117:5:117:18 | [ExprStmt] sink(element); | arrays.js:117:5:117:17 | [CallExpr] sink(element) | semmle.label | 1 | +| arrays.js:117:5:117:18 | [ExprStmt] sink(element); | arrays.js:117:5:117:17 | [CallExpr] sink(element) | semmle.order | 1 | +| arrays.js:120:3:124:3 | [BlockStmt] { // T ... OK } | arrays.js:121:5:121:28 | [DeclStmt] const list = ... | semmle.label | 1 | +| arrays.js:120:3:124:3 | [BlockStmt] { // T ... OK } | arrays.js:121:5:121:28 | [DeclStmt] const list = ... | semmle.order | 1 | +| arrays.js:120:3:124:3 | [BlockStmt] { // T ... OK } | arrays.js:122:5:122:52 | [DeclStmt] const element = ... | semmle.label | 2 | +| arrays.js:120:3:124:3 | [BlockStmt] { // T ... OK } | arrays.js:122:5:122:52 | [DeclStmt] const element = ... | semmle.order | 2 | +| arrays.js:120:3:124:3 | [BlockStmt] { // T ... OK } | arrays.js:123:5:123:18 | [ExprStmt] sink(element); | semmle.label | 3 | +| arrays.js:120:3:124:3 | [BlockStmt] { // T ... OK } | arrays.js:123:5:123:18 | [ExprStmt] sink(element); | semmle.order | 3 | +| arrays.js:121:5:121:28 | [DeclStmt] const list = ... | arrays.js:121:11:121:27 | [VariableDeclarator] list = ["source"] | semmle.label | 1 | +| arrays.js:121:5:121:28 | [DeclStmt] const list = ... | arrays.js:121:11:121:27 | [VariableDeclarator] list = ["source"] | semmle.order | 1 | +| arrays.js:121:11:121:27 | [VariableDeclarator] list = ["source"] | arrays.js:121:11:121:14 | [VarDecl] list | semmle.label | 1 | +| arrays.js:121:11:121:27 | [VariableDeclarator] list = ["source"] | arrays.js:121:11:121:14 | [VarDecl] list | semmle.order | 1 | +| arrays.js:121:11:121:27 | [VariableDeclarator] list = ["source"] | arrays.js:121:18:121:27 | [ArrayExpr] ["source"] | semmle.label | 2 | +| arrays.js:121:11:121:27 | [VariableDeclarator] list = ["source"] | arrays.js:121:18:121:27 | [ArrayExpr] ["source"] | semmle.order | 2 | +| arrays.js:121:18:121:27 | [ArrayExpr] ["source"] | arrays.js:121:19:121:26 | [Literal] "source" | semmle.label | 1 | +| arrays.js:121:18:121:27 | [ArrayExpr] ["source"] | arrays.js:121:19:121:26 | [Literal] "source" | semmle.order | 1 | +| arrays.js:122:5:122:52 | [DeclStmt] const element = ... | arrays.js:122:11:122:51 | [VariableDeclarator] element ... (item)) | semmle.label | 1 | +| arrays.js:122:5:122:52 | [DeclStmt] const element = ... | arrays.js:122:11:122:51 | [VariableDeclarator] element ... (item)) | semmle.order | 1 | +| arrays.js:122:11:122:51 | [VariableDeclarator] element ... (item)) | arrays.js:122:11:122:17 | [VarDecl] element | semmle.label | 1 | +| arrays.js:122:11:122:51 | [VariableDeclarator] element ... (item)) | arrays.js:122:11:122:17 | [VarDecl] element | semmle.order | 1 | +| arrays.js:122:11:122:51 | [VariableDeclarator] element ... (item)) | arrays.js:122:21:122:51 | [MethodCallExpr] list.fi ... (item)) | semmle.label | 2 | +| arrays.js:122:11:122:51 | [VariableDeclarator] element ... (item)) | arrays.js:122:21:122:51 | [MethodCallExpr] list.fi ... (item)) | semmle.order | 2 | +| arrays.js:122:21:122:29 | [DotExpr] list.find | arrays.js:122:21:122:24 | [VarRef] list | semmle.label | 1 | +| arrays.js:122:21:122:29 | [DotExpr] list.find | arrays.js:122:21:122:24 | [VarRef] list | semmle.order | 1 | +| arrays.js:122:21:122:29 | [DotExpr] list.find | arrays.js:122:26:122:29 | [Label] find | semmle.label | 2 | +| arrays.js:122:21:122:29 | [DotExpr] list.find | arrays.js:122:26:122:29 | [Label] find | semmle.order | 2 | +| arrays.js:122:21:122:51 | [MethodCallExpr] list.fi ... (item)) | arrays.js:122:21:122:29 | [DotExpr] list.find | semmle.label | 0 | +| arrays.js:122:21:122:51 | [MethodCallExpr] list.fi ... (item)) | arrays.js:122:21:122:29 | [DotExpr] list.find | semmle.order | 0 | +| arrays.js:122:21:122:51 | [MethodCallExpr] list.fi ... (item)) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:122:21:122:51 | [MethodCallExpr] list.fi ... (item)) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:122:31:122:50 | [ArrowFunctionExpr] (item) => sink(item) | arrays.js:122:41:122:50 | [CallExpr] sink(item) | semmle.label | 5 | +| arrays.js:122:31:122:50 | [ArrowFunctionExpr] (item) => sink(item) | arrays.js:122:41:122:50 | [CallExpr] sink(item) | semmle.order | 5 | +| arrays.js:122:31:122:50 | [ArrowFunctionExpr] (item) => sink(item) | file://:0:0:0:0 | (Parameters) | semmle.label | 1 | +| arrays.js:122:31:122:50 | [ArrowFunctionExpr] (item) => sink(item) | file://:0:0:0:0 | (Parameters) | semmle.order | 1 | +| arrays.js:122:41:122:50 | [CallExpr] sink(item) | arrays.js:122:41:122:44 | [VarRef] sink | semmle.label | 0 | +| arrays.js:122:41:122:50 | [CallExpr] sink(item) | arrays.js:122:41:122:44 | [VarRef] sink | semmle.order | 0 | +| arrays.js:122:41:122:50 | [CallExpr] sink(item) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:122:41:122:50 | [CallExpr] sink(item) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:123:5:123:17 | [CallExpr] sink(element) | arrays.js:123:5:123:8 | [VarRef] sink | semmle.label | 0 | +| arrays.js:123:5:123:17 | [CallExpr] sink(element) | arrays.js:123:5:123:8 | [VarRef] sink | semmle.order | 0 | +| arrays.js:123:5:123:17 | [CallExpr] sink(element) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:123:5:123:17 | [CallExpr] sink(element) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:123:5:123:18 | [ExprStmt] sink(element); | arrays.js:123:5:123:17 | [CallExpr] sink(element) | semmle.label | 1 | +| arrays.js:123:5:123:18 | [ExprStmt] sink(element); | arrays.js:123:5:123:17 | [CallExpr] sink(element) | semmle.order | 1 | +| arrays.js:126:3:130:3 | [BlockStmt] { // T ... OK } | arrays.js:127:5:127:28 | [DeclStmt] const list = ... | semmle.label | 1 | +| arrays.js:126:3:130:3 | [BlockStmt] { // T ... OK } | arrays.js:127:5:127:28 | [DeclStmt] const list = ... | semmle.order | 1 | +| arrays.js:126:3:130:3 | [BlockStmt] { // T ... OK } | arrays.js:128:5:128:61 | [DeclStmt] const element = ... | semmle.label | 2 | +| arrays.js:126:3:130:3 | [BlockStmt] { // T ... OK } | arrays.js:128:5:128:61 | [DeclStmt] const element = ... | semmle.order | 2 | +| arrays.js:126:3:130:3 | [BlockStmt] { // T ... OK } | arrays.js:129:5:129:18 | [ExprStmt] sink(element); | semmle.label | 3 | +| arrays.js:126:3:130:3 | [BlockStmt] { // T ... OK } | arrays.js:129:5:129:18 | [ExprStmt] sink(element); | semmle.order | 3 | +| arrays.js:127:5:127:28 | [DeclStmt] const list = ... | arrays.js:127:11:127:27 | [VariableDeclarator] list = ["source"] | semmle.label | 1 | +| arrays.js:127:5:127:28 | [DeclStmt] const list = ... | arrays.js:127:11:127:27 | [VariableDeclarator] list = ["source"] | semmle.order | 1 | +| arrays.js:127:11:127:27 | [VariableDeclarator] list = ["source"] | arrays.js:127:11:127:14 | [VarDecl] list | semmle.label | 1 | +| arrays.js:127:11:127:27 | [VariableDeclarator] list = ["source"] | arrays.js:127:11:127:14 | [VarDecl] list | semmle.order | 1 | +| arrays.js:127:11:127:27 | [VariableDeclarator] list = ["source"] | arrays.js:127:18:127:27 | [ArrayExpr] ["source"] | semmle.label | 2 | +| arrays.js:127:11:127:27 | [VariableDeclarator] list = ["source"] | arrays.js:127:18:127:27 | [ArrayExpr] ["source"] | semmle.order | 2 | +| arrays.js:127:18:127:27 | [ArrayExpr] ["source"] | arrays.js:127:19:127:26 | [Literal] "source" | semmle.label | 1 | +| arrays.js:127:18:127:27 | [ArrayExpr] ["source"] | arrays.js:127:19:127:26 | [Literal] "source" | semmle.order | 1 | +| arrays.js:128:5:128:61 | [DeclStmt] const element = ... | arrays.js:128:11:128:60 | [VariableDeclarator] element ... (item)) | semmle.label | 1 | +| arrays.js:128:5:128:61 | [DeclStmt] const element = ... | arrays.js:128:11:128:60 | [VariableDeclarator] element ... (item)) | semmle.order | 1 | +| arrays.js:128:11:128:60 | [VariableDeclarator] element ... (item)) | arrays.js:128:11:128:17 | [VarDecl] element | semmle.label | 1 | +| arrays.js:128:11:128:60 | [VariableDeclarator] element ... (item)) | arrays.js:128:11:128:17 | [VarDecl] element | semmle.order | 1 | +| arrays.js:128:11:128:60 | [VariableDeclarator] element ... (item)) | arrays.js:128:21:128:60 | [MethodCallExpr] list.fi ... (item)) | semmle.label | 2 | +| arrays.js:128:11:128:60 | [VariableDeclarator] element ... (item)) | arrays.js:128:21:128:60 | [MethodCallExpr] list.fi ... (item)) | semmle.order | 2 | +| arrays.js:128:21:128:38 | [DotExpr] list.findLastIndex | arrays.js:128:21:128:24 | [VarRef] list | semmle.label | 1 | +| arrays.js:128:21:128:38 | [DotExpr] list.findLastIndex | arrays.js:128:21:128:24 | [VarRef] list | semmle.order | 1 | +| arrays.js:128:21:128:38 | [DotExpr] list.findLastIndex | arrays.js:128:26:128:38 | [Label] findLastIndex | semmle.label | 2 | +| arrays.js:128:21:128:38 | [DotExpr] list.findLastIndex | arrays.js:128:26:128:38 | [Label] findLastIndex | semmle.order | 2 | +| arrays.js:128:21:128:60 | [MethodCallExpr] list.fi ... (item)) | arrays.js:128:21:128:38 | [DotExpr] list.findLastIndex | semmle.label | 0 | +| arrays.js:128:21:128:60 | [MethodCallExpr] list.fi ... (item)) | arrays.js:128:21:128:38 | [DotExpr] list.findLastIndex | semmle.order | 0 | +| arrays.js:128:21:128:60 | [MethodCallExpr] list.fi ... (item)) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:128:21:128:60 | [MethodCallExpr] list.fi ... (item)) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:128:40:128:59 | [ArrowFunctionExpr] (item) => sink(item) | arrays.js:128:50:128:59 | [CallExpr] sink(item) | semmle.label | 5 | +| arrays.js:128:40:128:59 | [ArrowFunctionExpr] (item) => sink(item) | arrays.js:128:50:128:59 | [CallExpr] sink(item) | semmle.order | 5 | +| arrays.js:128:40:128:59 | [ArrowFunctionExpr] (item) => sink(item) | file://:0:0:0:0 | (Parameters) | semmle.label | 1 | +| arrays.js:128:40:128:59 | [ArrowFunctionExpr] (item) => sink(item) | file://:0:0:0:0 | (Parameters) | semmle.order | 1 | +| arrays.js:128:50:128:59 | [CallExpr] sink(item) | arrays.js:128:50:128:53 | [VarRef] sink | semmle.label | 0 | +| arrays.js:128:50:128:59 | [CallExpr] sink(item) | arrays.js:128:50:128:53 | [VarRef] sink | semmle.order | 0 | +| arrays.js:128:50:128:59 | [CallExpr] sink(item) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:128:50:128:59 | [CallExpr] sink(item) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:129:5:129:17 | [CallExpr] sink(element) | arrays.js:129:5:129:8 | [VarRef] sink | semmle.label | 0 | +| arrays.js:129:5:129:17 | [CallExpr] sink(element) | arrays.js:129:5:129:8 | [VarRef] sink | semmle.order | 0 | +| arrays.js:129:5:129:17 | [CallExpr] sink(element) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:129:5:129:17 | [CallExpr] sink(element) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:129:5:129:18 | [ExprStmt] sink(element); | arrays.js:129:5:129:17 | [CallExpr] sink(element) | semmle.label | 1 | +| arrays.js:129:5:129:18 | [ExprStmt] sink(element); | arrays.js:129:5:129:17 | [CallExpr] sink(element) | semmle.order | 1 | +| arrays.js:131:3:135:3 | [BlockStmt] { c ... OK } | arrays.js:132:5:132:25 | [DeclStmt] const arr = ... | semmle.label | 1 | +| arrays.js:131:3:135:3 | [BlockStmt] { c ... OK } | arrays.js:132:5:132:25 | [DeclStmt] const arr = ... | semmle.order | 1 | +| arrays.js:131:3:135:3 | [BlockStmt] { c ... OK } | arrays.js:133:5:133:52 | [DeclStmt] const element1 = ... | semmle.label | 2 | +| arrays.js:131:3:135:3 | [BlockStmt] { c ... OK } | arrays.js:133:5:133:52 | [DeclStmt] const element1 = ... | semmle.order | 2 | +| arrays.js:131:3:135:3 | [BlockStmt] { c ... OK } | arrays.js:134:5:134:19 | [ExprStmt] sink(element1); | semmle.label | 3 | +| arrays.js:131:3:135:3 | [BlockStmt] { c ... OK } | arrays.js:134:5:134:19 | [ExprStmt] sink(element1); | semmle.order | 3 | +| arrays.js:132:5:132:25 | [DeclStmt] const arr = ... | arrays.js:132:11:132:24 | [VariableDeclarator] arr = source() | semmle.label | 1 | +| arrays.js:132:5:132:25 | [DeclStmt] const arr = ... | arrays.js:132:11:132:24 | [VariableDeclarator] arr = source() | semmle.order | 1 | +| arrays.js:132:11:132:24 | [VariableDeclarator] arr = source() | arrays.js:132:11:132:13 | [VarDecl] arr | semmle.label | 1 | +| arrays.js:132:11:132:24 | [VariableDeclarator] arr = source() | arrays.js:132:11:132:13 | [VarDecl] arr | semmle.order | 1 | +| arrays.js:132:11:132:24 | [VariableDeclarator] arr = source() | arrays.js:132:17:132:24 | [CallExpr] source() | semmle.label | 2 | +| arrays.js:132:11:132:24 | [VariableDeclarator] arr = source() | arrays.js:132:17:132:24 | [CallExpr] source() | semmle.order | 2 | +| arrays.js:132:17:132:24 | [CallExpr] source() | arrays.js:132:17:132:22 | [VarRef] source | semmle.label | 0 | +| arrays.js:132:17:132:24 | [CallExpr] source() | arrays.js:132:17:132:22 | [VarRef] source | semmle.order | 0 | +| arrays.js:133:5:133:52 | [DeclStmt] const element1 = ... | arrays.js:133:11:133:51 | [VariableDeclarator] element ... (item)) | semmle.label | 1 | +| arrays.js:133:5:133:52 | [DeclStmt] const element1 = ... | arrays.js:133:11:133:51 | [VariableDeclarator] element ... (item)) | semmle.order | 1 | +| arrays.js:133:11:133:51 | [VariableDeclarator] element ... (item)) | arrays.js:133:11:133:18 | [VarDecl] element1 | semmle.label | 1 | +| arrays.js:133:11:133:51 | [VariableDeclarator] element ... (item)) | arrays.js:133:11:133:18 | [VarDecl] element1 | semmle.order | 1 | +| arrays.js:133:11:133:51 | [VariableDeclarator] element ... (item)) | arrays.js:133:22:133:51 | [MethodCallExpr] arr.fin ... (item)) | semmle.label | 2 | +| arrays.js:133:11:133:51 | [VariableDeclarator] element ... (item)) | arrays.js:133:22:133:51 | [MethodCallExpr] arr.fin ... (item)) | semmle.order | 2 | +| arrays.js:133:22:133:29 | [DotExpr] arr.find | arrays.js:133:22:133:24 | [VarRef] arr | semmle.label | 1 | +| arrays.js:133:22:133:29 | [DotExpr] arr.find | arrays.js:133:22:133:24 | [VarRef] arr | semmle.order | 1 | +| arrays.js:133:22:133:29 | [DotExpr] arr.find | arrays.js:133:26:133:29 | [Label] find | semmle.label | 2 | +| arrays.js:133:22:133:29 | [DotExpr] arr.find | arrays.js:133:26:133:29 | [Label] find | semmle.order | 2 | +| arrays.js:133:22:133:51 | [MethodCallExpr] arr.fin ... (item)) | arrays.js:133:22:133:29 | [DotExpr] arr.find | semmle.label | 0 | +| arrays.js:133:22:133:51 | [MethodCallExpr] arr.fin ... (item)) | arrays.js:133:22:133:29 | [DotExpr] arr.find | semmle.order | 0 | +| arrays.js:133:22:133:51 | [MethodCallExpr] arr.fin ... (item)) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:133:22:133:51 | [MethodCallExpr] arr.fin ... (item)) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:133:31:133:50 | [ArrowFunctionExpr] (item) => sink(item) | arrays.js:133:41:133:50 | [CallExpr] sink(item) | semmle.label | 5 | +| arrays.js:133:31:133:50 | [ArrowFunctionExpr] (item) => sink(item) | arrays.js:133:41:133:50 | [CallExpr] sink(item) | semmle.order | 5 | +| arrays.js:133:31:133:50 | [ArrowFunctionExpr] (item) => sink(item) | file://:0:0:0:0 | (Parameters) | semmle.label | 1 | +| arrays.js:133:31:133:50 | [ArrowFunctionExpr] (item) => sink(item) | file://:0:0:0:0 | (Parameters) | semmle.order | 1 | +| arrays.js:133:41:133:50 | [CallExpr] sink(item) | arrays.js:133:41:133:44 | [VarRef] sink | semmle.label | 0 | +| arrays.js:133:41:133:50 | [CallExpr] sink(item) | arrays.js:133:41:133:44 | [VarRef] sink | semmle.order | 0 | +| arrays.js:133:41:133:50 | [CallExpr] sink(item) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:133:41:133:50 | [CallExpr] sink(item) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:134:5:134:18 | [CallExpr] sink(element1) | arrays.js:134:5:134:8 | [VarRef] sink | semmle.label | 0 | +| arrays.js:134:5:134:18 | [CallExpr] sink(element1) | arrays.js:134:5:134:8 | [VarRef] sink | semmle.order | 0 | +| arrays.js:134:5:134:18 | [CallExpr] sink(element1) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:134:5:134:18 | [CallExpr] sink(element1) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:134:5:134:19 | [ExprStmt] sink(element1); | arrays.js:134:5:134:18 | [CallExpr] sink(element1) | semmle.label | 1 | +| arrays.js:134:5:134:19 | [ExprStmt] sink(element1); | arrays.js:134:5:134:18 | [CallExpr] sink(element1) | semmle.order | 1 | +| arrays.js:137:3:141:3 | [BlockStmt] { c ... OK } | arrays.js:138:5:138:25 | [DeclStmt] const arr = ... | semmle.label | 1 | +| arrays.js:137:3:141:3 | [BlockStmt] { c ... OK } | arrays.js:138:5:138:25 | [DeclStmt] const arr = ... | semmle.order | 1 | +| arrays.js:137:3:141:3 | [BlockStmt] { c ... OK } | arrays.js:139:5:139:56 | [DeclStmt] const element1 = ... | semmle.label | 2 | +| arrays.js:137:3:141:3 | [BlockStmt] { c ... OK } | arrays.js:139:5:139:56 | [DeclStmt] const element1 = ... | semmle.order | 2 | +| arrays.js:137:3:141:3 | [BlockStmt] { c ... OK } | arrays.js:140:5:140:19 | [ExprStmt] sink(element1); | semmle.label | 3 | +| arrays.js:137:3:141:3 | [BlockStmt] { c ... OK } | arrays.js:140:5:140:19 | [ExprStmt] sink(element1); | semmle.order | 3 | +| arrays.js:138:5:138:25 | [DeclStmt] const arr = ... | arrays.js:138:11:138:24 | [VariableDeclarator] arr = source() | semmle.label | 1 | +| arrays.js:138:5:138:25 | [DeclStmt] const arr = ... | arrays.js:138:11:138:24 | [VariableDeclarator] arr = source() | semmle.order | 1 | +| arrays.js:138:11:138:24 | [VariableDeclarator] arr = source() | arrays.js:138:11:138:13 | [VarDecl] arr | semmle.label | 1 | +| arrays.js:138:11:138:24 | [VariableDeclarator] arr = source() | arrays.js:138:11:138:13 | [VarDecl] arr | semmle.order | 1 | +| arrays.js:138:11:138:24 | [VariableDeclarator] arr = source() | arrays.js:138:17:138:24 | [CallExpr] source() | semmle.label | 2 | +| arrays.js:138:11:138:24 | [VariableDeclarator] arr = source() | arrays.js:138:17:138:24 | [CallExpr] source() | semmle.order | 2 | +| arrays.js:138:17:138:24 | [CallExpr] source() | arrays.js:138:17:138:22 | [VarRef] source | semmle.label | 0 | +| arrays.js:138:17:138:24 | [CallExpr] source() | arrays.js:138:17:138:22 | [VarRef] source | semmle.order | 0 | +| arrays.js:139:5:139:56 | [DeclStmt] const element1 = ... | arrays.js:139:11:139:55 | [VariableDeclarator] element ... (item)) | semmle.label | 1 | +| arrays.js:139:5:139:56 | [DeclStmt] const element1 = ... | arrays.js:139:11:139:55 | [VariableDeclarator] element ... (item)) | semmle.order | 1 | +| arrays.js:139:11:139:55 | [VariableDeclarator] element ... (item)) | arrays.js:139:11:139:18 | [VarDecl] element1 | semmle.label | 1 | +| arrays.js:139:11:139:55 | [VariableDeclarator] element ... (item)) | arrays.js:139:11:139:18 | [VarDecl] element1 | semmle.order | 1 | +| arrays.js:139:11:139:55 | [VariableDeclarator] element ... (item)) | arrays.js:139:22:139:55 | [MethodCallExpr] arr.fin ... (item)) | semmle.label | 2 | +| arrays.js:139:11:139:55 | [VariableDeclarator] element ... (item)) | arrays.js:139:22:139:55 | [MethodCallExpr] arr.fin ... (item)) | semmle.order | 2 | +| arrays.js:139:22:139:33 | [DotExpr] arr.findLast | arrays.js:139:22:139:24 | [VarRef] arr | semmle.label | 1 | +| arrays.js:139:22:139:33 | [DotExpr] arr.findLast | arrays.js:139:22:139:24 | [VarRef] arr | semmle.order | 1 | +| arrays.js:139:22:139:33 | [DotExpr] arr.findLast | arrays.js:139:26:139:33 | [Label] findLast | semmle.label | 2 | +| arrays.js:139:22:139:33 | [DotExpr] arr.findLast | arrays.js:139:26:139:33 | [Label] findLast | semmle.order | 2 | +| arrays.js:139:22:139:55 | [MethodCallExpr] arr.fin ... (item)) | arrays.js:139:22:139:33 | [DotExpr] arr.findLast | semmle.label | 0 | +| arrays.js:139:22:139:55 | [MethodCallExpr] arr.fin ... (item)) | arrays.js:139:22:139:33 | [DotExpr] arr.findLast | semmle.order | 0 | +| arrays.js:139:22:139:55 | [MethodCallExpr] arr.fin ... (item)) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:139:22:139:55 | [MethodCallExpr] arr.fin ... (item)) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:139:35:139:54 | [ArrowFunctionExpr] (item) => sink(item) | arrays.js:139:45:139:54 | [CallExpr] sink(item) | semmle.label | 5 | +| arrays.js:139:35:139:54 | [ArrowFunctionExpr] (item) => sink(item) | arrays.js:139:45:139:54 | [CallExpr] sink(item) | semmle.order | 5 | +| arrays.js:139:35:139:54 | [ArrowFunctionExpr] (item) => sink(item) | file://:0:0:0:0 | (Parameters) | semmle.label | 1 | +| arrays.js:139:35:139:54 | [ArrowFunctionExpr] (item) => sink(item) | file://:0:0:0:0 | (Parameters) | semmle.order | 1 | +| arrays.js:139:45:139:54 | [CallExpr] sink(item) | arrays.js:139:45:139:48 | [VarRef] sink | semmle.label | 0 | +| arrays.js:139:45:139:54 | [CallExpr] sink(item) | arrays.js:139:45:139:48 | [VarRef] sink | semmle.order | 0 | +| arrays.js:139:45:139:54 | [CallExpr] sink(item) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:139:45:139:54 | [CallExpr] sink(item) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:140:5:140:18 | [CallExpr] sink(element1) | arrays.js:140:5:140:8 | [VarRef] sink | semmle.label | 0 | +| arrays.js:140:5:140:18 | [CallExpr] sink(element1) | arrays.js:140:5:140:8 | [VarRef] sink | semmle.order | 0 | +| arrays.js:140:5:140:18 | [CallExpr] sink(element1) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:140:5:140:18 | [CallExpr] sink(element1) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:140:5:140:19 | [ExprStmt] sink(element1); | arrays.js:140:5:140:18 | [CallExpr] sink(element1) | semmle.label | 1 | +| arrays.js:140:5:140:19 | [ExprStmt] sink(element1); | arrays.js:140:5:140:18 | [CallExpr] sink(element1) | semmle.order | 1 | +| arrays.js:143:3:147:3 | [BlockStmt] { c ... OK } | arrays.js:144:5:144:25 | [DeclStmt] const arr = ... | semmle.label | 1 | +| arrays.js:143:3:147:3 | [BlockStmt] { c ... OK } | arrays.js:144:5:144:25 | [DeclStmt] const arr = ... | semmle.order | 1 | +| arrays.js:143:3:147:3 | [BlockStmt] { c ... OK } | arrays.js:145:5:145:61 | [DeclStmt] const element1 = ... | semmle.label | 2 | +| arrays.js:143:3:147:3 | [BlockStmt] { c ... OK } | arrays.js:145:5:145:61 | [DeclStmt] const element1 = ... | semmle.order | 2 | +| arrays.js:143:3:147:3 | [BlockStmt] { c ... OK } | arrays.js:146:5:146:19 | [ExprStmt] sink(element1); | semmle.label | 3 | +| arrays.js:143:3:147:3 | [BlockStmt] { c ... OK } | arrays.js:146:5:146:19 | [ExprStmt] sink(element1); | semmle.order | 3 | +| arrays.js:144:5:144:25 | [DeclStmt] const arr = ... | arrays.js:144:11:144:24 | [VariableDeclarator] arr = source() | semmle.label | 1 | +| arrays.js:144:5:144:25 | [DeclStmt] const arr = ... | arrays.js:144:11:144:24 | [VariableDeclarator] arr = source() | semmle.order | 1 | +| arrays.js:144:11:144:24 | [VariableDeclarator] arr = source() | arrays.js:144:11:144:13 | [VarDecl] arr | semmle.label | 1 | +| arrays.js:144:11:144:24 | [VariableDeclarator] arr = source() | arrays.js:144:11:144:13 | [VarDecl] arr | semmle.order | 1 | +| arrays.js:144:11:144:24 | [VariableDeclarator] arr = source() | arrays.js:144:17:144:24 | [CallExpr] source() | semmle.label | 2 | +| arrays.js:144:11:144:24 | [VariableDeclarator] arr = source() | arrays.js:144:17:144:24 | [CallExpr] source() | semmle.order | 2 | +| arrays.js:144:17:144:24 | [CallExpr] source() | arrays.js:144:17:144:22 | [VarRef] source | semmle.label | 0 | +| arrays.js:144:17:144:24 | [CallExpr] source() | arrays.js:144:17:144:22 | [VarRef] source | semmle.order | 0 | +| arrays.js:145:5:145:61 | [DeclStmt] const element1 = ... | arrays.js:145:11:145:60 | [VariableDeclarator] element ... (item)) | semmle.label | 1 | +| arrays.js:145:5:145:61 | [DeclStmt] const element1 = ... | arrays.js:145:11:145:60 | [VariableDeclarator] element ... (item)) | semmle.order | 1 | +| arrays.js:145:11:145:60 | [VariableDeclarator] element ... (item)) | arrays.js:145:11:145:18 | [VarDecl] element1 | semmle.label | 1 | +| arrays.js:145:11:145:60 | [VariableDeclarator] element ... (item)) | arrays.js:145:11:145:18 | [VarDecl] element1 | semmle.order | 1 | +| arrays.js:145:11:145:60 | [VariableDeclarator] element ... (item)) | arrays.js:145:22:145:60 | [MethodCallExpr] arr.fin ... (item)) | semmle.label | 2 | +| arrays.js:145:11:145:60 | [VariableDeclarator] element ... (item)) | arrays.js:145:22:145:60 | [MethodCallExpr] arr.fin ... (item)) | semmle.order | 2 | +| arrays.js:145:22:145:38 | [DotExpr] arr.findLastIndex | arrays.js:145:22:145:24 | [VarRef] arr | semmle.label | 1 | +| arrays.js:145:22:145:38 | [DotExpr] arr.findLastIndex | arrays.js:145:22:145:24 | [VarRef] arr | semmle.order | 1 | +| arrays.js:145:22:145:38 | [DotExpr] arr.findLastIndex | arrays.js:145:26:145:38 | [Label] findLastIndex | semmle.label | 2 | +| arrays.js:145:22:145:38 | [DotExpr] arr.findLastIndex | arrays.js:145:26:145:38 | [Label] findLastIndex | semmle.order | 2 | +| arrays.js:145:22:145:60 | [MethodCallExpr] arr.fin ... (item)) | arrays.js:145:22:145:38 | [DotExpr] arr.findLastIndex | semmle.label | 0 | +| arrays.js:145:22:145:60 | [MethodCallExpr] arr.fin ... (item)) | arrays.js:145:22:145:38 | [DotExpr] arr.findLastIndex | semmle.order | 0 | +| arrays.js:145:22:145:60 | [MethodCallExpr] arr.fin ... (item)) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:145:22:145:60 | [MethodCallExpr] arr.fin ... (item)) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:145:40:145:59 | [ArrowFunctionExpr] (item) => sink(item) | arrays.js:145:50:145:59 | [CallExpr] sink(item) | semmle.label | 5 | +| arrays.js:145:40:145:59 | [ArrowFunctionExpr] (item) => sink(item) | arrays.js:145:50:145:59 | [CallExpr] sink(item) | semmle.order | 5 | +| arrays.js:145:40:145:59 | [ArrowFunctionExpr] (item) => sink(item) | file://:0:0:0:0 | (Parameters) | semmle.label | 1 | +| arrays.js:145:40:145:59 | [ArrowFunctionExpr] (item) => sink(item) | file://:0:0:0:0 | (Parameters) | semmle.order | 1 | +| arrays.js:145:50:145:59 | [CallExpr] sink(item) | arrays.js:145:50:145:53 | [VarRef] sink | semmle.label | 0 | +| arrays.js:145:50:145:59 | [CallExpr] sink(item) | arrays.js:145:50:145:53 | [VarRef] sink | semmle.order | 0 | +| arrays.js:145:50:145:59 | [CallExpr] sink(item) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:145:50:145:59 | [CallExpr] sink(item) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:146:5:146:18 | [CallExpr] sink(element1) | arrays.js:146:5:146:8 | [VarRef] sink | semmle.label | 0 | +| arrays.js:146:5:146:18 | [CallExpr] sink(element1) | arrays.js:146:5:146:8 | [VarRef] sink | semmle.order | 0 | +| arrays.js:146:5:146:18 | [CallExpr] sink(element1) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| arrays.js:146:5:146:18 | [CallExpr] sink(element1) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| arrays.js:146:5:146:19 | [ExprStmt] sink(element1); | arrays.js:146:5:146:18 | [CallExpr] sink(element1) | semmle.label | 1 | +| arrays.js:146:5:146:19 | [ExprStmt] sink(element1); | arrays.js:146:5:146:18 | [CallExpr] sink(element1) | semmle.order | 1 | | file://:0:0:0:0 | (Arguments) | arrays.js:5:8:5:14 | [DotExpr] obj.foo | semmle.label | 0 | | file://:0:0:0:0 | (Arguments) | arrays.js:5:8:5:14 | [DotExpr] obj.foo | semmle.order | 0 | | file://:0:0:0:0 | (Arguments) | arrays.js:8:12:8:17 | [VarRef] source | semmle.label | 0 | @@ -1670,6 +2116,46 @@ edges | file://:0:0:0:0 | (Arguments) | arrays.js:109:45:109:50 | [SpreadElement] ...arr | semmle.order | 2 | | file://:0:0:0:0 | (Arguments) | arrays.js:110:8:110:24 | [MethodCallExpr] arr8_spread.pop() | semmle.label | 0 | | file://:0:0:0:0 | (Arguments) | arrays.js:110:8:110:24 | [MethodCallExpr] arr8_spread.pop() | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:112:8:112:33 | [MethodCallExpr] arr.fin ... llback) | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:112:8:112:33 | [MethodCallExpr] arr.fin ... llback) | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:112:21:112:32 | [VarRef] someCallback | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:112:21:112:32 | [VarRef] someCallback | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:116:35:116:54 | [ArrowFunctionExpr] (item) => sink(item) | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:116:35:116:54 | [ArrowFunctionExpr] (item) => sink(item) | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:116:50:116:53 | [VarRef] item | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:116:50:116:53 | [VarRef] item | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:117:10:117:16 | [VarRef] element | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:117:10:117:16 | [VarRef] element | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:122:31:122:50 | [ArrowFunctionExpr] (item) => sink(item) | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:122:31:122:50 | [ArrowFunctionExpr] (item) => sink(item) | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:122:46:122:49 | [VarRef] item | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:122:46:122:49 | [VarRef] item | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:123:10:123:16 | [VarRef] element | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:123:10:123:16 | [VarRef] element | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:128:40:128:59 | [ArrowFunctionExpr] (item) => sink(item) | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:128:40:128:59 | [ArrowFunctionExpr] (item) => sink(item) | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:128:55:128:58 | [VarRef] item | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:128:55:128:58 | [VarRef] item | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:129:10:129:16 | [VarRef] element | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:129:10:129:16 | [VarRef] element | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:133:31:133:50 | [ArrowFunctionExpr] (item) => sink(item) | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:133:31:133:50 | [ArrowFunctionExpr] (item) => sink(item) | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:133:46:133:49 | [VarRef] item | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:133:46:133:49 | [VarRef] item | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:134:10:134:17 | [VarRef] element1 | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:134:10:134:17 | [VarRef] element1 | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:139:35:139:54 | [ArrowFunctionExpr] (item) => sink(item) | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:139:35:139:54 | [ArrowFunctionExpr] (item) => sink(item) | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:139:50:139:53 | [VarRef] item | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:139:50:139:53 | [VarRef] item | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:140:10:140:17 | [VarRef] element1 | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:140:10:140:17 | [VarRef] element1 | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:145:40:145:59 | [ArrowFunctionExpr] (item) => sink(item) | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:145:40:145:59 | [ArrowFunctionExpr] (item) => sink(item) | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:145:55:145:58 | [VarRef] item | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:145:55:145:58 | [VarRef] item | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:146:10:146:17 | [VarRef] element1 | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | arrays.js:146:10:146:17 | [VarRef] element1 | semmle.order | 0 | | file://:0:0:0:0 | (Parameters) | arrays.js:15:16:15:16 | [SimpleParameter] e | semmle.label | 0 | | file://:0:0:0:0 | (Parameters) | arrays.js:15:16:15:16 | [SimpleParameter] e | semmle.order | 0 | | file://:0:0:0:0 | (Parameters) | arrays.js:16:12:16:12 | [SimpleParameter] e | semmle.label | 0 | @@ -1688,5 +2174,17 @@ edges | file://:0:0:0:0 | (Parameters) | arrays.js:96:27:96:27 | [SimpleParameter] x | semmle.order | 0 | | file://:0:0:0:0 | (Parameters) | arrays.js:97:27:97:27 | [SimpleParameter] x | semmle.label | 0 | | file://:0:0:0:0 | (Parameters) | arrays.js:97:27:97:27 | [SimpleParameter] x | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | arrays.js:116:36:116:39 | [SimpleParameter] item | semmle.label | 0 | +| file://:0:0:0:0 | (Parameters) | arrays.js:116:36:116:39 | [SimpleParameter] item | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | arrays.js:122:32:122:35 | [SimpleParameter] item | semmle.label | 0 | +| file://:0:0:0:0 | (Parameters) | arrays.js:122:32:122:35 | [SimpleParameter] item | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | arrays.js:128:41:128:44 | [SimpleParameter] item | semmle.label | 0 | +| file://:0:0:0:0 | (Parameters) | arrays.js:128:41:128:44 | [SimpleParameter] item | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | arrays.js:133:32:133:35 | [SimpleParameter] item | semmle.label | 0 | +| file://:0:0:0:0 | (Parameters) | arrays.js:133:32:133:35 | [SimpleParameter] item | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | arrays.js:139:36:139:39 | [SimpleParameter] item | semmle.label | 0 | +| file://:0:0:0:0 | (Parameters) | arrays.js:139:36:139:39 | [SimpleParameter] item | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | arrays.js:145:41:145:44 | [SimpleParameter] item | semmle.label | 0 | +| file://:0:0:0:0 | (Parameters) | arrays.js:145:41:145:44 | [SimpleParameter] item | semmle.order | 0 | graphProperties | semmle.graphKind | tree | diff --git a/javascript/ql/test/library-tests/Barriers/SimpleBarrierGuard.ql b/javascript/ql/test/library-tests/Barriers/SimpleBarrierGuard.ql index 41e5bdd73554..26727608775d 100644 --- a/javascript/ql/test/library-tests/Barriers/SimpleBarrierGuard.ql +++ b/javascript/ql/test/library-tests/Barriers/SimpleBarrierGuard.ql @@ -45,6 +45,6 @@ deprecated class LegacyConfig extends DataFlow::Configuration { } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff query predicate flow = TestFlow::flow/2; diff --git a/javascript/ql/test/library-tests/Classes/tests.ql b/javascript/ql/test/library-tests/Classes/tests.ql index 1dcab4ca1348..2fec85f768cf 100644 --- a/javascript/ql/test/library-tests/Classes/tests.ql +++ b/javascript/ql/test/library-tests/Classes/tests.ql @@ -77,7 +77,7 @@ deprecated class LegacyConfig extends DataFlow::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff query predicate dataflow = TestFlow::flow/2; diff --git a/javascript/ql/test/library-tests/FlowSummary/test.ql b/javascript/ql/test/library-tests/FlowSummary/test.ql index 346943323b18..e8ca23a423cd 100644 --- a/javascript/ql/test/library-tests/FlowSummary/test.ql +++ b/javascript/ql/test/library-tests/FlowSummary/test.ql @@ -1,6 +1,6 @@ import javascript -deprecated import testUtilities.ConsistencyChecking -import testUtilities.InlineSummaries +deprecated import utils.test.ConsistencyChecking +import utils.test.InlineSummaries DataFlow::CallNode getACall(string name) { result.getCalleeName() = name diff --git a/javascript/ql/test/library-tests/Generators/DataFlow.ql b/javascript/ql/test/library-tests/Generators/DataFlow.ql index 18545c94b7fe..f0d07506cf24 100644 --- a/javascript/ql/test/library-tests/Generators/DataFlow.ql +++ b/javascript/ql/test/library-tests/Generators/DataFlow.ql @@ -19,7 +19,7 @@ deprecated class LegacyConfig extends DataFlow::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff deprecated class Consistency extends ConsistencyConfiguration { Consistency() { this = "Consistency" } diff --git a/javascript/ql/test/library-tests/LabelledBarrierGuards/LabelledBarrierGuards.ql b/javascript/ql/test/library-tests/LabelledBarrierGuards/LabelledBarrierGuards.ql index b6dc9bb59681..fc97fb25d045 100644 --- a/javascript/ql/test/library-tests/LabelledBarrierGuards/LabelledBarrierGuards.ql +++ b/javascript/ql/test/library-tests/LabelledBarrierGuards/LabelledBarrierGuards.ql @@ -93,7 +93,7 @@ deprecated class IsSanitizedGuardLegacy extends IsSanitizedGuard, } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff from DataFlow::Node source, DataFlow::Node sink where TestFlow::flow(source, sink) diff --git a/javascript/ql/test/library-tests/Promises/flow.qll b/javascript/ql/test/library-tests/Promises/flow.qll index 6582e85474e7..e49b5092d5f3 100644 --- a/javascript/ql/test/library-tests/Promises/flow.qll +++ b/javascript/ql/test/library-tests/Promises/flow.qll @@ -1,6 +1,6 @@ import javascript private import semmle.javascript.dataflow.internal.StepSummary -deprecated import testUtilities.LegacyDataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff module ValueFlowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { diff --git a/javascript/ql/test/library-tests/Routing/test.ql b/javascript/ql/test/library-tests/Routing/test.ql index c2ccaa4f9dee..5758a550b679 100644 --- a/javascript/ql/test/library-tests/Routing/test.ql +++ b/javascript/ql/test/library-tests/Routing/test.ql @@ -33,4 +33,4 @@ deprecated class LegacyConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff diff --git a/javascript/ql/test/library-tests/Security/heuristics/HeuristicSource.ql b/javascript/ql/test/library-tests/Security/heuristics/HeuristicSource.ql index 153ee786cc16..3eb5b9f97042 100644 --- a/javascript/ql/test/library-tests/Security/heuristics/HeuristicSource.ql +++ b/javascript/ql/test/library-tests/Security/heuristics/HeuristicSource.ql @@ -26,4 +26,4 @@ deprecated class LegacyConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff diff --git a/javascript/ql/test/library-tests/TaintBarriers/tests.ql b/javascript/ql/test/library-tests/TaintBarriers/tests.ql index 7c6ad5231ac8..11f317edd0e0 100644 --- a/javascript/ql/test/library-tests/TaintBarriers/tests.ql +++ b/javascript/ql/test/library-tests/TaintBarriers/tests.ql @@ -25,4 +25,4 @@ query predicate taintedSink(DataFlow::Node source, DataFlow::Node sink) { TestFlow::flow(source, sink) } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff diff --git a/javascript/ql/test/library-tests/TaintTracking/BasicTaintTracking.expected b/javascript/ql/test/library-tests/TaintTracking/BasicTaintTracking.expected index 2ee606c2e501..d8ba7545b0d2 100644 --- a/javascript/ql/test/library-tests/TaintTracking/BasicTaintTracking.expected +++ b/javascript/ql/test/library-tests/TaintTracking/BasicTaintTracking.expected @@ -273,6 +273,10 @@ flow | static-capture-groups.js:2:17:2:24 | source() | static-capture-groups.js:27:14:27:22 | RegExp.$1 | | static-capture-groups.js:32:17:32:24 | source() | static-capture-groups.js:38:10:38:18 | RegExp.$1 | | static-capture-groups.js:42:12:42:19 | source() | static-capture-groups.js:43:14:43:22 | RegExp.$1 | +| string-immutable-operations.js:2:13:2:20 | source() | string-immutable-operations.js:3:10:3:25 | x.toWellFormed() | +| string-immutable-operations.js:2:13:2:20 | source() | string-immutable-operations.js:6:10:6:20 | wellFormedX | +| string-immutable-operations.js:2:13:2:20 | source() | string-immutable-operations.js:9:10:9:26 | concatWellFormedX | +| string-immutable-operations.js:11:10:11:17 | source() | string-immutable-operations.js:11:10:11:32 | source( ... ormed() | | string-replace.js:3:13:3:20 | source() | string-replace.js:14:10:14:13 | data | | string-replace.js:3:13:3:20 | source() | string-replace.js:18:10:18:13 | data | | string-replace.js:3:13:3:20 | source() | string-replace.js:21:6:21:41 | safe(). ... taint) | @@ -307,8 +311,19 @@ flow | tst.js:2:13:2:20 | source() | tst.js:66:10:66:16 | xSorted | | tst.js:2:13:2:20 | source() | tst.js:68:10:68:23 | x.toReversed() | | tst.js:2:13:2:20 | source() | tst.js:70:10:70:18 | xReversed | -| tst.js:2:13:2:20 | source() | tst.js:72:10:72:17 | x.with() | -| tst.js:2:13:2:20 | source() | tst.js:74:10:74:14 | xWith | +| tst.js:2:13:2:20 | source() | tst.js:72:10:72:31 | Map.gro ... z => z) | +| tst.js:2:13:2:20 | source() | tst.js:74:10:74:34 | Object. ... z => z) | +| tst.js:2:13:2:20 | source() | tst.js:78:55:78:58 | item | +| tst.js:2:13:2:20 | source() | tst.js:79:14:79:35 | grouped ... nown()) | +| tst.js:2:13:2:20 | source() | tst.js:100:10:100:17 | x.with() | +| tst.js:2:13:2:20 | source() | tst.js:102:10:102:14 | xWith | +| tst.js:75:22:75:29 | source() | tst.js:75:10:75:52 | Map.gro ... (item)) | +| tst.js:75:22:75:29 | source() | tst.js:75:47:75:50 | item | +| tst.js:82:23:82:30 | source() | tst.js:83:58:83:61 | item | +| tst.js:82:23:82:30 | source() | tst.js:84:14:84:35 | grouped ... nown()) | +| tst.js:87:22:87:29 | source() | tst.js:90:14:90:25 | taintedValue | +| tst.js:93:22:93:29 | source() | tst.js:96:14:96:25 | taintedValue | +| tst.js:93:22:93:29 | source() | tst.js:97:14:97:26 | map.get(true) | | use-use-after-implicit-read.js:7:17:7:24 | source() | use-use-after-implicit-read.js:8:10:8:17 | captured | | use-use-after-implicit-read.js:7:17:7:24 | source() | use-use-after-implicit-read.js:15:10:15:10 | x | | xml.js:5:18:5:25 | source() | xml.js:8:14:8:17 | text | diff --git a/javascript/ql/test/library-tests/TaintTracking/BasicTaintTracking.ql b/javascript/ql/test/library-tests/TaintTracking/BasicTaintTracking.ql index 5e36bb137d33..e34c21407d7f 100644 --- a/javascript/ql/test/library-tests/TaintTracking/BasicTaintTracking.ql +++ b/javascript/ql/test/library-tests/TaintTracking/BasicTaintTracking.ql @@ -1,6 +1,6 @@ import javascript import semmle.javascript.dataflow.InferredTypes -deprecated import testUtilities.ConsistencyChecking +deprecated import utils.test.ConsistencyChecking DataFlow::CallNode getACall(string name) { result.getCalleeName() = name @@ -39,7 +39,7 @@ deprecated class LegacyConfig extends TaintTracking::Configuration { } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff class BasicSanitizerGuard extends DataFlow::CallNode { BasicSanitizerGuard() { this = getACall("isSafe") } diff --git a/javascript/ql/test/library-tests/TaintTracking/DataFlowTracking.expected b/javascript/ql/test/library-tests/TaintTracking/DataFlowTracking.expected index 1f4f69f0274b..42595adc131b 100644 --- a/javascript/ql/test/library-tests/TaintTracking/DataFlowTracking.expected +++ b/javascript/ql/test/library-tests/TaintTracking/DataFlowTracking.expected @@ -27,6 +27,7 @@ legacyDataFlowDifference | spread.js:4:15:4:22 | source() | spread.js:24:8:24:8 | y | only flow with NEW data flow library | | tst.js:2:13:2:20 | source() | tst.js:35:14:35:16 | ary | only flow with NEW data flow library | | tst.js:2:13:2:20 | source() | tst.js:41:14:41:16 | ary | only flow with NEW data flow library | +| tst.js:82:23:82:30 | source() | tst.js:83:58:83:61 | item | only flow with NEW data flow library | | use-use-after-implicit-read.js:7:17:7:24 | source() | use-use-after-implicit-read.js:15:10:15:10 | x | only flow with NEW data flow library | flow | access-path-sanitizer.js:2:18:2:25 | source() | access-path-sanitizer.js:4:8:4:12 | obj.x | @@ -190,4 +191,8 @@ flow | tst.js:2:13:2:20 | source() | tst.js:35:14:35:16 | ary | | tst.js:2:13:2:20 | source() | tst.js:41:14:41:16 | ary | | tst.js:2:13:2:20 | source() | tst.js:54:14:54:19 | unsafe | +| tst.js:2:13:2:20 | source() | tst.js:79:14:79:35 | grouped ... nown()) | +| tst.js:82:23:82:30 | source() | tst.js:83:58:83:61 | item | +| tst.js:93:22:93:29 | source() | tst.js:96:14:96:25 | taintedValue | +| tst.js:93:22:93:29 | source() | tst.js:97:14:97:26 | map.get(true) | | use-use-after-implicit-read.js:7:17:7:24 | source() | use-use-after-implicit-read.js:15:10:15:10 | x | diff --git a/javascript/ql/test/library-tests/TaintTracking/DataFlowTracking.ql b/javascript/ql/test/library-tests/TaintTracking/DataFlowTracking.ql index b37d902b12ed..e155f93669b3 100644 --- a/javascript/ql/test/library-tests/TaintTracking/DataFlowTracking.ql +++ b/javascript/ql/test/library-tests/TaintTracking/DataFlowTracking.ql @@ -39,6 +39,6 @@ deprecated class LegacyConfig extends DataFlow::Configuration { } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff query predicate flow = TestFlow::flow/2; diff --git a/javascript/ql/test/library-tests/TaintTracking/tst.js b/javascript/ql/test/library-tests/TaintTracking/tst.js index a2965d36fa92..7b8e1c8b4bc3 100644 --- a/javascript/ql/test/library-tests/TaintTracking/tst.js +++ b/javascript/ql/test/library-tests/TaintTracking/tst.js @@ -76,12 +76,12 @@ function test() { { const grouped = Map.groupBy(x, (item) => sink(item)); // NOT OK - sink(grouped); // NOT OK + sink(grouped.get(unknown())); // NOT OK } { const list = [source()]; const grouped = Map.groupBy(list, (item) => sink(item)); // NOT OK - sink(grouped); // NOT OK + sink(grouped.get(unknown())); // NOT OK } { const data = source(); diff --git a/javascript/ql/test/library-tests/TaintedUrlSuffix/test.expected b/javascript/ql/test/library-tests/TaintedUrlSuffix/test.expected index 8ec8033d086e..e69de29bb2d1 100644 --- a/javascript/ql/test/library-tests/TaintedUrlSuffix/test.expected +++ b/javascript/ql/test/library-tests/TaintedUrlSuffix/test.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/javascript/ql/test/library-tests/TaintedUrlSuffix/test.ql b/javascript/ql/test/library-tests/TaintedUrlSuffix/test.ql index 3c247a4e12c2..6d3dc86505cb 100644 --- a/javascript/ql/test/library-tests/TaintedUrlSuffix/test.ql +++ b/javascript/ql/test/library-tests/TaintedUrlSuffix/test.ql @@ -1,5 +1,5 @@ import javascript -import testUtilities.InlineExpectationsTest +import utils.test.InlineExpectationsTest import semmle.javascript.security.TaintedUrlSuffix module TestConfig implements DataFlow::StateConfigSig { diff --git a/javascript/ql/test/library-tests/TripleDot/test.ql b/javascript/ql/test/library-tests/TripleDot/test.ql index 222c24dbbea5..5d9dff622872 100644 --- a/javascript/ql/test/library-tests/TripleDot/test.ql +++ b/javascript/ql/test/library-tests/TripleDot/test.ql @@ -1,3 +1,3 @@ import javascript -import testUtilities.InlineFlowTest +import utils.test.InlineFlowTest import DefaultFlowTest diff --git a/javascript/ql/test/library-tests/TypeScript/ImportEquals/tests.ql b/javascript/ql/test/library-tests/TypeScript/ImportEquals/tests.ql index a7c1c072690d..839ba2c560bf 100644 --- a/javascript/ql/test/library-tests/TypeScript/ImportEquals/tests.ql +++ b/javascript/ql/test/library-tests/TypeScript/ImportEquals/tests.ql @@ -60,4 +60,4 @@ deprecated class LegacyConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff diff --git a/javascript/ql/test/library-tests/TypeTracking2/test.expected b/javascript/ql/test/library-tests/TypeTracking2/test.expected index 8ec8033d086e..e69de29bb2d1 100644 --- a/javascript/ql/test/library-tests/TypeTracking2/test.expected +++ b/javascript/ql/test/library-tests/TypeTracking2/test.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/javascript/ql/test/library-tests/TypeTracking2/test.ql b/javascript/ql/test/library-tests/TypeTracking2/test.ql index dcc3ff1b57b8..5f79d18a0e4c 100644 --- a/javascript/ql/test/library-tests/TypeTracking2/test.ql +++ b/javascript/ql/test/library-tests/TypeTracking2/test.ql @@ -1,6 +1,6 @@ import javascript -import testUtilities.InlineSummaries -import testUtilities.InlineExpectationsTest +import utils.test.InlineSummaries +import utils.test.InlineExpectationsTest private DataFlow::SourceNode typeTrack(DataFlow::TypeTracker t, string name) { t.start() and diff --git a/javascript/ql/test/library-tests/frameworks/Angular2/test.ql b/javascript/ql/test/library-tests/frameworks/Angular2/test.ql index ec9dc3d46bab..140ae675a777 100644 --- a/javascript/ql/test/library-tests/frameworks/Angular2/test.ql +++ b/javascript/ql/test/library-tests/frameworks/Angular2/test.ql @@ -41,4 +41,4 @@ deprecated class LegacyConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff diff --git a/javascript/ql/test/library-tests/frameworks/AsyncPackage/AsyncTaintTracking.ql b/javascript/ql/test/library-tests/frameworks/AsyncPackage/AsyncTaintTracking.ql index b444b7cbff73..d744d55d28ab 100644 --- a/javascript/ql/test/library-tests/frameworks/AsyncPackage/AsyncTaintTracking.ql +++ b/javascript/ql/test/library-tests/frameworks/AsyncPackage/AsyncTaintTracking.ql @@ -18,7 +18,7 @@ deprecated class LegacyConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff from DataFlow::Node src, DataFlow::Node sink where TestFlow::flow(src, sink) diff --git a/javascript/ql/test/library-tests/frameworks/Collections/test.ql b/javascript/ql/test/library-tests/frameworks/Collections/test.ql index a4bdd7dcfbc4..0b12b72cf119 100644 --- a/javascript/ql/test/library-tests/frameworks/Collections/test.ql +++ b/javascript/ql/test/library-tests/frameworks/Collections/test.ql @@ -22,7 +22,7 @@ deprecated class LegacyConfig extends DataFlow::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff DataFlow::SourceNode trackSource(DataFlow::TypeTracker t, DataFlow::SourceNode start) { t.start() and diff --git a/javascript/ql/test/library-tests/frameworks/ComposedFunctions/compose.ql b/javascript/ql/test/library-tests/frameworks/ComposedFunctions/compose.ql index 5e56ebd399eb..ba69ac34ce5f 100644 --- a/javascript/ql/test/library-tests/frameworks/ComposedFunctions/compose.ql +++ b/javascript/ql/test/library-tests/frameworks/ComposedFunctions/compose.ql @@ -23,7 +23,7 @@ deprecated class LegacyConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff from DataFlow::Node source, DataFlow::Node sink where TestFlow::flow(source, sink) diff --git a/javascript/ql/test/library-tests/frameworks/Immutable/tests.ql b/javascript/ql/test/library-tests/frameworks/Immutable/tests.ql index 0fdfb05b2063..8018bf39e029 100644 --- a/javascript/ql/test/library-tests/frameworks/Immutable/tests.ql +++ b/javascript/ql/test/library-tests/frameworks/Immutable/tests.ql @@ -23,4 +23,4 @@ deprecated class LegacyConfig extends DataFlow::Configuration { query predicate dataFlow = TestFlow::flow/2; -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff diff --git a/javascript/ql/test/library-tests/frameworks/Next/tests.ql b/javascript/ql/test/library-tests/frameworks/Next/tests.ql index c8229ee9103e..2b18cd1722aa 100644 --- a/javascript/ql/test/library-tests/frameworks/Next/tests.ql +++ b/javascript/ql/test/library-tests/frameworks/Next/tests.ql @@ -22,6 +22,6 @@ deprecated class LegacyConfig extends DataFlow::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff query predicate dataFlow = TestFlow::flow/2; diff --git a/javascript/ql/test/library-tests/frameworks/PropertyProjection/PropertyInjectionTaint.ql b/javascript/ql/test/library-tests/frameworks/PropertyProjection/PropertyInjectionTaint.ql index 5e56ebd399eb..ba69ac34ce5f 100644 --- a/javascript/ql/test/library-tests/frameworks/PropertyProjection/PropertyInjectionTaint.ql +++ b/javascript/ql/test/library-tests/frameworks/PropertyProjection/PropertyInjectionTaint.ql @@ -23,7 +23,7 @@ deprecated class LegacyConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff from DataFlow::Node source, DataFlow::Node sink where TestFlow::flow(source, sink) diff --git a/javascript/ql/test/library-tests/frameworks/Redux/test.ql b/javascript/ql/test/library-tests/frameworks/Redux/test.ql index 6ca6332ef696..71608c915afa 100644 --- a/javascript/ql/test/library-tests/frameworks/Redux/test.ql +++ b/javascript/ql/test/library-tests/frameworks/Redux/test.ql @@ -62,7 +62,7 @@ deprecated class LegacyConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff query predicate taintFlow(DataFlow::Node source, DataFlow::Node sink) { TestFlow::flow(source, sink) diff --git a/javascript/ql/test/library-tests/frameworks/Templating/XssDiff.ql b/javascript/ql/test/library-tests/frameworks/Templating/XssDiff.ql index 81ccaeea4750..66f34f2e4226 100644 --- a/javascript/ql/test/library-tests/frameworks/Templating/XssDiff.ql +++ b/javascript/ql/test/library-tests/frameworks/Templating/XssDiff.ql @@ -1,6 +1,6 @@ import javascript import semmle.javascript.security.dataflow.DomBasedXssQuery -deprecated import testUtilities.LegacyDataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff deprecated query predicate legacyDataFlowDifference = DataFlowDiff::legacyDataFlowDifference/3; diff --git a/javascript/ql/test/library-tests/frameworks/Vuex/test.ql b/javascript/ql/test/library-tests/frameworks/Vuex/test.ql index 5ff1c17c9db2..a508004caa8d 100644 --- a/javascript/ql/test/library-tests/frameworks/Vuex/test.ql +++ b/javascript/ql/test/library-tests/frameworks/Vuex/test.ql @@ -25,4 +25,4 @@ deprecated class LegacyConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff diff --git a/javascript/ql/test/library-tests/frameworks/data/test.ql b/javascript/ql/test/library-tests/frameworks/data/test.ql index 85aebf7099df..6a1d571351b4 100644 --- a/javascript/ql/test/library-tests/frameworks/data/test.ql +++ b/javascript/ql/test/library-tests/frameworks/data/test.ql @@ -41,7 +41,7 @@ deprecated class LegacyConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { TestConfig::isSink(sink) } } -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff query predicate taintFlow(DataFlow::Node source, DataFlow::Node sink) { TestFlow::flow(source, sink) diff --git a/javascript/ql/test/library-tests/threat-models/sources/TestSources.expected b/javascript/ql/test/library-tests/threat-models/sources/TestSources.expected index 0df66c661133..f907a831d3e3 100644 --- a/javascript/ql/test/library-tests/threat-models/sources/TestSources.expected +++ b/javascript/ql/test/library-tests/threat-models/sources/TestSources.expected @@ -1,3 +1,2 @@ legacyDataFlowDifference testFailures -failures diff --git a/javascript/ql/test/library-tests/threat-models/sources/TestSources.ql b/javascript/ql/test/library-tests/threat-models/sources/TestSources.ql index afcd7295947e..06c53aded631 100644 --- a/javascript/ql/test/library-tests/threat-models/sources/TestSources.ql +++ b/javascript/ql/test/library-tests/threat-models/sources/TestSources.ql @@ -44,4 +44,4 @@ private module InlineTestSources implements TestSig { } import MakeTest -deprecated import testUtilities.LegacyDataFlowDiff::DataFlowDiff +deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff diff --git a/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected b/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected index 7aa4dfd0bca7..c1985970e3b0 100644 --- a/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected +++ b/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected @@ -134,6 +134,22 @@ nodes | TaintedPath.js:196:31:196:34 | path | semmle.label | path | | TaintedPath.js:197:45:197:48 | path | semmle.label | path | | TaintedPath.js:198:35:198:38 | path | semmle.label | path | +| TaintedPath.js:202:7:202:48 | path | semmle.label | path | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | semmle.label | url.par ... , true) | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | semmle.label | url.par ... ).query | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | semmle.label | url.par ... ry.path | +| TaintedPath.js:202:24:202:30 | req.url | semmle.label | req.url | +| TaintedPath.js:206:29:206:32 | path | semmle.label | path | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | semmle.label | path.re ... '), '') | +| TaintedPath.js:211:7:211:48 | path | semmle.label | path | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | semmle.label | url.par ... , true) | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | semmle.label | url.par ... ).query | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | semmle.label | url.par ... ry.path | +| TaintedPath.js:211:24:211:30 | req.url | semmle.label | req.url | +| TaintedPath.js:213:29:213:32 | path | semmle.label | path | +| TaintedPath.js:213:29:213:68 | path.re ... '), '') | semmle.label | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | semmle.label | path | +| TaintedPath.js:216:31:216:69 | path.re ... '), '') | semmle.label | path.re ... '), '') | | examples/TaintedPath.js:8:7:8:52 | filePath | semmle.label | filePath | | examples/TaintedPath.js:8:18:8:41 | url.par ... , true) | semmle.label | url.par ... , true) | | examples/TaintedPath.js:8:18:8:47 | url.par ... ).query | semmle.label | url.par ... ).query | @@ -614,6 +630,20 @@ edges | TaintedPath.js:195:14:195:43 | url.par ... ).query | TaintedPath.js:195:14:195:48 | url.par ... ry.path | provenance | Config | | TaintedPath.js:195:14:195:48 | url.par ... ry.path | TaintedPath.js:195:7:195:48 | path | provenance | | | TaintedPath.js:195:24:195:30 | req.url | TaintedPath.js:195:14:195:37 | url.par ... , true) | provenance | Config | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | provenance | | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | provenance | Config | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | provenance | Config | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | provenance | | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | provenance | Config | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | provenance | Config | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:213:29:213:32 | path | provenance | | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:216:31:216:34 | path | provenance | | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | provenance | Config | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | provenance | Config | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | provenance | | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | provenance | Config | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | provenance | Config | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | provenance | Config | | examples/TaintedPath.js:8:7:8:52 | filePath | examples/TaintedPath.js:11:36:11:43 | filePath | provenance | | | examples/TaintedPath.js:8:18:8:41 | url.par ... , true) | examples/TaintedPath.js:8:18:8:47 | url.par ... ).query | provenance | Config | | examples/TaintedPath.js:8:18:8:47 | url.par ... ).query | examples/TaintedPath.js:8:18:8:52 | url.par ... ry.path | provenance | Config | @@ -965,6 +995,9 @@ subpaths | TaintedPath.js:196:31:196:34 | path | TaintedPath.js:195:24:195:30 | req.url | TaintedPath.js:196:31:196:34 | path | This path depends on a $@. | TaintedPath.js:195:24:195:30 | req.url | user-provided value | | TaintedPath.js:197:45:197:48 | path | TaintedPath.js:195:24:195:30 | req.url | TaintedPath.js:197:45:197:48 | path | This path depends on a $@. | TaintedPath.js:195:24:195:30 | req.url | user-provided value | | TaintedPath.js:198:35:198:38 | path | TaintedPath.js:195:24:195:30 | req.url | TaintedPath.js:198:35:198:38 | path | This path depends on a $@. | TaintedPath.js:195:24:195:30 | req.url | user-provided value | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:206:29:206:85 | path.re ... '), '') | This path depends on a $@. | TaintedPath.js:202:24:202:30 | req.url | user-provided value | +| TaintedPath.js:213:29:213:68 | path.re ... '), '') | TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:213:29:213:68 | path.re ... '), '') | This path depends on a $@. | TaintedPath.js:211:24:211:30 | req.url | user-provided value | +| TaintedPath.js:216:31:216:69 | path.re ... '), '') | TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:216:31:216:69 | path.re ... '), '') | This path depends on a $@. | TaintedPath.js:211:24:211:30 | req.url | user-provided value | | examples/TaintedPath.js:11:29:11:43 | ROOT + filePath | examples/TaintedPath.js:8:28:8:34 | req.url | examples/TaintedPath.js:11:29:11:43 | ROOT + filePath | This path depends on a $@. | examples/TaintedPath.js:8:28:8:34 | req.url | user-provided value | | express.js:8:20:8:32 | req.query.bar | express.js:8:20:8:32 | req.query.bar | express.js:8:20:8:32 | req.query.bar | This path depends on a $@. | express.js:8:20:8:32 | req.query.bar | user-provided value | | handlebars.js:11:32:11:39 | filePath | handlebars.js:29:46:29:60 | req.params.path | handlebars.js:11:32:11:39 | filePath | This path depends on a $@. | handlebars.js:29:46:29:60 | req.params.path | user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected b/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected index 9585663d11a9..0e0cf297fa29 100644 --- a/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected +++ b/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected @@ -131,6 +131,11 @@ edges | lib/lib.js:608:42:608:45 | name | lib/lib.js:609:22:609:25 | name | provenance | | | lib/lib.js:608:42:608:45 | name | lib/lib.js:626:29:626:32 | name | provenance | | | lib/lib.js:608:42:608:45 | name | lib/lib.js:629:25:629:28 | name | provenance | | +| lib/lib.js:632:38:632:41 | name | lib/lib.js:633:24:633:27 | name | provenance | | +| lib/lib.js:633:6:633:68 | sanitized | lib/lib.js:634:22:634:30 | sanitized | provenance | | +| lib/lib.js:633:24:633:27 | name | lib/lib.js:633:24:633:62 | name.re ... '\\\\''") | provenance | | +| lib/lib.js:633:24:633:27 | name | lib/lib.js:633:24:633:62 | name.re ... '\\\\''") | provenance | | +| lib/lib.js:633:24:633:62 | name.re ... '\\\\''") | lib/lib.js:633:6:633:68 | sanitized | provenance | | | lib/subLib2/compiled-file.ts:3:26:3:29 | name | lib/subLib2/compiled-file.ts:4:25:4:28 | name | provenance | | | lib/subLib2/special-file.js:3:28:3:31 | name | lib/subLib2/special-file.js:4:22:4:25 | name | provenance | | | lib/subLib3/my-file.ts:3:28:3:31 | name | lib/subLib3/my-file.ts:4:22:4:25 | name | provenance | | @@ -322,6 +327,12 @@ nodes | lib/lib.js:609:22:609:25 | name | semmle.label | name | | lib/lib.js:626:29:626:32 | name | semmle.label | name | | lib/lib.js:629:25:629:28 | name | semmle.label | name | +| lib/lib.js:632:38:632:41 | name | semmle.label | name | +| lib/lib.js:633:6:633:68 | sanitized | semmle.label | sanitized | +| lib/lib.js:633:24:633:27 | name | semmle.label | name | +| lib/lib.js:633:24:633:62 | name.re ... '\\\\''") | semmle.label | name.re ... '\\\\''") | +| lib/lib.js:633:24:633:62 | name.re ... '\\\\''") | semmle.label | name.re ... '\\\\''") | +| lib/lib.js:634:22:634:30 | sanitized | semmle.label | sanitized | | lib/subLib2/compiled-file.ts:3:26:3:29 | name | semmle.label | name | | lib/subLib2/compiled-file.ts:4:25:4:28 | name | semmle.label | name | | lib/subLib2/special-file.js:3:28:3:31 | name | semmle.label | name | @@ -442,6 +453,8 @@ subpaths | lib/lib.js:609:10:609:25 | "rm -rf " + name | lib/lib.js:608:42:608:45 | name | lib/lib.js:609:22:609:25 | name | This string concatenation which depends on $@ is later used in a $@. | lib/lib.js:608:42:608:45 | name | library input | lib/lib.js:609:2:609:26 | cp.exec ... + name) | shell command | | lib/lib.js:626:17:626:32 | "rm -rf " + name | lib/lib.js:608:42:608:45 | name | lib/lib.js:626:29:626:32 | name | This string concatenation which depends on $@ is later used in a $@. | lib/lib.js:608:42:608:45 | name | library input | lib/lib.js:626:9:626:33 | cp.exec ... + name) | shell command | | lib/lib.js:629:13:629:28 | "rm -rf " + name | lib/lib.js:608:42:608:45 | name | lib/lib.js:629:25:629:28 | name | This string concatenation which depends on $@ is later used in a $@. | lib/lib.js:608:42:608:45 | name | library input | lib/lib.js:629:5:629:29 | cp.exec ... + name) | shell command | +| lib/lib.js:633:18:633:68 | "'" + n ... ) + "'" | lib/lib.js:632:38:632:41 | name | lib/lib.js:633:24:633:62 | name.re ... '\\\\''") | This string concatenation which depends on $@ is later used in a $@. | lib/lib.js:632:38:632:41 | name | library input | lib/lib.js:634:2:634:31 | cp.exec ... itized) | shell command | +| lib/lib.js:634:10:634:30 | "rm -rf ... nitized | lib/lib.js:632:38:632:41 | name | lib/lib.js:634:22:634:30 | sanitized | This string concatenation which depends on $@ is later used in a $@. | lib/lib.js:632:38:632:41 | name | library input | lib/lib.js:634:2:634:31 | cp.exec ... itized) | shell command | | lib/subLib2/compiled-file.ts:4:13:4:28 | "rm -rf " + name | lib/subLib2/compiled-file.ts:3:26:3:29 | name | lib/subLib2/compiled-file.ts:4:25:4:28 | name | This string concatenation which depends on $@ is later used in a $@. | lib/subLib2/compiled-file.ts:3:26:3:29 | name | library input | lib/subLib2/compiled-file.ts:4:5:4:29 | cp.exec ... + name) | shell command | | lib/subLib2/special-file.js:4:10:4:25 | "rm -rf " + name | lib/subLib2/special-file.js:3:28:3:31 | name | lib/subLib2/special-file.js:4:22:4:25 | name | This string concatenation which depends on $@ is later used in a $@. | lib/subLib2/special-file.js:3:28:3:31 | name | library input | lib/subLib2/special-file.js:4:2:4:26 | cp.exec ... + name) | shell command | | lib/subLib3/my-file.ts:4:10:4:25 | "rm -rf " + name | lib/subLib3/my-file.ts:3:28:3:31 | name | lib/subLib3/my-file.ts:4:22:4:25 | name | This string concatenation which depends on $@ is later used in a $@. | lib/subLib3/my-file.ts:3:28:3:31 | name | library input | lib/subLib3/my-file.ts:4:2:4:26 | cp.exec ... + name) | shell command | diff --git a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected index 868e9c0eeddc..c8f12b176f86 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected +++ b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected @@ -365,6 +365,7 @@ nodes | tst.js:8:18:8:126 | "" | semmle.label | "" | | tst.js:8:37:8:58 | documen ... on.href | semmle.label | documen ... on.href | | tst.js:8:37:8:114 | documen ... t=")+8) | semmle.label | documen ... t=")+8) | +| tst.js:8:37:8:114 | documen ... t=")+8) | semmle.label | documen ... t=")+8) | | tst.js:12:5:12:42 | '
' | semmle.label | '
' | | tst.js:12:28:12:33 | target | semmle.label | target | | tst.js:17:7:17:56 | params | semmle.label | params | @@ -390,19 +391,24 @@ nodes | tst.js:40:16:40:44 | baz(doc ... search) | semmle.label | baz(doc ... search) | | tst.js:40:20:40:43 | documen ... .search | semmle.label | documen ... .search | | tst.js:42:15:42:15 | s | semmle.label | s | +| tst.js:42:15:42:15 | s | semmle.label | s | | tst.js:43:10:43:31 | "
" ...
" | semmle.label | "
" ...
" | | tst.js:43:20:43:20 | s | semmle.label | s | +| tst.js:43:20:43:20 | s | semmle.label | s | | tst.js:46:16:46:45 | wrap(do ... search) | semmle.label | wrap(do ... search) | | tst.js:46:21:46:44 | documen ... .search | semmle.label | documen ... .search | | tst.js:48:15:48:15 | s | semmle.label | s | | tst.js:50:12:50:12 | s | semmle.label | s | | tst.js:50:12:50:22 | s.substr(1) | semmle.label | s.substr(1) | +| tst.js:50:12:50:22 | s.substr(1) | semmle.label | s.substr(1) | +| tst.js:50:12:50:22 | s.substr(1) | semmle.label | s.substr(1) | | tst.js:54:16:54:45 | chop(do ... search) | semmle.label | chop(do ... search) | | tst.js:54:21:54:44 | documen ... .search | semmle.label | documen ... .search | | tst.js:56:16:56:45 | chop(do ... search) | semmle.label | chop(do ... search) | | tst.js:56:21:56:44 | documen ... .search | semmle.label | documen ... .search | | tst.js:58:16:58:32 | wrap(chop(bar())) | semmle.label | wrap(chop(bar())) | | tst.js:58:21:58:31 | chop(bar()) | semmle.label | chop(bar()) | +| tst.js:58:21:58:31 | chop(bar()) | semmle.label | chop(bar()) | | tst.js:58:26:58:30 | bar() | semmle.label | bar() | | tst.js:60:34:60:34 | s | semmle.label | s | | tst.js:62:18:62:18 | s | semmle.label | s | @@ -570,6 +576,10 @@ nodes | tst.js:494:18:494:40 | locatio ... bstr(1) | semmle.label | locatio ... bstr(1) | | tst.js:501:33:501:63 | decodeU ... n.hash) | semmle.label | decodeU ... n.hash) | | tst.js:501:43:501:62 | window.location.hash | semmle.label | window.location.hash | +| tst.js:508:7:508:39 | target | semmle.label | target | +| tst.js:508:16:508:39 | documen ... .search | semmle.label | documen ... .search | +| tst.js:509:18:509:23 | target | semmle.label | target | +| tst.js:509:18:509:54 | target. ... "), '') | semmle.label | target. ... "), '') | | typeahead.js:20:13:20:45 | target | semmle.label | target | | typeahead.js:20:22:20:45 | documen ... .search | semmle.label | documen ... .search | | typeahead.js:21:12:21:17 | target | semmle.label | target | @@ -915,6 +925,7 @@ edges | tst.js:8:37:8:58 | documen ... on.href | tst.js:8:37:8:114 | documen ... t=")+8) | provenance | | | tst.js:8:37:8:58 | documen ... on.href | tst.js:8:37:8:114 | documen ... t=")+8) | provenance | Config | | tst.js:8:37:8:114 | documen ... t=")+8) | tst.js:8:18:8:126 | "" | provenance | | +| tst.js:8:37:8:114 | documen ... t=")+8) | tst.js:8:18:8:126 | "" | provenance | | | tst.js:8:37:8:114 | documen ... t=")+8) | tst.js:8:18:8:126 | "" | provenance | Config | | tst.js:12:28:12:33 | target | tst.js:12:5:12:42 | '
' | provenance | Config | | tst.js:17:7:17:56 | params | tst.js:18:18:18:23 | params | provenance | | @@ -937,6 +948,8 @@ edges | tst.js:40:20:40:43 | documen ... .search | tst.js:36:14:36:14 | x | provenance | | | tst.js:40:20:40:43 | documen ... .search | tst.js:40:16:40:44 | baz(doc ... search) | provenance | | | tst.js:42:15:42:15 | s | tst.js:43:20:43:20 | s | provenance | | +| tst.js:42:15:42:15 | s | tst.js:43:20:43:20 | s | provenance | | +| tst.js:43:20:43:20 | s | tst.js:43:10:43:31 | "
" ...
" | provenance | | | tst.js:43:20:43:20 | s | tst.js:43:10:43:31 | "
" ...
" | provenance | | | tst.js:43:20:43:20 | s | tst.js:43:10:43:31 | "
" ...
" | provenance | Config | | tst.js:46:21:46:44 | documen ... .search | tst.js:42:15:42:15 | s | provenance | | @@ -945,6 +958,7 @@ edges | tst.js:48:15:48:15 | s | tst.js:50:12:50:12 | s | provenance | | | tst.js:50:12:50:12 | s | tst.js:50:12:50:22 | s.substr(1) | provenance | | | tst.js:50:12:50:12 | s | tst.js:50:12:50:22 | s.substr(1) | provenance | Config | +| tst.js:50:12:50:12 | s | tst.js:50:12:50:22 | s.substr(1) | provenance | Config | | tst.js:54:21:54:44 | documen ... .search | tst.js:48:15:48:15 | s | provenance | | | tst.js:54:21:54:44 | documen ... .search | tst.js:54:16:54:45 | chop(do ... search) | provenance | | | tst.js:54:21:54:44 | documen ... .search | tst.js:54:16:54:45 | chop(do ... search) | provenance | Config | @@ -952,6 +966,8 @@ edges | tst.js:56:21:56:44 | documen ... .search | tst.js:56:16:56:45 | chop(do ... search) | provenance | | | tst.js:56:21:56:44 | documen ... .search | tst.js:56:16:56:45 | chop(do ... search) | provenance | Config | | tst.js:58:21:58:31 | chop(bar()) | tst.js:42:15:42:15 | s | provenance | | +| tst.js:58:21:58:31 | chop(bar()) | tst.js:42:15:42:15 | s | provenance | | +| tst.js:58:21:58:31 | chop(bar()) | tst.js:58:16:58:32 | wrap(chop(bar())) | provenance | | | tst.js:58:21:58:31 | chop(bar()) | tst.js:58:16:58:32 | wrap(chop(bar())) | provenance | | | tst.js:58:21:58:31 | chop(bar()) | tst.js:58:16:58:32 | wrap(chop(bar())) | provenance | Config | | tst.js:58:26:58:30 | bar() | tst.js:48:15:48:15 | s | provenance | | @@ -1090,6 +1106,9 @@ edges | tst.js:491:23:491:35 | location.hash | tst.js:491:23:491:45 | locatio ... bstr(1) | provenance | Config | | tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | provenance | Config | | tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | provenance | | +| tst.js:508:7:508:39 | target | tst.js:509:18:509:23 | target | provenance | | +| tst.js:508:16:508:39 | documen ... .search | tst.js:508:7:508:39 | target | provenance | | +| tst.js:509:18:509:23 | target | tst.js:509:18:509:54 | target. ... "), '') | provenance | | | typeahead.js:20:13:20:45 | target | typeahead.js:21:12:21:17 | target | provenance | | | typeahead.js:20:22:20:45 | documen ... .search | typeahead.js:20:13:20:45 | target | provenance | | | typeahead.js:21:12:21:17 | target | typeahead.js:24:30:24:32 | val | provenance | | @@ -1146,8 +1165,14 @@ subpaths | tst.js:40:20:40:43 | documen ... .search | tst.js:36:14:36:14 | x | tst.js:37:10:37:10 | x | tst.js:40:16:40:44 | baz(doc ... search) | | tst.js:46:21:46:44 | documen ... .search | tst.js:42:15:42:15 | s | tst.js:43:10:43:31 | "
" ...
" | tst.js:46:16:46:45 | wrap(do ... search) | | tst.js:54:21:54:44 | documen ... .search | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:54:16:54:45 | chop(do ... search) | +| tst.js:54:21:54:44 | documen ... .search | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:54:16:54:45 | chop(do ... search) | +| tst.js:54:21:54:44 | documen ... .search | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:54:16:54:45 | chop(do ... search) | +| tst.js:56:21:56:44 | documen ... .search | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:56:16:56:45 | chop(do ... search) | +| tst.js:56:21:56:44 | documen ... .search | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:56:16:56:45 | chop(do ... search) | | tst.js:56:21:56:44 | documen ... .search | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:56:16:56:45 | chop(do ... search) | | tst.js:58:21:58:31 | chop(bar()) | tst.js:42:15:42:15 | s | tst.js:43:10:43:31 | "
" ...
" | tst.js:58:16:58:32 | wrap(chop(bar())) | +| tst.js:58:21:58:31 | chop(bar()) | tst.js:42:15:42:15 | s | tst.js:43:10:43:31 | "
" ...
" | tst.js:58:16:58:32 | wrap(chop(bar())) | +| tst.js:58:26:58:30 | bar() | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:58:21:58:31 | chop(bar()) | | tst.js:58:26:58:30 | bar() | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:58:21:58:31 | chop(bar()) | | various-concat-obfuscations.js:20:17:20:46 | documen ... h.attrs | various-concat-obfuscations.js:14:24:14:28 | attrs | various-concat-obfuscations.js:15:10:15:83 | '
' | various-concat-obfuscations.js:20:4:20:47 | indirec ... .attrs) | | various-concat-obfuscations.js:21:17:21:46 | documen ... h.attrs | various-concat-obfuscations.js:17:24:17:28 | attrs | various-concat-obfuscations.js:18:10:18:105 | '
') | various-concat-obfuscations.js:21:4:21:47 | indirec ... .attrs) | @@ -1375,6 +1400,7 @@ subpaths | tst.js:491:23:491:45 | locatio ... bstr(1) | tst.js:491:23:491:35 | location.hash | tst.js:491:23:491:45 | locatio ... bstr(1) | Cross-site scripting vulnerability due to $@. | tst.js:491:23:491:35 | location.hash | user-provided value | | tst.js:494:18:494:40 | locatio ... bstr(1) | tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | Cross-site scripting vulnerability due to $@. | tst.js:494:18:494:30 | location.hash | user-provided value | | tst.js:501:33:501:63 | decodeU ... n.hash) | tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | Cross-site scripting vulnerability due to $@. | tst.js:501:43:501:62 | window.location.hash | user-provided value | +| tst.js:509:18:509:54 | target. ... "), '') | tst.js:508:16:508:39 | documen ... .search | tst.js:509:18:509:54 | target. ... "), '') | Cross-site scripting vulnerability due to $@. | tst.js:508:16:508:39 | documen ... .search | user-provided value | | typeahead.js:25:18:25:20 | val | typeahead.js:20:22:20:45 | documen ... .search | typeahead.js:25:18:25:20 | val | Cross-site scripting vulnerability due to $@. | typeahead.js:20:22:20:45 | documen ... .search | user-provided value | | various-concat-obfuscations.js:4:4:4:31 | "
" ...
" | various-concat-obfuscations.js:2:16:2:39 | documen ... .search | various-concat-obfuscations.js:4:4:4:31 | "
" ...
" | Cross-site scripting vulnerability due to $@. | various-concat-obfuscations.js:2:16:2:39 | documen ... .search | user-provided value | | various-concat-obfuscations.js:5:4:5:26 | `
$ ...
` | various-concat-obfuscations.js:2:16:2:39 | documen ... .search | various-concat-obfuscations.js:5:4:5:26 | `
$ ...
` | Cross-site scripting vulnerability due to $@. | various-concat-obfuscations.js:2:16:2:39 | documen ... .search | user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected index cef53b2b3f5f..ce6a053abc57 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected +++ b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected @@ -370,6 +370,7 @@ nodes | tst.js:8:18:8:126 | "" | semmle.label | "" | | tst.js:8:37:8:58 | documen ... on.href | semmle.label | documen ... on.href | | tst.js:8:37:8:114 | documen ... t=")+8) | semmle.label | documen ... t=")+8) | +| tst.js:8:37:8:114 | documen ... t=")+8) | semmle.label | documen ... t=")+8) | | tst.js:12:5:12:42 | '
' | semmle.label | '
' | | tst.js:12:28:12:33 | target | semmle.label | target | | tst.js:17:7:17:56 | params | semmle.label | params | @@ -395,19 +396,24 @@ nodes | tst.js:40:16:40:44 | baz(doc ... search) | semmle.label | baz(doc ... search) | | tst.js:40:20:40:43 | documen ... .search | semmle.label | documen ... .search | | tst.js:42:15:42:15 | s | semmle.label | s | +| tst.js:42:15:42:15 | s | semmle.label | s | | tst.js:43:10:43:31 | "
" ...
" | semmle.label | "
" ...
" | | tst.js:43:20:43:20 | s | semmle.label | s | +| tst.js:43:20:43:20 | s | semmle.label | s | | tst.js:46:16:46:45 | wrap(do ... search) | semmle.label | wrap(do ... search) | | tst.js:46:21:46:44 | documen ... .search | semmle.label | documen ... .search | | tst.js:48:15:48:15 | s | semmle.label | s | | tst.js:50:12:50:12 | s | semmle.label | s | | tst.js:50:12:50:22 | s.substr(1) | semmle.label | s.substr(1) | +| tst.js:50:12:50:22 | s.substr(1) | semmle.label | s.substr(1) | +| tst.js:50:12:50:22 | s.substr(1) | semmle.label | s.substr(1) | | tst.js:54:16:54:45 | chop(do ... search) | semmle.label | chop(do ... search) | | tst.js:54:21:54:44 | documen ... .search | semmle.label | documen ... .search | | tst.js:56:16:56:45 | chop(do ... search) | semmle.label | chop(do ... search) | | tst.js:56:21:56:44 | documen ... .search | semmle.label | documen ... .search | | tst.js:58:16:58:32 | wrap(chop(bar())) | semmle.label | wrap(chop(bar())) | | tst.js:58:21:58:31 | chop(bar()) | semmle.label | chop(bar()) | +| tst.js:58:21:58:31 | chop(bar()) | semmle.label | chop(bar()) | | tst.js:58:26:58:30 | bar() | semmle.label | bar() | | tst.js:60:34:60:34 | s | semmle.label | s | | tst.js:62:18:62:18 | s | semmle.label | s | @@ -575,6 +581,10 @@ nodes | tst.js:494:18:494:40 | locatio ... bstr(1) | semmle.label | locatio ... bstr(1) | | tst.js:501:33:501:63 | decodeU ... n.hash) | semmle.label | decodeU ... n.hash) | | tst.js:501:43:501:62 | window.location.hash | semmle.label | window.location.hash | +| tst.js:508:7:508:39 | target | semmle.label | target | +| tst.js:508:16:508:39 | documen ... .search | semmle.label | documen ... .search | +| tst.js:509:18:509:23 | target | semmle.label | target | +| tst.js:509:18:509:54 | target. ... "), '') | semmle.label | target. ... "), '') | | typeahead.js:9:28:9:30 | loc | semmle.label | loc | | typeahead.js:10:16:10:18 | loc | semmle.label | loc | | typeahead.js:20:13:20:45 | target | semmle.label | target | @@ -939,6 +949,7 @@ edges | tst.js:8:37:8:58 | documen ... on.href | tst.js:8:37:8:114 | documen ... t=")+8) | provenance | | | tst.js:8:37:8:58 | documen ... on.href | tst.js:8:37:8:114 | documen ... t=")+8) | provenance | Config | | tst.js:8:37:8:114 | documen ... t=")+8) | tst.js:8:18:8:126 | "" | provenance | | +| tst.js:8:37:8:114 | documen ... t=")+8) | tst.js:8:18:8:126 | "" | provenance | | | tst.js:8:37:8:114 | documen ... t=")+8) | tst.js:8:18:8:126 | "" | provenance | Config | | tst.js:12:28:12:33 | target | tst.js:12:5:12:42 | '
' | provenance | Config | | tst.js:17:7:17:56 | params | tst.js:18:18:18:23 | params | provenance | | @@ -961,6 +972,8 @@ edges | tst.js:40:20:40:43 | documen ... .search | tst.js:36:14:36:14 | x | provenance | | | tst.js:40:20:40:43 | documen ... .search | tst.js:40:16:40:44 | baz(doc ... search) | provenance | | | tst.js:42:15:42:15 | s | tst.js:43:20:43:20 | s | provenance | | +| tst.js:42:15:42:15 | s | tst.js:43:20:43:20 | s | provenance | | +| tst.js:43:20:43:20 | s | tst.js:43:10:43:31 | "
" ...
" | provenance | | | tst.js:43:20:43:20 | s | tst.js:43:10:43:31 | "
" ...
" | provenance | | | tst.js:43:20:43:20 | s | tst.js:43:10:43:31 | "
" ...
" | provenance | Config | | tst.js:46:21:46:44 | documen ... .search | tst.js:42:15:42:15 | s | provenance | | @@ -969,6 +982,7 @@ edges | tst.js:48:15:48:15 | s | tst.js:50:12:50:12 | s | provenance | | | tst.js:50:12:50:12 | s | tst.js:50:12:50:22 | s.substr(1) | provenance | | | tst.js:50:12:50:12 | s | tst.js:50:12:50:22 | s.substr(1) | provenance | Config | +| tst.js:50:12:50:12 | s | tst.js:50:12:50:22 | s.substr(1) | provenance | Config | | tst.js:54:21:54:44 | documen ... .search | tst.js:48:15:48:15 | s | provenance | | | tst.js:54:21:54:44 | documen ... .search | tst.js:54:16:54:45 | chop(do ... search) | provenance | | | tst.js:54:21:54:44 | documen ... .search | tst.js:54:16:54:45 | chop(do ... search) | provenance | Config | @@ -976,6 +990,8 @@ edges | tst.js:56:21:56:44 | documen ... .search | tst.js:56:16:56:45 | chop(do ... search) | provenance | | | tst.js:56:21:56:44 | documen ... .search | tst.js:56:16:56:45 | chop(do ... search) | provenance | Config | | tst.js:58:21:58:31 | chop(bar()) | tst.js:42:15:42:15 | s | provenance | | +| tst.js:58:21:58:31 | chop(bar()) | tst.js:42:15:42:15 | s | provenance | | +| tst.js:58:21:58:31 | chop(bar()) | tst.js:58:16:58:32 | wrap(chop(bar())) | provenance | | | tst.js:58:21:58:31 | chop(bar()) | tst.js:58:16:58:32 | wrap(chop(bar())) | provenance | | | tst.js:58:21:58:31 | chop(bar()) | tst.js:58:16:58:32 | wrap(chop(bar())) | provenance | Config | | tst.js:58:26:58:30 | bar() | tst.js:48:15:48:15 | s | provenance | | @@ -1114,6 +1130,9 @@ edges | tst.js:491:23:491:35 | location.hash | tst.js:491:23:491:45 | locatio ... bstr(1) | provenance | Config | | tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | provenance | Config | | tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | provenance | | +| tst.js:508:7:508:39 | target | tst.js:509:18:509:23 | target | provenance | | +| tst.js:508:16:508:39 | documen ... .search | tst.js:508:7:508:39 | target | provenance | | +| tst.js:509:18:509:23 | target | tst.js:509:18:509:54 | target. ... "), '') | provenance | | | typeahead.js:9:28:9:30 | loc | typeahead.js:10:16:10:18 | loc | provenance | | | typeahead.js:20:13:20:45 | target | typeahead.js:21:12:21:17 | target | provenance | | | typeahead.js:20:22:20:45 | documen ... .search | typeahead.js:20:13:20:45 | target | provenance | | @@ -1182,8 +1201,14 @@ subpaths | tst.js:40:20:40:43 | documen ... .search | tst.js:36:14:36:14 | x | tst.js:37:10:37:10 | x | tst.js:40:16:40:44 | baz(doc ... search) | | tst.js:46:21:46:44 | documen ... .search | tst.js:42:15:42:15 | s | tst.js:43:10:43:31 | "
" ...
" | tst.js:46:16:46:45 | wrap(do ... search) | | tst.js:54:21:54:44 | documen ... .search | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:54:16:54:45 | chop(do ... search) | +| tst.js:54:21:54:44 | documen ... .search | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:54:16:54:45 | chop(do ... search) | +| tst.js:54:21:54:44 | documen ... .search | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:54:16:54:45 | chop(do ... search) | +| tst.js:56:21:56:44 | documen ... .search | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:56:16:56:45 | chop(do ... search) | +| tst.js:56:21:56:44 | documen ... .search | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:56:16:56:45 | chop(do ... search) | | tst.js:56:21:56:44 | documen ... .search | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:56:16:56:45 | chop(do ... search) | | tst.js:58:21:58:31 | chop(bar()) | tst.js:42:15:42:15 | s | tst.js:43:10:43:31 | "
" ...
" | tst.js:58:16:58:32 | wrap(chop(bar())) | +| tst.js:58:21:58:31 | chop(bar()) | tst.js:42:15:42:15 | s | tst.js:43:10:43:31 | "
" ...
" | tst.js:58:16:58:32 | wrap(chop(bar())) | +| tst.js:58:26:58:30 | bar() | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:58:21:58:31 | chop(bar()) | | tst.js:58:26:58:30 | bar() | tst.js:48:15:48:15 | s | tst.js:50:12:50:22 | s.substr(1) | tst.js:58:21:58:31 | chop(bar()) | | various-concat-obfuscations.js:20:17:20:46 | documen ... h.attrs | various-concat-obfuscations.js:14:24:14:28 | attrs | various-concat-obfuscations.js:15:10:15:83 | '
' | various-concat-obfuscations.js:20:4:20:47 | indirec ... .attrs) | | various-concat-obfuscations.js:21:17:21:46 | documen ... h.attrs | various-concat-obfuscations.js:17:24:17:28 | attrs | various-concat-obfuscations.js:18:10:18:105 | '
') | various-concat-obfuscations.js:21:4:21:47 | indirec ... .attrs) | diff --git a/javascript/ql/test/query-tests/Security/CWE-079/UnsafeHtmlConstruction/UnsafeHtmlConstruction.expected b/javascript/ql/test/query-tests/Security/CWE-079/UnsafeHtmlConstruction/UnsafeHtmlConstruction.expected index 49092b056422..678b42231c9a 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/UnsafeHtmlConstruction/UnsafeHtmlConstruction.expected +++ b/javascript/ql/test/query-tests/Security/CWE-079/UnsafeHtmlConstruction/UnsafeHtmlConstruction.expected @@ -28,10 +28,13 @@ nodes | main.js:22:34:22:34 | s | semmle.label | s | | main.js:56:28:56:34 | options | semmle.label | options | | main.js:57:11:59:5 | defaults | semmle.label | defaults | +| main.js:57:11:59:5 | defaults | semmle.label | defaults | +| main.js:57:22:59:5 | {\\n ... "\\n } | semmle.label | {\\n ... "\\n } | | main.js:57:22:59:5 | {\\n ... "\\n } | semmle.label | {\\n ... "\\n } | | main.js:60:11:60:48 | settings | semmle.label | settings | | main.js:60:22:60:48 | $.exten ... ptions) | semmle.label | $.exten ... ptions) | | main.js:60:31:60:38 | defaults | semmle.label | defaults | +| main.js:60:31:60:38 | defaults | semmle.label | defaults | | main.js:60:41:60:47 | options | semmle.label | options | | main.js:62:19:62:26 | settings | semmle.label | settings | | main.js:62:19:62:31 | settings.name | semmle.label | settings.name | @@ -75,12 +78,16 @@ edges | main.js:21:47:21:47 | s | main.js:22:34:22:34 | s | provenance | | | main.js:56:28:56:34 | options | main.js:60:41:60:47 | options | provenance | | | main.js:57:11:59:5 | defaults | main.js:60:31:60:38 | defaults | provenance | | +| main.js:57:11:59:5 | defaults | main.js:60:31:60:38 | defaults | provenance | | +| main.js:57:22:59:5 | {\\n ... "\\n } | main.js:57:11:59:5 | defaults | provenance | | | main.js:57:22:59:5 | {\\n ... "\\n } | main.js:57:11:59:5 | defaults | provenance | | | main.js:60:11:60:48 | settings | main.js:62:19:62:26 | settings | provenance | | | main.js:60:22:60:48 | $.exten ... ptions) | main.js:60:11:60:48 | settings | provenance | | | main.js:60:31:60:38 | defaults | main.js:60:22:60:48 | $.exten ... ptions) | provenance | | +| main.js:60:31:60:38 | defaults | main.js:60:22:60:48 | $.exten ... ptions) | provenance | | | main.js:60:31:60:38 | defaults | main.js:60:22:60:48 | $.exten ... ptions) | provenance | Config | | main.js:60:41:60:47 | options | main.js:57:22:59:5 | {\\n ... "\\n } | provenance | | +| main.js:60:41:60:47 | options | main.js:57:22:59:5 | {\\n ... "\\n } | provenance | | | main.js:60:41:60:47 | options | main.js:57:22:59:5 | {\\n ... "\\n } | provenance | Config | | main.js:60:41:60:47 | options | main.js:60:22:60:48 | $.exten ... ptions) | provenance | | | main.js:60:41:60:47 | options | main.js:60:22:60:48 | $.exten ... ptions) | provenance | Config | diff --git a/javascript/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected b/javascript/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected index a5273e057583..8a0bbb6077a4 100644 --- a/javascript/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected +++ b/javascript/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected @@ -71,6 +71,7 @@ edges | passwords.js:164:14:164:21 | password | passwords.js:164:14:164:42 | passwor ... g, "*") | provenance | | | passwords.js:169:17:169:24 | password | passwords.js:169:17:169:45 | passwor ... g, "*") | provenance | | | passwords.js:170:11:170:18 | password | passwords.js:170:11:170:39 | passwor ... g, "*") | provenance | | +| passwords.js:182:14:182:21 | password | passwords.js:182:14:182:51 | passwor ... ), "*") | provenance | | | passwords_in_server_5.js:4:7:4:24 | req.query.password | passwords_in_server_5.js:7:12:7:12 | x | provenance | | | passwords_in_server_5.js:7:12:7:12 | x | passwords_in_server_5.js:8:17:8:17 | x | provenance | | nodes @@ -164,6 +165,8 @@ nodes | passwords.js:170:11:170:39 | passwor ... g, "*") | semmle.label | passwor ... g, "*") | | passwords.js:173:17:173:26 | myPassword | semmle.label | myPassword | | passwords.js:176:17:176:26 | myPasscode | semmle.label | myPasscode | +| passwords.js:182:14:182:21 | password | semmle.label | password | +| passwords.js:182:14:182:51 | passwor ... ), "*") | semmle.label | passwor ... ), "*") | | passwords_in_browser1.js:2:13:2:20 | password | semmle.label | password | | passwords_in_browser2.js:2:13:2:20 | password | semmle.label | password | | passwords_in_server_1.js:6:13:6:20 | password | semmle.label | password | @@ -210,6 +213,7 @@ subpaths | passwords.js:170:11:170:39 | passwor ... g, "*") | passwords.js:170:11:170:18 | password | passwords.js:170:11:170:39 | passwor ... g, "*") | This logs sensitive data returned by $@ as clear text. | passwords.js:170:11:170:18 | password | an access to password | | passwords.js:173:17:173:26 | myPassword | passwords.js:173:17:173:26 | myPassword | passwords.js:173:17:173:26 | myPassword | This logs sensitive data returned by $@ as clear text. | passwords.js:173:17:173:26 | myPassword | an access to myPassword | | passwords.js:176:17:176:26 | myPasscode | passwords.js:176:17:176:26 | myPasscode | passwords.js:176:17:176:26 | myPasscode | This logs sensitive data returned by $@ as clear text. | passwords.js:176:17:176:26 | myPasscode | an access to myPasscode | +| passwords.js:182:14:182:51 | passwor ... ), "*") | passwords.js:182:14:182:21 | password | passwords.js:182:14:182:51 | passwor ... ), "*") | This logs sensitive data returned by $@ as clear text. | passwords.js:182:14:182:21 | password | an access to password | | passwords_in_server_1.js:6:13:6:20 | password | passwords_in_server_1.js:6:13:6:20 | password | passwords_in_server_1.js:6:13:6:20 | password | This logs sensitive data returned by $@ as clear text. | passwords_in_server_1.js:6:13:6:20 | password | an access to password | | passwords_in_server_2.js:3:13:3:20 | password | passwords_in_server_2.js:3:13:3:20 | password | passwords_in_server_2.js:3:13:3:20 | password | This logs sensitive data returned by $@ as clear text. | passwords_in_server_2.js:3:13:3:20 | password | an access to password | | passwords_in_server_3.js:2:13:2:20 | password | passwords_in_server_3.js:2:13:2:20 | password | passwords_in_server_3.js:2:13:2:20 | password | This logs sensitive data returned by $@ as clear text. | passwords_in_server_3.js:2:13:2:20 | password | an access to password | diff --git a/javascript/ql/test/query-tests/Security/CWE-400/ReDoS/PolynomialReDoS.expected b/javascript/ql/test/query-tests/Security/CWE-400/ReDoS/PolynomialReDoS.expected index da41dd5354d6..83d8243c269f 100644 --- a/javascript/ql/test/query-tests/Security/CWE-400/ReDoS/PolynomialReDoS.expected +++ b/javascript/ql/test/query-tests/Security/CWE-400/ReDoS/PolynomialReDoS.expected @@ -348,6 +348,9 @@ edges | polynomial-redos.js:132:18:132:24 | tainted | polynomial-redos.js:135:21:135:27 | tainted | provenance | | | polynomial-redos.js:132:18:132:50 | tainted ... g, "e") | polynomial-redos.js:132:6:132:50 | modified2 | provenance | | | polynomial-redos.js:135:9:135:47 | modified3 | polynomial-redos.js:136:5:136:13 | modified3 | provenance | | +| polynomial-redos.js:135:9:135:47 | modified3 | polynomial-redos.js:140:2:140:10 | modified3 | provenance | | +| polynomial-redos.js:135:9:135:47 | modified3 | polynomial-redos.js:141:2:141:10 | modified3 | provenance | | +| polynomial-redos.js:135:9:135:47 | modified3 | polynomial-redos.js:142:2:142:10 | modified3 | provenance | | | polynomial-redos.js:135:21:135:27 | tainted | polynomial-redos.js:135:21:135:47 | tainted ... /g, "") | provenance | | | polynomial-redos.js:135:21:135:27 | tainted | polynomial-redos.js:138:5:138:11 | tainted | provenance | | | polynomial-redos.js:135:21:135:47 | tainted ... /g, "") | polynomial-redos.js:135:9:135:47 | modified3 | provenance | | @@ -573,6 +576,9 @@ nodes | polynomial-redos.js:135:21:135:47 | tainted ... /g, "") | semmle.label | tainted ... /g, "") | | polynomial-redos.js:136:5:136:13 | modified3 | semmle.label | modified3 | | polynomial-redos.js:138:5:138:11 | tainted | semmle.label | tainted | +| polynomial-redos.js:140:2:140:10 | modified3 | semmle.label | modified3 | +| polynomial-redos.js:141:2:141:10 | modified3 | semmle.label | modified3 | +| polynomial-redos.js:142:2:142:10 | modified3 | semmle.label | modified3 | subpaths #select | lib/closure.js:4:5:4:17 | /u*o/.test(x) | lib/closure.js:3:21:3:21 | x | lib/closure.js:4:16:4:16 | x | This $@ that depends on $@ may run slow on strings with many repetitions of 'u'. | lib/closure.js:4:6:4:7 | u* | regular expression | lib/closure.js:3:21:3:21 | x | library input | @@ -673,3 +679,6 @@ subpaths | polynomial-redos.js:133:2:133:32 | modifie ... g, "b") | polynomial-redos.js:5:16:5:32 | req.query.tainted | polynomial-redos.js:133:2:133:10 | modified2 | This $@ that depends on $@ may run slow on strings starting with 'f' and with many repetitions of 'f'. | polynomial-redos.js:133:22:133:23 | f+ | regular expression | polynomial-redos.js:5:16:5:32 | req.query.tainted | a user-provided value | | polynomial-redos.js:136:5:136:35 | modifie ... g, "b") | polynomial-redos.js:5:16:5:32 | req.query.tainted | polynomial-redos.js:136:5:136:13 | modified3 | This $@ that depends on $@ may run slow on strings starting with 'h' and with many repetitions of 'h'. | polynomial-redos.js:136:25:136:26 | h+ | regular expression | polynomial-redos.js:5:16:5:32 | req.query.tainted | a user-provided value | | polynomial-redos.js:138:5:138:326 | tainted ... )C.*X/) | polynomial-redos.js:5:16:5:32 | req.query.tainted | polynomial-redos.js:138:5:138:11 | tainted | This $@ that depends on $@ may run slow on strings starting with 'AAAAAAAAAAAAAAAAAAAAAABBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC' and with many repetitions of 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC'. | polynomial-redos.js:138:322:138:323 | .* | regular expression | polynomial-redos.js:5:16:5:32 | req.query.tainted | a user-provided value | +| polynomial-redos.js:140:2:140:48 | modifie ... ), "b") | polynomial-redos.js:5:16:5:32 | req.query.tainted | polynomial-redos.js:140:2:140:10 | modified3 | This $@ that depends on $@ may run slow on strings starting with 'h' and with many repetitions of 'h'. | polynomial-redos.js:140:33:140:34 | h+ | regular expression | polynomial-redos.js:5:16:5:32 | req.query.tainted | a user-provided value | +| polynomial-redos.js:141:2:141:59 | modifie ... ), "b") | polynomial-redos.js:5:16:5:32 | req.query.tainted | polynomial-redos.js:141:2:141:10 | modified3 | This $@ that depends on $@ may run slow on strings starting with 'h' and with many repetitions of 'h'. | polynomial-redos.js:141:33:141:34 | h+ | regular expression | polynomial-redos.js:5:16:5:32 | req.query.tainted | a user-provided value | +| polynomial-redos.js:142:2:142:47 | modifie ... ), "b") | polynomial-redos.js:5:16:5:32 | req.query.tainted | polynomial-redos.js:142:2:142:10 | modified3 | This $@ that depends on $@ may run slow on strings starting with 'h' and with many repetitions of 'h'. | polynomial-redos.js:142:33:142:34 | h+ | regular expression | polynomial-redos.js:5:16:5:32 | req.query.tainted | a user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-601/ClientSideUrlRedirect/Consistency.ql b/javascript/ql/test/query-tests/Security/CWE-601/ClientSideUrlRedirect/Consistency.ql index 860e607576db..e02e59dcb19a 100644 --- a/javascript/ql/test/query-tests/Security/CWE-601/ClientSideUrlRedirect/Consistency.ql +++ b/javascript/ql/test/query-tests/Security/CWE-601/ClientSideUrlRedirect/Consistency.ql @@ -1,6 +1,6 @@ import javascript import semmle.javascript.security.dataflow.ClientSideUrlRedirectQuery -import testUtilities.ConsistencyChecking +import utils.test.ConsistencyChecking deprecated class ClientSideUrlRedirectConsistency extends ConsistencyConfiguration { ClientSideUrlRedirectConsistency() { this = "ClientSideUrlRedirectConsistency" } diff --git a/javascript/ql/test/query-tests/Security/CWE-730/RegExpInjection.expected b/javascript/ql/test/query-tests/Security/CWE-730/RegExpInjection.expected index b6622ba3dbc9..86ac47a8e16f 100644 --- a/javascript/ql/test/query-tests/Security/CWE-730/RegExpInjection.expected +++ b/javascript/ql/test/query-tests/Security/CWE-730/RegExpInjection.expected @@ -42,6 +42,11 @@ edges | RegExpInjection.js:87:25:87:48 | input.r ... g, "\|") | RegExpInjection.js:87:14:87:55 | "^.*\\.( ... + ")$" | provenance | | | RegExpInjection.js:91:20:91:30 | process.env | RegExpInjection.js:91:16:91:50 | `^${pro ... r.app$` | provenance | | | RegExpInjection.js:93:20:93:31 | process.argv | RegExpInjection.js:93:16:93:49 | `^${pro ... r.app$` | provenance | | +| RegExpInjection.js:97:7:97:32 | input | RegExpInjection.js:99:19:99:23 | input | provenance | | +| RegExpInjection.js:97:15:97:32 | req.param("input") | RegExpInjection.js:97:7:97:32 | input | provenance | | +| RegExpInjection.js:99:7:99:106 | sanitized | RegExpInjection.js:100:14:100:22 | sanitized | provenance | | +| RegExpInjection.js:99:19:99:23 | input | RegExpInjection.js:99:19:99:106 | input.r ... "\\\\$&") | provenance | | +| RegExpInjection.js:99:19:99:106 | input.r ... "\\\\$&") | RegExpInjection.js:99:7:99:106 | sanitized | provenance | | | tst.js:5:9:5:29 | data | tst.js:6:21:6:24 | data | provenance | | | tst.js:5:16:5:29 | req.query.data | tst.js:5:9:5:29 | data | provenance | | | tst.js:6:21:6:24 | data | tst.js:6:16:6:35 | "^"+ data.name + "$" | provenance | | @@ -93,6 +98,12 @@ nodes | RegExpInjection.js:91:20:91:30 | process.env | semmle.label | process.env | | RegExpInjection.js:93:16:93:49 | `^${pro ... r.app$` | semmle.label | `^${pro ... r.app$` | | RegExpInjection.js:93:20:93:31 | process.argv | semmle.label | process.argv | +| RegExpInjection.js:97:7:97:32 | input | semmle.label | input | +| RegExpInjection.js:97:15:97:32 | req.param("input") | semmle.label | req.param("input") | +| RegExpInjection.js:99:7:99:106 | sanitized | semmle.label | sanitized | +| RegExpInjection.js:99:19:99:23 | input | semmle.label | input | +| RegExpInjection.js:99:19:99:106 | input.r ... "\\\\$&") | semmle.label | input.r ... "\\\\$&") | +| RegExpInjection.js:100:14:100:22 | sanitized | semmle.label | sanitized | | tst.js:5:9:5:29 | data | semmle.label | data | | tst.js:5:16:5:29 | req.query.data | semmle.label | req.query.data | | tst.js:6:16:6:35 | "^"+ data.name + "$" | semmle.label | "^"+ data.name + "$" | @@ -119,4 +130,5 @@ subpaths | RegExpInjection.js:87:14:87:55 | "^.*\\.( ... + ")$" | RegExpInjection.js:82:15:82:32 | req.param("input") | RegExpInjection.js:87:14:87:55 | "^.*\\.( ... + ")$" | This regular expression is constructed from a $@. | RegExpInjection.js:82:15:82:32 | req.param("input") | user-provided value | | RegExpInjection.js:91:16:91:50 | `^${pro ... r.app$` | RegExpInjection.js:91:20:91:30 | process.env | RegExpInjection.js:91:16:91:50 | `^${pro ... r.app$` | This regular expression is constructed from a $@. | RegExpInjection.js:91:20:91:30 | process.env | environment variable | | RegExpInjection.js:93:16:93:49 | `^${pro ... r.app$` | RegExpInjection.js:93:20:93:31 | process.argv | RegExpInjection.js:93:16:93:49 | `^${pro ... r.app$` | This regular expression is constructed from a $@. | RegExpInjection.js:93:20:93:31 | process.argv | command-line argument | +| RegExpInjection.js:100:14:100:22 | sanitized | RegExpInjection.js:97:15:97:32 | req.param("input") | RegExpInjection.js:100:14:100:22 | sanitized | This regular expression is constructed from a $@. | RegExpInjection.js:97:15:97:32 | req.param("input") | user-provided value | | tst.js:6:16:6:35 | "^"+ data.name + "$" | tst.js:5:16:5:29 | req.query.data | tst.js:6:16:6:35 | "^"+ data.name + "$" | This regular expression is constructed from a $@. | tst.js:5:16:5:29 | req.query.data | user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingAssignment/PrototypePollutingAssignment.expected b/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingAssignment/PrototypePollutingAssignment.expected index 46e9be97d631..34df462cf0ae 100644 --- a/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingAssignment/PrototypePollutingAssignment.expected +++ b/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingAssignment/PrototypePollutingAssignment.expected @@ -106,6 +106,8 @@ edges | tst.js:102:17:102:38 | String( ... y.data) | tst.js:102:9:102:38 | taint | provenance | | | tst.js:102:24:102:37 | req.query.data | tst.js:102:17:102:38 | String( ... y.data) | provenance | Config | | tst.js:105:12:105:16 | taint | tst.js:105:5:105:17 | object[taint] | provenance | Config | +| tst.js:130:9:130:19 | req.query.x | tst.js:130:9:130:52 | req.que ... '), '') | provenance | Config | +| tst.js:130:9:130:52 | req.que ... '), '') | tst.js:130:5:130:53 | obj[req ... ), '')] | provenance | Config | nodes | lib.js:1:38:1:40 | obj | semmle.label | obj | | lib.js:1:43:1:46 | path | semmle.label | path | @@ -232,6 +234,9 @@ nodes | tst.js:102:24:102:37 | req.query.data | semmle.label | req.query.data | | tst.js:105:5:105:17 | object[taint] | semmle.label | object[taint] | | tst.js:105:12:105:16 | taint | semmle.label | taint | +| tst.js:130:5:130:53 | obj[req ... ), '')] | semmle.label | obj[req ... ), '')] | +| tst.js:130:9:130:19 | req.query.x | semmle.label | req.query.x | +| tst.js:130:9:130:52 | req.que ... '), '') | semmle.label | req.que ... '), '') | subpaths | tst.js:14:27:14:31 | taint | tst.js:55:29:55:32 | prop | tst.js:56:12:56:33 | obj ? o ... : null | tst.js:14:5:14:32 | unsafeG ... taint) | #select @@ -261,3 +266,4 @@ subpaths | tst.js:94:5:94:37 | obj[req ... ', '')] | tst.js:94:9:94:19 | req.query.x | tst.js:94:5:94:37 | obj[req ... ', '')] | This assignment may alter Object.prototype if a malicious '__proto__' string is injected from $@. | tst.js:94:9:94:19 | req.query.x | user controlled input | | tst.js:97:5:97:46 | obj[req ... g, '')] | tst.js:97:9:97:19 | req.query.x | tst.js:97:5:97:46 | obj[req ... g, '')] | This assignment may alter Object.prototype if a malicious '__proto__' string is injected from $@. | tst.js:97:9:97:19 | req.query.x | user controlled input | | tst.js:105:5:105:17 | object[taint] | tst.js:102:24:102:37 | req.query.data | tst.js:105:5:105:17 | object[taint] | This assignment may alter Object.prototype if a malicious '__proto__' string is injected from $@. | tst.js:102:24:102:37 | req.query.data | user controlled input | +| tst.js:130:5:130:53 | obj[req ... ), '')] | tst.js:130:9:130:19 | req.query.x | tst.js:130:5:130:53 | obj[req ... ), '')] | This assignment may alter Object.prototype if a malicious '__proto__' string is injected from $@. | tst.js:130:9:130:19 | req.query.x | user controlled input | diff --git a/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingFunction/PrototypePollutingFunction.expected b/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingFunction/PrototypePollutingFunction.expected index 77719fd65c7a..bc4a6e4456a8 100644 --- a/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingFunction/PrototypePollutingFunction.expected +++ b/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingFunction/PrototypePollutingFunction.expected @@ -321,7 +321,6 @@ nodes | tests.js:306:34:306:41 | dst[key] | semmle.label | dst[key] | | tests.js:306:38:306:40 | key | semmle.label | key | | tests.js:306:44:306:48 | value | semmle.label | value | -| tests.js:306:44:306:48 | value | semmle.label | value | | tests.js:308:17:308:19 | dst | semmle.label | dst | | tests.js:308:21:308:23 | key | semmle.label | key | | tests.js:308:28:308:32 | value | semmle.label | value | @@ -340,7 +339,6 @@ nodes | tests.js:320:38:320:45 | dst[key] | semmle.label | dst[key] | | tests.js:320:42:320:44 | key | semmle.label | key | | tests.js:320:48:320:52 | value | semmle.label | value | -| tests.js:320:48:320:52 | value | semmle.label | value | | tests.js:322:17:322:19 | dst | semmle.label | dst | | tests.js:322:21:322:23 | key | semmle.label | key | | tests.js:322:28:322:32 | value | semmle.label | value | @@ -554,7 +552,6 @@ nodes | tests.js:498:21:498:28 | src[key] | semmle.label | src[key] | | tests.js:498:25:498:27 | key | semmle.label | key | | tests.js:500:38:500:42 | value | semmle.label | value | -| tests.js:500:38:500:42 | value | semmle.label | value | | tests.js:502:17:502:19 | key | semmle.label | key | | tests.js:502:24:502:28 | value | semmle.label | value | | tests.js:508:30:508:32 | dst | semmle.label | dst | @@ -998,7 +995,6 @@ edges | tests.js:306:34:306:41 | dst[key] | tests.js:301:27:301:29 | dst | provenance | | | tests.js:306:38:306:40 | key | tests.js:306:34:306:41 | dst[key] | provenance | Config | | tests.js:306:44:306:48 | value | tests.js:301:32:301:34 | src | provenance | | -| tests.js:306:44:306:48 | value | tests.js:301:32:301:34 | src | provenance | | | tests.js:314:31:314:33 | dst | tests.js:320:38:320:40 | dst | provenance | | | tests.js:314:31:314:33 | dst | tests.js:322:17:322:19 | dst | provenance | | | tests.js:314:36:314:38 | src | tests.js:318:25:318:27 | src | provenance | | @@ -1020,7 +1016,6 @@ edges | tests.js:320:38:320:45 | dst[key] | tests.js:314:31:314:33 | dst | provenance | | | tests.js:320:42:320:44 | key | tests.js:320:38:320:45 | dst[key] | provenance | Config | | tests.js:320:48:320:52 | value | tests.js:314:36:314:38 | src | provenance | | -| tests.js:320:48:320:52 | value | tests.js:314:36:314:38 | src | provenance | | | tests.js:328:25:328:27 | dst | tests.js:336:32:336:34 | dst | provenance | | | tests.js:328:25:328:27 | dst | tests.js:338:17:338:19 | dst | provenance | | | tests.js:328:30:328:32 | src | tests.js:336:42:336:44 | src | provenance | | @@ -1266,7 +1261,6 @@ edges | tests.js:498:21:498:28 | src[key] | tests.js:498:13:498:28 | value | provenance | | | tests.js:498:25:498:27 | key | tests.js:498:21:498:28 | src[key] | provenance | Config | | tests.js:500:38:500:42 | value | tests.js:494:32:494:34 | src | provenance | | -| tests.js:500:38:500:42 | value | tests.js:494:32:494:34 | src | provenance | | | tests.js:508:30:508:32 | dst | tests.js:513:33:513:35 | dst | provenance | | | tests.js:508:30:508:32 | dst | tests.js:517:35:517:37 | dst | provenance | | | tests.js:508:35:508:37 | src | tests.js:513:43:513:45 | src | provenance | |