diff --git a/javascript/ql/src/semmle/javascript/Expr.qll b/javascript/ql/src/semmle/javascript/Expr.qll index 8946ab66f12a..705d7b3aec40 100644 --- a/javascript/ql/src/semmle/javascript/Expr.qll +++ b/javascript/ql/src/semmle/javascript/Expr.qll @@ -161,6 +161,66 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { * file that was extracted without type information. */ Type getType() { ast_node_type(this, result) } + + /** + * Holds if the syntactic context that the expression appears in relies on the expression + * being non-null/non-undefined. + * + * A context relies on the subexpression being non-null/non-undefined if either... + * + * * Using null or undefined would cause a runtime error + * * Using null or undefined would cause no error due to type conversion, but the + * behavior in the broader context is sufficiently non-obvious to warrant explicitly + * converting to ensure that readers understand the intent + */ + predicate inNullSensitiveContext() { + exists(ExprOrStmt ctx | + // bases cases + this = ctx.(PropAccess).getBase() + or + this = ctx.(IndexExpr).getPropertyNameExpr() + or + this = ctx.(InvokeExpr).getCallee() + or + this = ctx.(BinaryExpr).getAnOperand() and + not ctx instanceof LogicalBinaryExpr and // x LOGOP y is fine because of implicit conversion + not ctx instanceof EqualityTest and // x EQOP y is fine because of implicit conversion and lack thereof + not ctx.(BitOrExpr).getAnOperand().(NumberLiteral).getIntValue() = 0 and // x | 0 is fine because it's used to convert to numbers + not ctx.(RShiftExpr).getRightOperand().(NumberLiteral).getIntValue() = 0 and // x >> 0 is fine because it's used to convert to numbers + not ctx.(URShiftExpr).getRightOperand().(NumberLiteral).getIntValue() = 0 // x >>> 0 is fine because it's used to convert to numbers + or + this = ctx.(UnaryExpr).getOperand() and + not ctx instanceof LogNotExpr and // !x is fine because of implicit conversion + not ctx instanceof PlusExpr and // +x is fine because of implicit conversion + not ctx instanceof VoidExpr // void x is fine because it explicitly is for capturing void things + or + this = ctx.(UpdateExpr).getOperand() + or + this = ctx.(CompoundAssignExpr).getLhs() + or + this = ctx.(CompoundAssignExpr).getRhs() + or + this = ctx.(AssignExpr).getRhs() and + ctx.(AssignExpr).getLhs() instanceof DestructuringPattern + or + this = ctx.(SpreadElement).getOperand() + or + this = ctx.(ForOfStmt).getIterationDomain() + or + // recursive cases + this = ctx.(ParExpr).getExpression() and + ctx.(ParExpr).inNullSensitiveContext() + or + this = ctx.(SeqExpr).getLastOperand() and + ctx.(SeqExpr).inNullSensitiveContext() + or + this = ctx.(LogicalBinaryExpr).getRightOperand() and + ctx.(LogicalBinaryExpr).inNullSensitiveContext() + or + this = ctx.(ConditionalExpr).getABranch() and + ctx.(ConditionalExpr).inNullSensitiveContext() + ) + } } /** An identifier. */ diff --git a/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js b/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js new file mode 100644 index 000000000000..caa8e0046fe2 --- /dev/null +++ b/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js @@ -0,0 +1,60 @@ +/////////////////// +// // +// SHOULD FIND // +// // +/////////////////// + +foo[bar]; +foo.bar; +new Foo; +new Foo(); +foo.bar = 5; +foo(bar); +x + y; +x - y; +x * y; +x / y; +x % y; ++x; +-x; +++x; +x++; +--x; +x--; +x += y; +x -= y; +x *= y; +x /= y; +x %= y; +[x , y] = p; +//[1,2,...xs] +x & y; +x | y; +x ^ y; +x << y; +x >> y; +x >>> y; +~x; +x &= y; +x |= y; +x ^= y; +x <<= y; +x >>= y; +x >>>= y; +for (let x of y) { } + + + +/////////////////////// +// // +// SHOULD NOT FIND // +// // +/////////////////////// + +x && y; +x || y; +!x; +if (x) { } +while (x) { } +for (; y; z) { } +for (let x in y) { } diff --git a/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.qll b/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.qll new file mode 100644 index 000000000000..dd67d7c1a88c --- /dev/null +++ b/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.qll @@ -0,0 +1,3 @@ +import javascript + +query predicate test_inNullSensitiveContext(Expr e) { e.inNullSensitiveContext() } diff --git a/javascript/ql/test/library-tests/Expr/tests.expected b/javascript/ql/test/library-tests/Expr/tests.expected index dfb9852170d9..4e080750fbad 100644 --- a/javascript/ql/test/library-tests/Expr/tests.expected +++ b/javascript/ql/test/library-tests/Expr/tests.expected @@ -220,6 +220,127 @@ test_getParent | mozextensions.js:1:23:1:23 | x | mozextensions.js:1:23:1:25 | x+1 | | mozextensions.js:1:23:1:25 | x+1 | mozextensions.js:1:11:1:25 | function(x) x+1 | | mozextensions.js:1:25:1:25 | 1 | mozextensions.js:1:23:1:25 | x+1 | +| nullSensitiveContexts.js:7:1:7:3 | foo | nullSensitiveContexts.js:7:1:7:8 | foo[bar] | +| nullSensitiveContexts.js:7:1:7:8 | foo[bar] | nullSensitiveContexts.js:7:1:7:9 | foo[bar]; | +| nullSensitiveContexts.js:7:5:7:7 | bar | nullSensitiveContexts.js:7:1:7:8 | foo[bar] | +| nullSensitiveContexts.js:8:1:8:3 | foo | nullSensitiveContexts.js:8:1:8:7 | foo.bar | +| nullSensitiveContexts.js:8:1:8:7 | foo.bar | nullSensitiveContexts.js:8:1:8:8 | foo.bar; | +| nullSensitiveContexts.js:8:5:8:7 | bar | nullSensitiveContexts.js:8:1:8:7 | foo.bar | +| nullSensitiveContexts.js:9:1:9:7 | new Foo | nullSensitiveContexts.js:9:1:9:8 | new Foo; | +| nullSensitiveContexts.js:9:5:9:7 | Foo | nullSensitiveContexts.js:9:1:9:7 | new Foo | +| nullSensitiveContexts.js:10:1:10:9 | new Foo() | nullSensitiveContexts.js:10:1:10:10 | new Foo(); | +| nullSensitiveContexts.js:10:5:10:7 | Foo | nullSensitiveContexts.js:10:1:10:9 | new Foo() | +| nullSensitiveContexts.js:11:1:11:3 | foo | nullSensitiveContexts.js:11:1:11:7 | foo.bar | +| nullSensitiveContexts.js:11:1:11:7 | foo.bar | nullSensitiveContexts.js:11:1:11:11 | foo.bar = 5 | +| nullSensitiveContexts.js:11:1:11:11 | foo.bar = 5 | nullSensitiveContexts.js:11:1:11:12 | foo.bar = 5; | +| nullSensitiveContexts.js:11:5:11:7 | bar | nullSensitiveContexts.js:11:1:11:7 | foo.bar | +| nullSensitiveContexts.js:11:11:11:11 | 5 | nullSensitiveContexts.js:11:1:11:11 | foo.bar = 5 | +| nullSensitiveContexts.js:12:1:12:3 | foo | nullSensitiveContexts.js:12:1:12:8 | foo(bar) | +| nullSensitiveContexts.js:12:1:12:8 | foo(bar) | nullSensitiveContexts.js:12:1:12:9 | foo(bar); | +| nullSensitiveContexts.js:12:5:12:7 | bar | nullSensitiveContexts.js:12:1:12:8 | foo(bar) | +| nullSensitiveContexts.js:13:1:13:1 | x | nullSensitiveContexts.js:13:1:13:5 | x + y | +| nullSensitiveContexts.js:13:1:13:5 | x + y | nullSensitiveContexts.js:13:1:13:6 | x + y; | +| nullSensitiveContexts.js:13:5:13:5 | y | nullSensitiveContexts.js:13:1:13:5 | x + y | +| nullSensitiveContexts.js:14:1:14:1 | x | nullSensitiveContexts.js:14:1:14:5 | x - y | +| nullSensitiveContexts.js:14:1:14:5 | x - y | nullSensitiveContexts.js:14:1:14:6 | x - y; | +| nullSensitiveContexts.js:14:5:14:5 | y | nullSensitiveContexts.js:14:1:14:5 | x - y | +| nullSensitiveContexts.js:15:1:15:1 | x | nullSensitiveContexts.js:15:1:15:5 | x * y | +| nullSensitiveContexts.js:15:1:15:5 | x * y | nullSensitiveContexts.js:15:1:15:6 | x * y; | +| nullSensitiveContexts.js:15:5:15:5 | y | nullSensitiveContexts.js:15:1:15:5 | x * y | +| nullSensitiveContexts.js:16:1:16:1 | x | nullSensitiveContexts.js:16:1:16:5 | x / y | +| nullSensitiveContexts.js:16:1:16:5 | x / y | nullSensitiveContexts.js:16:1:16:6 | x / y; | +| nullSensitiveContexts.js:16:5:16:5 | y | nullSensitiveContexts.js:16:1:16:5 | x / y | +| nullSensitiveContexts.js:17:1:17:1 | x | nullSensitiveContexts.js:17:1:17:5 | x % y | +| nullSensitiveContexts.js:17:1:17:5 | x % y | nullSensitiveContexts.js:17:1:17:6 | x % y; | +| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:17:1:17:5 | x % y | +| nullSensitiveContexts.js:18:1:18:2 | +x | nullSensitiveContexts.js:18:1:18:3 | +x; | +| nullSensitiveContexts.js:18:2:18:2 | x | nullSensitiveContexts.js:18:1:18:2 | +x | +| nullSensitiveContexts.js:19:1:19:2 | -x | nullSensitiveContexts.js:19:1:19:3 | -x; | +| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:19:1:19:2 | -x | +| nullSensitiveContexts.js:20:1:20:3 | ++x | nullSensitiveContexts.js:20:1:20:4 | ++x; | +| nullSensitiveContexts.js:20:3:20:3 | x | nullSensitiveContexts.js:20:1:20:3 | ++x | +| nullSensitiveContexts.js:21:1:21:1 | x | nullSensitiveContexts.js:21:1:21:3 | x++ | +| nullSensitiveContexts.js:21:1:21:3 | x++ | nullSensitiveContexts.js:21:1:21:4 | x++; | +| nullSensitiveContexts.js:22:1:22:3 | --x | nullSensitiveContexts.js:22:1:22:4 | --x; | +| nullSensitiveContexts.js:22:3:22:3 | x | nullSensitiveContexts.js:22:1:22:3 | --x | +| nullSensitiveContexts.js:23:1:23:1 | x | nullSensitiveContexts.js:23:1:23:3 | x-- | +| nullSensitiveContexts.js:23:1:23:3 | x-- | nullSensitiveContexts.js:23:1:23:4 | x--; | +| nullSensitiveContexts.js:24:1:24:1 | x | nullSensitiveContexts.js:24:1:24:6 | x += y | +| nullSensitiveContexts.js:24:1:24:6 | x += y | nullSensitiveContexts.js:24:1:24:7 | x += y; | +| nullSensitiveContexts.js:24:6:24:6 | y | nullSensitiveContexts.js:24:1:24:6 | x += y | +| nullSensitiveContexts.js:25:1:25:1 | x | nullSensitiveContexts.js:25:1:25:6 | x -= y | +| nullSensitiveContexts.js:25:1:25:6 | x -= y | nullSensitiveContexts.js:25:1:25:7 | x -= y; | +| nullSensitiveContexts.js:25:6:25:6 | y | nullSensitiveContexts.js:25:1:25:6 | x -= y | +| nullSensitiveContexts.js:26:1:26:1 | x | nullSensitiveContexts.js:26:1:26:6 | x *= y | +| nullSensitiveContexts.js:26:1:26:6 | x *= y | nullSensitiveContexts.js:26:1:26:7 | x *= y; | +| nullSensitiveContexts.js:26:6:26:6 | y | nullSensitiveContexts.js:26:1:26:6 | x *= y | +| nullSensitiveContexts.js:27:1:27:1 | x | nullSensitiveContexts.js:27:1:27:6 | x /= y | +| nullSensitiveContexts.js:27:1:27:6 | x /= y | nullSensitiveContexts.js:27:1:27:7 | x /= y; | +| nullSensitiveContexts.js:27:6:27:6 | y | nullSensitiveContexts.js:27:1:27:6 | x /= y | +| nullSensitiveContexts.js:28:1:28:1 | x | nullSensitiveContexts.js:28:1:28:6 | x %= y | +| nullSensitiveContexts.js:28:1:28:6 | x %= y | nullSensitiveContexts.js:28:1:28:7 | x %= y; | +| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:1:28:6 | x %= y | +| nullSensitiveContexts.js:29:1:29:7 | [x , y] | nullSensitiveContexts.js:29:1:29:11 | [x , y] = p | +| nullSensitiveContexts.js:29:1:29:11 | [x , y] = p | nullSensitiveContexts.js:29:1:29:12 | [x , y] = p; | +| nullSensitiveContexts.js:29:2:29:2 | x | nullSensitiveContexts.js:29:1:29:7 | [x , y] | +| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:29:1:29:7 | [x , y] | +| nullSensitiveContexts.js:29:11:29:11 | p | nullSensitiveContexts.js:29:1:29:11 | [x , y] = p | +| nullSensitiveContexts.js:31:1:31:1 | x | nullSensitiveContexts.js:31:1:31:5 | x & y | +| nullSensitiveContexts.js:31:1:31:5 | x & y | nullSensitiveContexts.js:31:1:31:6 | x & y; | +| nullSensitiveContexts.js:31:5:31:5 | y | nullSensitiveContexts.js:31:1:31:5 | x & y | +| nullSensitiveContexts.js:32:1:32:1 | x | nullSensitiveContexts.js:32:1:32:5 | x \| y | +| nullSensitiveContexts.js:32:1:32:5 | x \| y | nullSensitiveContexts.js:32:1:32:6 | x \| y; | +| nullSensitiveContexts.js:32:5:32:5 | y | nullSensitiveContexts.js:32:1:32:5 | x \| y | +| nullSensitiveContexts.js:33:1:33:1 | x | nullSensitiveContexts.js:33:1:33:5 | x ^ y | +| nullSensitiveContexts.js:33:1:33:5 | x ^ y | nullSensitiveContexts.js:33:1:33:6 | x ^ y; | +| nullSensitiveContexts.js:33:5:33:5 | y | nullSensitiveContexts.js:33:1:33:5 | x ^ y | +| nullSensitiveContexts.js:34:1:34:1 | x | nullSensitiveContexts.js:34:1:34:6 | x << y | +| nullSensitiveContexts.js:34:1:34:6 | x << y | nullSensitiveContexts.js:34:1:34:7 | x << y; | +| nullSensitiveContexts.js:34:6:34:6 | y | nullSensitiveContexts.js:34:1:34:6 | x << y | +| nullSensitiveContexts.js:35:1:35:1 | x | nullSensitiveContexts.js:35:1:35:6 | x >> y | +| nullSensitiveContexts.js:35:1:35:6 | x >> y | nullSensitiveContexts.js:35:1:35:7 | x >> y; | +| nullSensitiveContexts.js:35:6:35:6 | y | nullSensitiveContexts.js:35:1:35:6 | x >> y | +| nullSensitiveContexts.js:36:1:36:1 | x | nullSensitiveContexts.js:36:1:36:7 | x >>> y | +| nullSensitiveContexts.js:36:1:36:7 | x >>> y | nullSensitiveContexts.js:36:1:36:8 | x >>> y; | +| nullSensitiveContexts.js:36:7:36:7 | y | nullSensitiveContexts.js:36:1:36:7 | x >>> y | +| nullSensitiveContexts.js:37:1:37:2 | ~x | nullSensitiveContexts.js:37:1:37:3 | ~x; | +| nullSensitiveContexts.js:37:2:37:2 | x | nullSensitiveContexts.js:37:1:37:2 | ~x | +| nullSensitiveContexts.js:38:1:38:1 | x | nullSensitiveContexts.js:38:1:38:6 | x &= y | +| nullSensitiveContexts.js:38:1:38:6 | x &= y | nullSensitiveContexts.js:38:1:38:7 | x &= y; | +| nullSensitiveContexts.js:38:6:38:6 | y | nullSensitiveContexts.js:38:1:38:6 | x &= y | +| nullSensitiveContexts.js:39:1:39:1 | x | nullSensitiveContexts.js:39:1:39:6 | x \|= y | +| nullSensitiveContexts.js:39:1:39:6 | x \|= y | nullSensitiveContexts.js:39:1:39:7 | x \|= y; | +| nullSensitiveContexts.js:39:6:39:6 | y | nullSensitiveContexts.js:39:1:39:6 | x \|= y | +| nullSensitiveContexts.js:40:1:40:1 | x | nullSensitiveContexts.js:40:1:40:6 | x ^= y | +| nullSensitiveContexts.js:40:1:40:6 | x ^= y | nullSensitiveContexts.js:40:1:40:7 | x ^= y; | +| nullSensitiveContexts.js:40:6:40:6 | y | nullSensitiveContexts.js:40:1:40:6 | x ^= y | +| nullSensitiveContexts.js:41:1:41:1 | x | nullSensitiveContexts.js:41:1:41:7 | x <<= y | +| nullSensitiveContexts.js:41:1:41:7 | x <<= y | nullSensitiveContexts.js:41:1:41:8 | x <<= y; | +| nullSensitiveContexts.js:41:7:41:7 | y | nullSensitiveContexts.js:41:1:41:7 | x <<= y | +| nullSensitiveContexts.js:42:1:42:1 | x | nullSensitiveContexts.js:42:1:42:7 | x >>= y | +| nullSensitiveContexts.js:42:1:42:7 | x >>= y | nullSensitiveContexts.js:42:1:42:8 | x >>= y; | +| nullSensitiveContexts.js:42:7:42:7 | y | nullSensitiveContexts.js:42:1:42:7 | x >>= y | +| nullSensitiveContexts.js:43:1:43:1 | x | nullSensitiveContexts.js:43:1:43:8 | x >>>= y | +| nullSensitiveContexts.js:43:1:43:8 | x >>>= y | nullSensitiveContexts.js:43:1:43:9 | x >>>= y; | +| nullSensitiveContexts.js:43:8:43:8 | y | nullSensitiveContexts.js:43:1:43:8 | x >>>= y | +| nullSensitiveContexts.js:44:10:44:10 | x | nullSensitiveContexts.js:44:6:44:10 | let x | +| nullSensitiveContexts.js:44:10:44:10 | x | nullSensitiveContexts.js:44:10:44:10 | x | +| nullSensitiveContexts.js:44:15:44:15 | y | nullSensitiveContexts.js:44:1:44:20 | for (let x of y) { } | +| nullSensitiveContexts.js:54:1:54:1 | x | nullSensitiveContexts.js:54:1:54:6 | x && y | +| nullSensitiveContexts.js:54:1:54:6 | x && y | nullSensitiveContexts.js:54:1:54:7 | x && y; | +| nullSensitiveContexts.js:54:6:54:6 | y | nullSensitiveContexts.js:54:1:54:6 | x && y | +| nullSensitiveContexts.js:55:1:55:1 | x | nullSensitiveContexts.js:55:1:55:6 | x \|\| y | +| nullSensitiveContexts.js:55:1:55:6 | x \|\| y | nullSensitiveContexts.js:55:1:55:7 | x \|\| y; | +| nullSensitiveContexts.js:55:6:55:6 | y | nullSensitiveContexts.js:55:1:55:6 | x \|\| y | +| nullSensitiveContexts.js:56:1:56:2 | !x | nullSensitiveContexts.js:56:1:56:3 | !x; | +| nullSensitiveContexts.js:56:2:56:2 | x | nullSensitiveContexts.js:56:1:56:2 | !x | +| nullSensitiveContexts.js:57:5:57:5 | x | nullSensitiveContexts.js:57:1:57:10 | if (x) { } | +| nullSensitiveContexts.js:58:8:58:8 | x | nullSensitiveContexts.js:58:1:58:13 | while (x) { } | +| nullSensitiveContexts.js:59:8:59:8 | y | nullSensitiveContexts.js:59:1:59:16 | for (; y; z) { } | +| nullSensitiveContexts.js:59:11:59:11 | z | nullSensitiveContexts.js:59:1:59:16 | for (; y; z) { } | +| nullSensitiveContexts.js:60:10:60:10 | x | nullSensitiveContexts.js:60:6:60:10 | let x | +| nullSensitiveContexts.js:60:10:60:10 | x | nullSensitiveContexts.js:60:10:60:10 | x | +| nullSensitiveContexts.js:60:15:60:15 | y | nullSensitiveContexts.js:60:1:60:20 | for (let x in y) { } | | others.js:1:1:1:2 | 23 | others.js:1:1:1:6 | 23, 42 | | others.js:1:1:1:6 | 23, 42 | others.js:1:1:1:7 | 23, 42; | | others.js:1:5:1:6 | 42 | others.js:1:1:1:6 | 23, 42 | @@ -552,6 +673,127 @@ test_getTopLevel | mozextensions.js:1:23:1:23 | x | mozextensions.js:1:1:3:42 | | | mozextensions.js:1:23:1:25 | x+1 | mozextensions.js:1:1:3:42 | | | mozextensions.js:1:25:1:25 | 1 | mozextensions.js:1:1:3:42 | | +| nullSensitiveContexts.js:7:1:7:3 | foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:7:1:7:8 | foo[bar] | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:7:5:7:7 | bar | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:8:1:8:3 | foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:8:1:8:7 | foo.bar | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:8:5:8:7 | bar | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:9:1:9:7 | new Foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:9:5:9:7 | Foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:10:1:10:9 | new Foo() | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:10:5:10:7 | Foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:11:1:11:3 | foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:11:1:11:7 | foo.bar | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:11:1:11:11 | foo.bar = 5 | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:11:5:11:7 | bar | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:11:11:11:11 | 5 | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:12:1:12:3 | foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:12:1:12:8 | foo(bar) | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:12:5:12:7 | bar | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:13:1:13:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:13:1:13:5 | x + y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:13:5:13:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:14:1:14:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:14:1:14:5 | x - y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:14:5:14:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:15:1:15:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:15:1:15:5 | x * y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:15:5:15:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:16:1:16:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:16:1:16:5 | x / y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:16:5:16:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:17:1:17:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:17:1:17:5 | x % y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:18:1:18:2 | +x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:18:2:18:2 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:19:1:19:2 | -x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:20:1:20:3 | ++x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:20:3:20:3 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:21:1:21:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:21:1:21:3 | x++ | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:22:1:22:3 | --x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:22:3:22:3 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:23:1:23:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:23:1:23:3 | x-- | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:24:1:24:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:24:1:24:6 | x += y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:24:6:24:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:25:1:25:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:25:1:25:6 | x -= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:25:6:25:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:26:1:26:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:26:1:26:6 | x *= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:26:6:26:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:27:1:27:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:27:1:27:6 | x /= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:27:6:27:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:28:1:28:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:28:1:28:6 | x %= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:1:29:7 | [x , y] | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:1:29:11 | [x , y] = p | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:2:29:2 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:11:29:11 | p | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:31:1:31:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:31:1:31:5 | x & y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:31:5:31:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:32:1:32:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:32:1:32:5 | x \| y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:32:5:32:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:33:1:33:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:33:1:33:5 | x ^ y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:33:5:33:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:34:1:34:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:34:1:34:6 | x << y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:34:6:34:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:35:1:35:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:35:1:35:6 | x >> y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:35:6:35:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:36:1:36:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:36:1:36:7 | x >>> y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:36:7:36:7 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:37:1:37:2 | ~x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:37:2:37:2 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:38:1:38:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:38:1:38:6 | x &= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:38:6:38:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:39:1:39:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:39:1:39:6 | x \|= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:39:6:39:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:40:1:40:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:40:1:40:6 | x ^= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:40:6:40:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:41:1:41:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:41:1:41:7 | x <<= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:41:7:41:7 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:42:1:42:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:42:1:42:7 | x >>= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:42:7:42:7 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:43:1:43:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:43:1:43:8 | x >>>= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:43:8:43:8 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:44:10:44:10 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:44:10:44:10 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:44:15:44:15 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:54:1:54:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:54:1:54:6 | x && y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:54:6:54:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:55:1:55:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:55:1:55:6 | x \|\| y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:55:6:55:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:56:1:56:2 | !x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:56:2:56:2 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:57:5:57:5 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:58:8:58:8 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:59:8:59:8 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:59:11:59:11 | z | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:60:10:60:10 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:60:10:60:10 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:60:15:60:15 | y | nullSensitiveContexts.js:1:1:61:0 | | | others.js:1:1:1:2 | 23 | others.js:1:1:5:2 | | | others.js:1:1:1:6 | 23, 42 | others.js:1:1:5:2 | | | others.js:1:5:1:6 | 42 | others.js:1:1:5:2 | | @@ -808,6 +1050,80 @@ test_getChild | mozextensions.js:1:11:1:25 | function(x) x+1 | -2 | mozextensions.js:1:23:1:25 | x+1 | | mozextensions.js:1:23:1:25 | x+1 | 0 | mozextensions.js:1:23:1:23 | x | | mozextensions.js:1:23:1:25 | x+1 | 1 | mozextensions.js:1:25:1:25 | 1 | +| nullSensitiveContexts.js:7:1:7:8 | foo[bar] | 0 | nullSensitiveContexts.js:7:1:7:3 | foo | +| nullSensitiveContexts.js:7:1:7:8 | foo[bar] | 1 | nullSensitiveContexts.js:7:5:7:7 | bar | +| nullSensitiveContexts.js:8:1:8:7 | foo.bar | 0 | nullSensitiveContexts.js:8:1:8:3 | foo | +| nullSensitiveContexts.js:8:1:8:7 | foo.bar | 1 | nullSensitiveContexts.js:8:5:8:7 | bar | +| nullSensitiveContexts.js:9:1:9:7 | new Foo | -1 | nullSensitiveContexts.js:9:5:9:7 | Foo | +| nullSensitiveContexts.js:10:1:10:9 | new Foo() | -1 | nullSensitiveContexts.js:10:5:10:7 | Foo | +| nullSensitiveContexts.js:11:1:11:7 | foo.bar | 0 | nullSensitiveContexts.js:11:1:11:3 | foo | +| nullSensitiveContexts.js:11:1:11:7 | foo.bar | 1 | nullSensitiveContexts.js:11:5:11:7 | bar | +| nullSensitiveContexts.js:11:1:11:11 | foo.bar = 5 | 0 | nullSensitiveContexts.js:11:1:11:7 | foo.bar | +| nullSensitiveContexts.js:11:1:11:11 | foo.bar = 5 | 1 | nullSensitiveContexts.js:11:11:11:11 | 5 | +| nullSensitiveContexts.js:12:1:12:8 | foo(bar) | 0 | nullSensitiveContexts.js:12:5:12:7 | bar | +| nullSensitiveContexts.js:12:1:12:8 | foo(bar) | -1 | nullSensitiveContexts.js:12:1:12:3 | foo | +| nullSensitiveContexts.js:13:1:13:5 | x + y | 0 | nullSensitiveContexts.js:13:1:13:1 | x | +| nullSensitiveContexts.js:13:1:13:5 | x + y | 1 | nullSensitiveContexts.js:13:5:13:5 | y | +| nullSensitiveContexts.js:14:1:14:5 | x - y | 0 | nullSensitiveContexts.js:14:1:14:1 | x | +| nullSensitiveContexts.js:14:1:14:5 | x - y | 1 | nullSensitiveContexts.js:14:5:14:5 | y | +| nullSensitiveContexts.js:15:1:15:5 | x * y | 0 | nullSensitiveContexts.js:15:1:15:1 | x | +| nullSensitiveContexts.js:15:1:15:5 | x * y | 1 | nullSensitiveContexts.js:15:5:15:5 | y | +| nullSensitiveContexts.js:16:1:16:5 | x / y | 0 | nullSensitiveContexts.js:16:1:16:1 | x | +| nullSensitiveContexts.js:16:1:16:5 | x / y | 1 | nullSensitiveContexts.js:16:5:16:5 | y | +| nullSensitiveContexts.js:17:1:17:5 | x % y | 0 | nullSensitiveContexts.js:17:1:17:1 | x | +| nullSensitiveContexts.js:17:1:17:5 | x % y | 1 | nullSensitiveContexts.js:17:5:17:5 | y | +| nullSensitiveContexts.js:18:1:18:2 | +x | 0 | nullSensitiveContexts.js:18:2:18:2 | x | +| nullSensitiveContexts.js:19:1:19:2 | -x | 0 | nullSensitiveContexts.js:19:2:19:2 | x | +| nullSensitiveContexts.js:20:1:20:3 | ++x | 0 | nullSensitiveContexts.js:20:3:20:3 | x | +| nullSensitiveContexts.js:21:1:21:3 | x++ | 0 | nullSensitiveContexts.js:21:1:21:1 | x | +| nullSensitiveContexts.js:22:1:22:3 | --x | 0 | nullSensitiveContexts.js:22:3:22:3 | x | +| nullSensitiveContexts.js:23:1:23:3 | x-- | 0 | nullSensitiveContexts.js:23:1:23:1 | x | +| nullSensitiveContexts.js:24:1:24:6 | x += y | 0 | nullSensitiveContexts.js:24:1:24:1 | x | +| nullSensitiveContexts.js:24:1:24:6 | x += y | 1 | nullSensitiveContexts.js:24:6:24:6 | y | +| nullSensitiveContexts.js:25:1:25:6 | x -= y | 0 | nullSensitiveContexts.js:25:1:25:1 | x | +| nullSensitiveContexts.js:25:1:25:6 | x -= y | 1 | nullSensitiveContexts.js:25:6:25:6 | y | +| nullSensitiveContexts.js:26:1:26:6 | x *= y | 0 | nullSensitiveContexts.js:26:1:26:1 | x | +| nullSensitiveContexts.js:26:1:26:6 | x *= y | 1 | nullSensitiveContexts.js:26:6:26:6 | y | +| nullSensitiveContexts.js:27:1:27:6 | x /= y | 0 | nullSensitiveContexts.js:27:1:27:1 | x | +| nullSensitiveContexts.js:27:1:27:6 | x /= y | 1 | nullSensitiveContexts.js:27:6:27:6 | y | +| nullSensitiveContexts.js:28:1:28:6 | x %= y | 0 | nullSensitiveContexts.js:28:1:28:1 | x | +| nullSensitiveContexts.js:28:1:28:6 | x %= y | 1 | nullSensitiveContexts.js:28:6:28:6 | y | +| nullSensitiveContexts.js:29:1:29:7 | [x , y] | 0 | nullSensitiveContexts.js:29:2:29:2 | x | +| nullSensitiveContexts.js:29:1:29:7 | [x , y] | 1 | nullSensitiveContexts.js:29:6:29:6 | y | +| nullSensitiveContexts.js:29:1:29:11 | [x , y] = p | 0 | nullSensitiveContexts.js:29:1:29:7 | [x , y] | +| nullSensitiveContexts.js:29:1:29:11 | [x , y] = p | 1 | nullSensitiveContexts.js:29:11:29:11 | p | +| nullSensitiveContexts.js:31:1:31:5 | x & y | 0 | nullSensitiveContexts.js:31:1:31:1 | x | +| nullSensitiveContexts.js:31:1:31:5 | x & y | 1 | nullSensitiveContexts.js:31:5:31:5 | y | +| nullSensitiveContexts.js:32:1:32:5 | x \| y | 0 | nullSensitiveContexts.js:32:1:32:1 | x | +| nullSensitiveContexts.js:32:1:32:5 | x \| y | 1 | nullSensitiveContexts.js:32:5:32:5 | y | +| nullSensitiveContexts.js:33:1:33:5 | x ^ y | 0 | nullSensitiveContexts.js:33:1:33:1 | x | +| nullSensitiveContexts.js:33:1:33:5 | x ^ y | 1 | nullSensitiveContexts.js:33:5:33:5 | y | +| nullSensitiveContexts.js:34:1:34:6 | x << y | 0 | nullSensitiveContexts.js:34:1:34:1 | x | +| nullSensitiveContexts.js:34:1:34:6 | x << y | 1 | nullSensitiveContexts.js:34:6:34:6 | y | +| nullSensitiveContexts.js:35:1:35:6 | x >> y | 0 | nullSensitiveContexts.js:35:1:35:1 | x | +| nullSensitiveContexts.js:35:1:35:6 | x >> y | 1 | nullSensitiveContexts.js:35:6:35:6 | y | +| nullSensitiveContexts.js:36:1:36:7 | x >>> y | 0 | nullSensitiveContexts.js:36:1:36:1 | x | +| nullSensitiveContexts.js:36:1:36:7 | x >>> y | 1 | nullSensitiveContexts.js:36:7:36:7 | y | +| nullSensitiveContexts.js:37:1:37:2 | ~x | 0 | nullSensitiveContexts.js:37:2:37:2 | x | +| nullSensitiveContexts.js:38:1:38:6 | x &= y | 0 | nullSensitiveContexts.js:38:1:38:1 | x | +| nullSensitiveContexts.js:38:1:38:6 | x &= y | 1 | nullSensitiveContexts.js:38:6:38:6 | y | +| nullSensitiveContexts.js:39:1:39:6 | x \|= y | 0 | nullSensitiveContexts.js:39:1:39:1 | x | +| nullSensitiveContexts.js:39:1:39:6 | x \|= y | 1 | nullSensitiveContexts.js:39:6:39:6 | y | +| nullSensitiveContexts.js:40:1:40:6 | x ^= y | 0 | nullSensitiveContexts.js:40:1:40:1 | x | +| nullSensitiveContexts.js:40:1:40:6 | x ^= y | 1 | nullSensitiveContexts.js:40:6:40:6 | y | +| nullSensitiveContexts.js:41:1:41:7 | x <<= y | 0 | nullSensitiveContexts.js:41:1:41:1 | x | +| nullSensitiveContexts.js:41:1:41:7 | x <<= y | 1 | nullSensitiveContexts.js:41:7:41:7 | y | +| nullSensitiveContexts.js:42:1:42:7 | x >>= y | 0 | nullSensitiveContexts.js:42:1:42:1 | x | +| nullSensitiveContexts.js:42:1:42:7 | x >>= y | 1 | nullSensitiveContexts.js:42:7:42:7 | y | +| nullSensitiveContexts.js:43:1:43:8 | x >>>= y | 0 | nullSensitiveContexts.js:43:1:43:1 | x | +| nullSensitiveContexts.js:43:1:43:8 | x >>>= y | 1 | nullSensitiveContexts.js:43:8:43:8 | y | +| nullSensitiveContexts.js:44:10:44:10 | x | 0 | nullSensitiveContexts.js:44:10:44:10 | x | +| nullSensitiveContexts.js:54:1:54:6 | x && y | 0 | nullSensitiveContexts.js:54:1:54:1 | x | +| nullSensitiveContexts.js:54:1:54:6 | x && y | 1 | nullSensitiveContexts.js:54:6:54:6 | y | +| nullSensitiveContexts.js:55:1:55:6 | x \|\| y | 0 | nullSensitiveContexts.js:55:1:55:1 | x | +| nullSensitiveContexts.js:55:1:55:6 | x \|\| y | 1 | nullSensitiveContexts.js:55:6:55:6 | y | +| nullSensitiveContexts.js:56:1:56:2 | !x | 0 | nullSensitiveContexts.js:56:2:56:2 | x | +| nullSensitiveContexts.js:60:10:60:10 | x | 0 | nullSensitiveContexts.js:60:10:60:10 | x | | others.js:1:1:1:6 | 23, 42 | 0 | others.js:1:1:1:2 | 23 | | others.js:1:1:1:6 | 23, 42 | 1 | others.js:1:5:1:6 | 42 | | others.js:2:1:2:10 | 23, 42, 56 | 0 | others.js:2:1:2:2 | 23 | @@ -1050,6 +1366,105 @@ test_isPure | mozextensions.js:1:23:1:23 | x | | mozextensions.js:1:23:1:25 | x+1 | | mozextensions.js:1:25:1:25 | 1 | +| nullSensitiveContexts.js:7:1:7:3 | foo | +| nullSensitiveContexts.js:7:1:7:8 | foo[bar] | +| nullSensitiveContexts.js:7:5:7:7 | bar | +| nullSensitiveContexts.js:8:1:8:3 | foo | +| nullSensitiveContexts.js:8:1:8:7 | foo.bar | +| nullSensitiveContexts.js:8:5:8:7 | bar | +| nullSensitiveContexts.js:9:5:9:7 | Foo | +| nullSensitiveContexts.js:10:5:10:7 | Foo | +| nullSensitiveContexts.js:11:1:11:3 | foo | +| nullSensitiveContexts.js:11:1:11:7 | foo.bar | +| nullSensitiveContexts.js:11:5:11:7 | bar | +| nullSensitiveContexts.js:11:11:11:11 | 5 | +| nullSensitiveContexts.js:12:1:12:3 | foo | +| nullSensitiveContexts.js:12:5:12:7 | bar | +| nullSensitiveContexts.js:13:1:13:1 | x | +| nullSensitiveContexts.js:13:1:13:5 | x + y | +| nullSensitiveContexts.js:13:5:13:5 | y | +| nullSensitiveContexts.js:14:1:14:1 | x | +| nullSensitiveContexts.js:14:1:14:5 | x - y | +| nullSensitiveContexts.js:14:5:14:5 | y | +| nullSensitiveContexts.js:15:1:15:1 | x | +| nullSensitiveContexts.js:15:1:15:5 | x * y | +| nullSensitiveContexts.js:15:5:15:5 | y | +| nullSensitiveContexts.js:16:1:16:1 | x | +| nullSensitiveContexts.js:16:1:16:5 | x / y | +| nullSensitiveContexts.js:16:5:16:5 | y | +| nullSensitiveContexts.js:17:1:17:1 | x | +| nullSensitiveContexts.js:17:1:17:5 | x % y | +| nullSensitiveContexts.js:17:5:17:5 | y | +| nullSensitiveContexts.js:18:1:18:2 | +x | +| nullSensitiveContexts.js:18:2:18:2 | x | +| nullSensitiveContexts.js:19:1:19:2 | -x | +| nullSensitiveContexts.js:19:2:19:2 | x | +| nullSensitiveContexts.js:20:3:20:3 | x | +| nullSensitiveContexts.js:21:1:21:1 | x | +| nullSensitiveContexts.js:22:3:22:3 | x | +| nullSensitiveContexts.js:23:1:23:1 | x | +| nullSensitiveContexts.js:24:1:24:1 | x | +| nullSensitiveContexts.js:24:6:24:6 | y | +| nullSensitiveContexts.js:25:1:25:1 | x | +| nullSensitiveContexts.js:25:6:25:6 | y | +| nullSensitiveContexts.js:26:1:26:1 | x | +| nullSensitiveContexts.js:26:6:26:6 | y | +| nullSensitiveContexts.js:27:1:27:1 | x | +| nullSensitiveContexts.js:27:6:27:6 | y | +| nullSensitiveContexts.js:28:1:28:1 | x | +| nullSensitiveContexts.js:28:6:28:6 | y | +| nullSensitiveContexts.js:29:1:29:7 | [x , y] | +| nullSensitiveContexts.js:29:2:29:2 | x | +| nullSensitiveContexts.js:29:6:29:6 | y | +| nullSensitiveContexts.js:29:11:29:11 | p | +| nullSensitiveContexts.js:31:1:31:1 | x | +| nullSensitiveContexts.js:31:1:31:5 | x & y | +| nullSensitiveContexts.js:31:5:31:5 | y | +| nullSensitiveContexts.js:32:1:32:1 | x | +| nullSensitiveContexts.js:32:1:32:5 | x \| y | +| nullSensitiveContexts.js:32:5:32:5 | y | +| nullSensitiveContexts.js:33:1:33:1 | x | +| nullSensitiveContexts.js:33:1:33:5 | x ^ y | +| nullSensitiveContexts.js:33:5:33:5 | y | +| nullSensitiveContexts.js:34:1:34:1 | x | +| nullSensitiveContexts.js:34:1:34:6 | x << y | +| nullSensitiveContexts.js:34:6:34:6 | y | +| nullSensitiveContexts.js:35:1:35:1 | x | +| nullSensitiveContexts.js:35:1:35:6 | x >> y | +| nullSensitiveContexts.js:35:6:35:6 | y | +| nullSensitiveContexts.js:36:1:36:1 | x | +| nullSensitiveContexts.js:36:1:36:7 | x >>> y | +| nullSensitiveContexts.js:36:7:36:7 | y | +| nullSensitiveContexts.js:37:1:37:2 | ~x | +| nullSensitiveContexts.js:37:2:37:2 | x | +| nullSensitiveContexts.js:38:1:38:1 | x | +| nullSensitiveContexts.js:38:6:38:6 | y | +| nullSensitiveContexts.js:39:1:39:1 | x | +| nullSensitiveContexts.js:39:6:39:6 | y | +| nullSensitiveContexts.js:40:1:40:1 | x | +| nullSensitiveContexts.js:40:6:40:6 | y | +| nullSensitiveContexts.js:41:1:41:1 | x | +| nullSensitiveContexts.js:41:7:41:7 | y | +| nullSensitiveContexts.js:42:1:42:1 | x | +| nullSensitiveContexts.js:42:7:42:7 | y | +| nullSensitiveContexts.js:43:1:43:1 | x | +| nullSensitiveContexts.js:43:8:43:8 | y | +| nullSensitiveContexts.js:44:10:44:10 | x | +| nullSensitiveContexts.js:44:15:44:15 | y | +| nullSensitiveContexts.js:54:1:54:1 | x | +| nullSensitiveContexts.js:54:1:54:6 | x && y | +| nullSensitiveContexts.js:54:6:54:6 | y | +| nullSensitiveContexts.js:55:1:55:1 | x | +| nullSensitiveContexts.js:55:1:55:6 | x \|\| y | +| nullSensitiveContexts.js:55:6:55:6 | y | +| nullSensitiveContexts.js:56:1:56:2 | !x | +| nullSensitiveContexts.js:56:2:56:2 | x | +| nullSensitiveContexts.js:57:5:57:5 | x | +| nullSensitiveContexts.js:58:8:58:8 | x | +| nullSensitiveContexts.js:59:8:59:8 | y | +| nullSensitiveContexts.js:59:11:59:11 | z | +| nullSensitiveContexts.js:60:10:60:10 | x | +| nullSensitiveContexts.js:60:15:60:15 | y | | others.js:1:1:1:2 | 23 | | others.js:1:1:1:6 | 23, 42 | | others.js:1:5:1:6 | 42 | @@ -1460,6 +1875,127 @@ test_getContainer | mozextensions.js:1:23:1:23 | x | mozextensions.js:1:11:1:25 | function(x) x+1 | | mozextensions.js:1:23:1:25 | x+1 | mozextensions.js:1:11:1:25 | function(x) x+1 | | mozextensions.js:1:25:1:25 | 1 | mozextensions.js:1:11:1:25 | function(x) x+1 | +| nullSensitiveContexts.js:7:1:7:3 | foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:7:1:7:8 | foo[bar] | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:7:5:7:7 | bar | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:8:1:8:3 | foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:8:1:8:7 | foo.bar | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:8:5:8:7 | bar | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:9:1:9:7 | new Foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:9:5:9:7 | Foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:10:1:10:9 | new Foo() | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:10:5:10:7 | Foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:11:1:11:3 | foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:11:1:11:7 | foo.bar | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:11:1:11:11 | foo.bar = 5 | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:11:5:11:7 | bar | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:11:11:11:11 | 5 | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:12:1:12:3 | foo | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:12:1:12:8 | foo(bar) | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:12:5:12:7 | bar | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:13:1:13:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:13:1:13:5 | x + y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:13:5:13:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:14:1:14:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:14:1:14:5 | x - y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:14:5:14:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:15:1:15:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:15:1:15:5 | x * y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:15:5:15:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:16:1:16:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:16:1:16:5 | x / y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:16:5:16:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:17:1:17:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:17:1:17:5 | x % y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:18:1:18:2 | +x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:18:2:18:2 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:19:1:19:2 | -x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:20:1:20:3 | ++x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:20:3:20:3 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:21:1:21:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:21:1:21:3 | x++ | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:22:1:22:3 | --x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:22:3:22:3 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:23:1:23:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:23:1:23:3 | x-- | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:24:1:24:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:24:1:24:6 | x += y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:24:6:24:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:25:1:25:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:25:1:25:6 | x -= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:25:6:25:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:26:1:26:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:26:1:26:6 | x *= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:26:6:26:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:27:1:27:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:27:1:27:6 | x /= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:27:6:27:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:28:1:28:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:28:1:28:6 | x %= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:1:29:7 | [x , y] | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:1:29:11 | [x , y] = p | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:2:29:2 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:11:29:11 | p | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:31:1:31:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:31:1:31:5 | x & y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:31:5:31:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:32:1:32:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:32:1:32:5 | x \| y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:32:5:32:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:33:1:33:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:33:1:33:5 | x ^ y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:33:5:33:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:34:1:34:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:34:1:34:6 | x << y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:34:6:34:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:35:1:35:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:35:1:35:6 | x >> y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:35:6:35:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:36:1:36:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:36:1:36:7 | x >>> y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:36:7:36:7 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:37:1:37:2 | ~x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:37:2:37:2 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:38:1:38:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:38:1:38:6 | x &= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:38:6:38:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:39:1:39:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:39:1:39:6 | x \|= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:39:6:39:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:40:1:40:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:40:1:40:6 | x ^= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:40:6:40:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:41:1:41:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:41:1:41:7 | x <<= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:41:7:41:7 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:42:1:42:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:42:1:42:7 | x >>= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:42:7:42:7 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:43:1:43:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:43:1:43:8 | x >>>= y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:43:8:43:8 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:44:10:44:10 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:44:10:44:10 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:44:15:44:15 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:54:1:54:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:54:1:54:6 | x && y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:54:6:54:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:55:1:55:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:55:1:55:6 | x \|\| y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:55:6:55:6 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:56:1:56:2 | !x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:56:2:56:2 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:57:5:57:5 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:58:8:58:8 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:59:8:59:8 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:59:11:59:11 | z | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:60:10:60:10 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:60:10:60:10 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:60:15:60:15 | y | nullSensitiveContexts.js:1:1:61:0 | | | others.js:1:1:1:2 | 23 | others.js:1:1:5:2 | | | others.js:1:1:1:6 | 23, 42 | others.js:1:1:5:2 | | | others.js:1:5:1:6 | 42 | others.js:1:1:5:2 | | @@ -1763,6 +2299,127 @@ test_getEnclosingStmt | mozextensions.js:1:1:1:26 | array.m ... x) x+1) | mozextensions.js:1:1:1:27 | array.m ... ) x+1); | | mozextensions.js:1:7:1:9 | map | mozextensions.js:1:1:1:27 | array.m ... ) x+1); | | mozextensions.js:1:11:1:25 | function(x) x+1 | mozextensions.js:1:1:1:27 | array.m ... ) x+1); | +| nullSensitiveContexts.js:7:1:7:3 | foo | nullSensitiveContexts.js:7:1:7:9 | foo[bar]; | +| nullSensitiveContexts.js:7:1:7:8 | foo[bar] | nullSensitiveContexts.js:7:1:7:9 | foo[bar]; | +| nullSensitiveContexts.js:7:5:7:7 | bar | nullSensitiveContexts.js:7:1:7:9 | foo[bar]; | +| nullSensitiveContexts.js:8:1:8:3 | foo | nullSensitiveContexts.js:8:1:8:8 | foo.bar; | +| nullSensitiveContexts.js:8:1:8:7 | foo.bar | nullSensitiveContexts.js:8:1:8:8 | foo.bar; | +| nullSensitiveContexts.js:8:5:8:7 | bar | nullSensitiveContexts.js:8:1:8:8 | foo.bar; | +| nullSensitiveContexts.js:9:1:9:7 | new Foo | nullSensitiveContexts.js:9:1:9:8 | new Foo; | +| nullSensitiveContexts.js:9:5:9:7 | Foo | nullSensitiveContexts.js:9:1:9:8 | new Foo; | +| nullSensitiveContexts.js:10:1:10:9 | new Foo() | nullSensitiveContexts.js:10:1:10:10 | new Foo(); | +| nullSensitiveContexts.js:10:5:10:7 | Foo | nullSensitiveContexts.js:10:1:10:10 | new Foo(); | +| nullSensitiveContexts.js:11:1:11:3 | foo | nullSensitiveContexts.js:11:1:11:12 | foo.bar = 5; | +| nullSensitiveContexts.js:11:1:11:7 | foo.bar | nullSensitiveContexts.js:11:1:11:12 | foo.bar = 5; | +| nullSensitiveContexts.js:11:1:11:11 | foo.bar = 5 | nullSensitiveContexts.js:11:1:11:12 | foo.bar = 5; | +| nullSensitiveContexts.js:11:5:11:7 | bar | nullSensitiveContexts.js:11:1:11:12 | foo.bar = 5; | +| nullSensitiveContexts.js:11:11:11:11 | 5 | nullSensitiveContexts.js:11:1:11:12 | foo.bar = 5; | +| nullSensitiveContexts.js:12:1:12:3 | foo | nullSensitiveContexts.js:12:1:12:9 | foo(bar); | +| nullSensitiveContexts.js:12:1:12:8 | foo(bar) | nullSensitiveContexts.js:12:1:12:9 | foo(bar); | +| nullSensitiveContexts.js:12:5:12:7 | bar | nullSensitiveContexts.js:12:1:12:9 | foo(bar); | +| nullSensitiveContexts.js:13:1:13:1 | x | nullSensitiveContexts.js:13:1:13:6 | x + y; | +| nullSensitiveContexts.js:13:1:13:5 | x + y | nullSensitiveContexts.js:13:1:13:6 | x + y; | +| nullSensitiveContexts.js:13:5:13:5 | y | nullSensitiveContexts.js:13:1:13:6 | x + y; | +| nullSensitiveContexts.js:14:1:14:1 | x | nullSensitiveContexts.js:14:1:14:6 | x - y; | +| nullSensitiveContexts.js:14:1:14:5 | x - y | nullSensitiveContexts.js:14:1:14:6 | x - y; | +| nullSensitiveContexts.js:14:5:14:5 | y | nullSensitiveContexts.js:14:1:14:6 | x - y; | +| nullSensitiveContexts.js:15:1:15:1 | x | nullSensitiveContexts.js:15:1:15:6 | x * y; | +| nullSensitiveContexts.js:15:1:15:5 | x * y | nullSensitiveContexts.js:15:1:15:6 | x * y; | +| nullSensitiveContexts.js:15:5:15:5 | y | nullSensitiveContexts.js:15:1:15:6 | x * y; | +| nullSensitiveContexts.js:16:1:16:1 | x | nullSensitiveContexts.js:16:1:16:6 | x / y; | +| nullSensitiveContexts.js:16:1:16:5 | x / y | nullSensitiveContexts.js:16:1:16:6 | x / y; | +| nullSensitiveContexts.js:16:5:16:5 | y | nullSensitiveContexts.js:16:1:16:6 | x / y; | +| nullSensitiveContexts.js:17:1:17:1 | x | nullSensitiveContexts.js:17:1:17:6 | x % y; | +| nullSensitiveContexts.js:17:1:17:5 | x % y | nullSensitiveContexts.js:17:1:17:6 | x % y; | +| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:17:1:17:6 | x % y; | +| nullSensitiveContexts.js:18:1:18:2 | +x | nullSensitiveContexts.js:18:1:18:3 | +x; | +| nullSensitiveContexts.js:18:2:18:2 | x | nullSensitiveContexts.js:18:1:18:3 | +x; | +| nullSensitiveContexts.js:19:1:19:2 | -x | nullSensitiveContexts.js:19:1:19:3 | -x; | +| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:19:1:19:3 | -x; | +| nullSensitiveContexts.js:20:1:20:3 | ++x | nullSensitiveContexts.js:20:1:20:4 | ++x; | +| nullSensitiveContexts.js:20:3:20:3 | x | nullSensitiveContexts.js:20:1:20:4 | ++x; | +| nullSensitiveContexts.js:21:1:21:1 | x | nullSensitiveContexts.js:21:1:21:4 | x++; | +| nullSensitiveContexts.js:21:1:21:3 | x++ | nullSensitiveContexts.js:21:1:21:4 | x++; | +| nullSensitiveContexts.js:22:1:22:3 | --x | nullSensitiveContexts.js:22:1:22:4 | --x; | +| nullSensitiveContexts.js:22:3:22:3 | x | nullSensitiveContexts.js:22:1:22:4 | --x; | +| nullSensitiveContexts.js:23:1:23:1 | x | nullSensitiveContexts.js:23:1:23:4 | x--; | +| nullSensitiveContexts.js:23:1:23:3 | x-- | nullSensitiveContexts.js:23:1:23:4 | x--; | +| nullSensitiveContexts.js:24:1:24:1 | x | nullSensitiveContexts.js:24:1:24:7 | x += y; | +| nullSensitiveContexts.js:24:1:24:6 | x += y | nullSensitiveContexts.js:24:1:24:7 | x += y; | +| nullSensitiveContexts.js:24:6:24:6 | y | nullSensitiveContexts.js:24:1:24:7 | x += y; | +| nullSensitiveContexts.js:25:1:25:1 | x | nullSensitiveContexts.js:25:1:25:7 | x -= y; | +| nullSensitiveContexts.js:25:1:25:6 | x -= y | nullSensitiveContexts.js:25:1:25:7 | x -= y; | +| nullSensitiveContexts.js:25:6:25:6 | y | nullSensitiveContexts.js:25:1:25:7 | x -= y; | +| nullSensitiveContexts.js:26:1:26:1 | x | nullSensitiveContexts.js:26:1:26:7 | x *= y; | +| nullSensitiveContexts.js:26:1:26:6 | x *= y | nullSensitiveContexts.js:26:1:26:7 | x *= y; | +| nullSensitiveContexts.js:26:6:26:6 | y | nullSensitiveContexts.js:26:1:26:7 | x *= y; | +| nullSensitiveContexts.js:27:1:27:1 | x | nullSensitiveContexts.js:27:1:27:7 | x /= y; | +| nullSensitiveContexts.js:27:1:27:6 | x /= y | nullSensitiveContexts.js:27:1:27:7 | x /= y; | +| nullSensitiveContexts.js:27:6:27:6 | y | nullSensitiveContexts.js:27:1:27:7 | x /= y; | +| nullSensitiveContexts.js:28:1:28:1 | x | nullSensitiveContexts.js:28:1:28:7 | x %= y; | +| nullSensitiveContexts.js:28:1:28:6 | x %= y | nullSensitiveContexts.js:28:1:28:7 | x %= y; | +| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:1:28:7 | x %= y; | +| nullSensitiveContexts.js:29:1:29:7 | [x , y] | nullSensitiveContexts.js:29:1:29:12 | [x , y] = p; | +| nullSensitiveContexts.js:29:1:29:11 | [x , y] = p | nullSensitiveContexts.js:29:1:29:12 | [x , y] = p; | +| nullSensitiveContexts.js:29:2:29:2 | x | nullSensitiveContexts.js:29:1:29:12 | [x , y] = p; | +| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:29:1:29:12 | [x , y] = p; | +| nullSensitiveContexts.js:29:11:29:11 | p | nullSensitiveContexts.js:29:1:29:12 | [x , y] = p; | +| nullSensitiveContexts.js:31:1:31:1 | x | nullSensitiveContexts.js:31:1:31:6 | x & y; | +| nullSensitiveContexts.js:31:1:31:5 | x & y | nullSensitiveContexts.js:31:1:31:6 | x & y; | +| nullSensitiveContexts.js:31:5:31:5 | y | nullSensitiveContexts.js:31:1:31:6 | x & y; | +| nullSensitiveContexts.js:32:1:32:1 | x | nullSensitiveContexts.js:32:1:32:6 | x \| y; | +| nullSensitiveContexts.js:32:1:32:5 | x \| y | nullSensitiveContexts.js:32:1:32:6 | x \| y; | +| nullSensitiveContexts.js:32:5:32:5 | y | nullSensitiveContexts.js:32:1:32:6 | x \| y; | +| nullSensitiveContexts.js:33:1:33:1 | x | nullSensitiveContexts.js:33:1:33:6 | x ^ y; | +| nullSensitiveContexts.js:33:1:33:5 | x ^ y | nullSensitiveContexts.js:33:1:33:6 | x ^ y; | +| nullSensitiveContexts.js:33:5:33:5 | y | nullSensitiveContexts.js:33:1:33:6 | x ^ y; | +| nullSensitiveContexts.js:34:1:34:1 | x | nullSensitiveContexts.js:34:1:34:7 | x << y; | +| nullSensitiveContexts.js:34:1:34:6 | x << y | nullSensitiveContexts.js:34:1:34:7 | x << y; | +| nullSensitiveContexts.js:34:6:34:6 | y | nullSensitiveContexts.js:34:1:34:7 | x << y; | +| nullSensitiveContexts.js:35:1:35:1 | x | nullSensitiveContexts.js:35:1:35:7 | x >> y; | +| nullSensitiveContexts.js:35:1:35:6 | x >> y | nullSensitiveContexts.js:35:1:35:7 | x >> y; | +| nullSensitiveContexts.js:35:6:35:6 | y | nullSensitiveContexts.js:35:1:35:7 | x >> y; | +| nullSensitiveContexts.js:36:1:36:1 | x | nullSensitiveContexts.js:36:1:36:8 | x >>> y; | +| nullSensitiveContexts.js:36:1:36:7 | x >>> y | nullSensitiveContexts.js:36:1:36:8 | x >>> y; | +| nullSensitiveContexts.js:36:7:36:7 | y | nullSensitiveContexts.js:36:1:36:8 | x >>> y; | +| nullSensitiveContexts.js:37:1:37:2 | ~x | nullSensitiveContexts.js:37:1:37:3 | ~x; | +| nullSensitiveContexts.js:37:2:37:2 | x | nullSensitiveContexts.js:37:1:37:3 | ~x; | +| nullSensitiveContexts.js:38:1:38:1 | x | nullSensitiveContexts.js:38:1:38:7 | x &= y; | +| nullSensitiveContexts.js:38:1:38:6 | x &= y | nullSensitiveContexts.js:38:1:38:7 | x &= y; | +| nullSensitiveContexts.js:38:6:38:6 | y | nullSensitiveContexts.js:38:1:38:7 | x &= y; | +| nullSensitiveContexts.js:39:1:39:1 | x | nullSensitiveContexts.js:39:1:39:7 | x \|= y; | +| nullSensitiveContexts.js:39:1:39:6 | x \|= y | nullSensitiveContexts.js:39:1:39:7 | x \|= y; | +| nullSensitiveContexts.js:39:6:39:6 | y | nullSensitiveContexts.js:39:1:39:7 | x \|= y; | +| nullSensitiveContexts.js:40:1:40:1 | x | nullSensitiveContexts.js:40:1:40:7 | x ^= y; | +| nullSensitiveContexts.js:40:1:40:6 | x ^= y | nullSensitiveContexts.js:40:1:40:7 | x ^= y; | +| nullSensitiveContexts.js:40:6:40:6 | y | nullSensitiveContexts.js:40:1:40:7 | x ^= y; | +| nullSensitiveContexts.js:41:1:41:1 | x | nullSensitiveContexts.js:41:1:41:8 | x <<= y; | +| nullSensitiveContexts.js:41:1:41:7 | x <<= y | nullSensitiveContexts.js:41:1:41:8 | x <<= y; | +| nullSensitiveContexts.js:41:7:41:7 | y | nullSensitiveContexts.js:41:1:41:8 | x <<= y; | +| nullSensitiveContexts.js:42:1:42:1 | x | nullSensitiveContexts.js:42:1:42:8 | x >>= y; | +| nullSensitiveContexts.js:42:1:42:7 | x >>= y | nullSensitiveContexts.js:42:1:42:8 | x >>= y; | +| nullSensitiveContexts.js:42:7:42:7 | y | nullSensitiveContexts.js:42:1:42:8 | x >>= y; | +| nullSensitiveContexts.js:43:1:43:1 | x | nullSensitiveContexts.js:43:1:43:9 | x >>>= y; | +| nullSensitiveContexts.js:43:1:43:8 | x >>>= y | nullSensitiveContexts.js:43:1:43:9 | x >>>= y; | +| nullSensitiveContexts.js:43:8:43:8 | y | nullSensitiveContexts.js:43:1:43:9 | x >>>= y; | +| nullSensitiveContexts.js:44:10:44:10 | x | nullSensitiveContexts.js:44:6:44:10 | let x | +| nullSensitiveContexts.js:44:10:44:10 | x | nullSensitiveContexts.js:44:6:44:10 | let x | +| nullSensitiveContexts.js:44:15:44:15 | y | nullSensitiveContexts.js:44:1:44:20 | for (let x of y) { } | +| nullSensitiveContexts.js:54:1:54:1 | x | nullSensitiveContexts.js:54:1:54:7 | x && y; | +| nullSensitiveContexts.js:54:1:54:6 | x && y | nullSensitiveContexts.js:54:1:54:7 | x && y; | +| nullSensitiveContexts.js:54:6:54:6 | y | nullSensitiveContexts.js:54:1:54:7 | x && y; | +| nullSensitiveContexts.js:55:1:55:1 | x | nullSensitiveContexts.js:55:1:55:7 | x \|\| y; | +| nullSensitiveContexts.js:55:1:55:6 | x \|\| y | nullSensitiveContexts.js:55:1:55:7 | x \|\| y; | +| nullSensitiveContexts.js:55:6:55:6 | y | nullSensitiveContexts.js:55:1:55:7 | x \|\| y; | +| nullSensitiveContexts.js:56:1:56:2 | !x | nullSensitiveContexts.js:56:1:56:3 | !x; | +| nullSensitiveContexts.js:56:2:56:2 | x | nullSensitiveContexts.js:56:1:56:3 | !x; | +| nullSensitiveContexts.js:57:5:57:5 | x | nullSensitiveContexts.js:57:1:57:10 | if (x) { } | +| nullSensitiveContexts.js:58:8:58:8 | x | nullSensitiveContexts.js:58:1:58:13 | while (x) { } | +| nullSensitiveContexts.js:59:8:59:8 | y | nullSensitiveContexts.js:59:1:59:16 | for (; y; z) { } | +| nullSensitiveContexts.js:59:11:59:11 | z | nullSensitiveContexts.js:59:1:59:16 | for (; y; z) { } | +| nullSensitiveContexts.js:60:10:60:10 | x | nullSensitiveContexts.js:60:6:60:10 | let x | +| nullSensitiveContexts.js:60:10:60:10 | x | nullSensitiveContexts.js:60:6:60:10 | let x | +| nullSensitiveContexts.js:60:15:60:15 | y | nullSensitiveContexts.js:60:1:60:20 | for (let x in y) { } | | others.js:1:1:1:2 | 23 | others.js:1:1:1:7 | 23, 42; | | others.js:1:1:1:6 | 23, 42 | others.js:1:1:1:7 | 23, 42; | | others.js:1:5:1:6 | 42 | others.js:1:1:1:7 | 23, 42; | @@ -1872,3 +2529,168 @@ test_getEnclosingStmt | update.js:3:3:3:3 | b | update.js:3:1:3:4 | --b; | | update.js:4:1:4:1 | b | update.js:4:1:4:4 | b--; | | update.js:4:1:4:3 | b-- | update.js:4:1:4:4 | b--; | +test_inNullSensitiveContext +| assignment.js:2:1:2:1 | a | +| assignment.js:2:6:2:7 | 19 | +| assignment.js:3:1:3:1 | a | +| assignment.js:3:6:3:6 | 9 | +| assignment.js:4:1:4:1 | a | +| assignment.js:4:6:4:6 | b | +| assignment.js:5:1:5:1 | a | +| assignment.js:5:6:5:6 | 2 | +| assignment.js:6:1:6:1 | a | +| assignment.js:6:6:6:6 | 2 | +| assignment.js:7:1:7:1 | a | +| assignment.js:7:7:7:7 | 8 | +| assignment.js:8:1:8:1 | a | +| assignment.js:8:7:8:7 | 7 | +| assignment.js:9:1:9:1 | a | +| assignment.js:9:8:9:8 | 2 | +| assignment.js:10:1:10:1 | a | +| assignment.js:10:6:10:6 | 2 | +| assignment.js:11:1:11:1 | a | +| assignment.js:11:6:11:6 | 1 | +| assignment.js:12:1:12:1 | a | +| assignment.js:12:6:12:6 | 3 | +| binary.js:1:1:1:1 | 1 | +| binary.js:1:6:1:6 | 2 | +| binary.js:2:1:2:1 | 2 | +| binary.js:2:6:2:6 | 1 | +| binary.js:3:1:3:1 | 2 | +| binary.js:3:7:3:7 | 1 | +| binary.js:4:1:4:2 | 23 | +| binary.js:4:6:4:7 | 19 | +| binary.js:5:1:5:2 | 42 | +| binary.js:5:6:5:7 | 19 | +| binary.js:6:1:6:1 | 2 | +| binary.js:6:5:6:5 | 3 | +| binary.js:7:1:7:1 | 8 | +| binary.js:7:5:7:5 | 5 | +| binary.js:8:1:8:1 | 2 | +| binary.js:8:5:8:5 | 1 | +| binary.js:9:1:9:1 | 2 | +| binary.js:9:5:9:5 | 3 | +| binary.js:10:1:10:1 | 2 | +| binary.js:10:5:10:5 | 3 | +| binary.js:11:1:11:1 | 2 | +| binary.js:11:5:11:5 | 3 | +| binary.js:12:1:12:11 | 'prototype' | +| binary.js:12:16:12:21 | Object | +| binary.js:13:1:13:2 | [] | +| binary.js:13:15:13:19 | Array | +| comparison.js:5:1:5:1 | 1 | +| comparison.js:5:5:5:5 | 2 | +| comparison.js:6:1:6:1 | 1 | +| comparison.js:6:6:6:6 | 2 | +| comparison.js:7:1:7:1 | 2 | +| comparison.js:7:5:7:5 | 1 | +| comparison.js:8:1:8:1 | 2 | +| comparison.js:8:6:8:6 | 1 | +| es2015.js:1:1:1:18 | ["a", "ab", "abc"] | +| es2015.js:1:1:1:22 | ["a", " ... c"].map | +| es2015.js:1:29:1:29 | s | +| es2015.js:2:1:2:11 | setInterval | +| es2015.js:2:21:2:23 | cnt | +| es2015.js:3:1:3:10 | setTimeout | +| es2015.js:3:20:3:24 | alert | +| es2015.js:5:8:5:9 | as | +| es2015.js:6:5:6:9 | Array | +| es2015.js:6:14:6:17 | elts | +| es2015.js:13:3:13:9 | console | +| es2015.js:13:3:13:13 | console.log | +| es2015.js:23:8:23:8 | n | +| es2015.js:23:8:23:10 | n-- | +| es2015.js:23:12:23:12 | 0 | +| es2015.js:25:9:25:11 | foo | +| es2015.js:28:19:28:19 | x | +| es2015.js:28:21:28:22 | 19 | +| functions.js:4:3:6:4 | (functi ... f;\\n\\t\\t}) | +| functions.js:4:4:6:3 | functio ... _f;\\n\\t\\t} | +| legacyletexpr.js:1:1:1:7 | console | +| legacyletexpr.js:1:1:1:11 | console.log | +| legacyletexpr.js:1:34:1:34 | x | +| legacyletexpr.js:1:38:1:38 | y | +| mozextensions.js:1:1:1:5 | array | +| mozextensions.js:1:1:1:9 | array.map | +| mozextensions.js:1:23:1:23 | x | +| mozextensions.js:1:25:1:25 | 1 | +| nullSensitiveContexts.js:7:1:7:3 | foo | +| nullSensitiveContexts.js:7:5:7:7 | bar | +| nullSensitiveContexts.js:8:1:8:3 | foo | +| nullSensitiveContexts.js:9:5:9:7 | Foo | +| nullSensitiveContexts.js:10:5:10:7 | Foo | +| nullSensitiveContexts.js:11:1:11:3 | foo | +| nullSensitiveContexts.js:12:1:12:3 | foo | +| nullSensitiveContexts.js:13:1:13:1 | x | +| nullSensitiveContexts.js:13:5:13:5 | y | +| nullSensitiveContexts.js:14:1:14:1 | x | +| nullSensitiveContexts.js:14:5:14:5 | y | +| nullSensitiveContexts.js:15:1:15:1 | x | +| nullSensitiveContexts.js:15:5:15:5 | y | +| nullSensitiveContexts.js:16:1:16:1 | x | +| nullSensitiveContexts.js:16:5:16:5 | y | +| nullSensitiveContexts.js:17:1:17:1 | x | +| nullSensitiveContexts.js:17:5:17:5 | y | +| nullSensitiveContexts.js:19:2:19:2 | x | +| nullSensitiveContexts.js:20:3:20:3 | x | +| nullSensitiveContexts.js:21:1:21:1 | x | +| nullSensitiveContexts.js:22:3:22:3 | x | +| nullSensitiveContexts.js:23:1:23:1 | x | +| nullSensitiveContexts.js:24:1:24:1 | x | +| nullSensitiveContexts.js:24:6:24:6 | y | +| nullSensitiveContexts.js:25:1:25:1 | x | +| nullSensitiveContexts.js:25:6:25:6 | y | +| nullSensitiveContexts.js:26:1:26:1 | x | +| nullSensitiveContexts.js:26:6:26:6 | y | +| nullSensitiveContexts.js:27:1:27:1 | x | +| nullSensitiveContexts.js:27:6:27:6 | y | +| nullSensitiveContexts.js:28:1:28:1 | x | +| nullSensitiveContexts.js:28:6:28:6 | y | +| nullSensitiveContexts.js:29:11:29:11 | p | +| nullSensitiveContexts.js:31:1:31:1 | x | +| nullSensitiveContexts.js:31:5:31:5 | y | +| nullSensitiveContexts.js:32:1:32:1 | x | +| nullSensitiveContexts.js:32:5:32:5 | y | +| nullSensitiveContexts.js:33:1:33:1 | x | +| nullSensitiveContexts.js:33:5:33:5 | y | +| nullSensitiveContexts.js:34:1:34:1 | x | +| nullSensitiveContexts.js:34:6:34:6 | y | +| nullSensitiveContexts.js:35:1:35:1 | x | +| nullSensitiveContexts.js:35:6:35:6 | y | +| nullSensitiveContexts.js:36:1:36:1 | x | +| nullSensitiveContexts.js:36:7:36:7 | y | +| nullSensitiveContexts.js:37:2:37:2 | x | +| nullSensitiveContexts.js:38:1:38:1 | x | +| nullSensitiveContexts.js:38:6:38:6 | y | +| nullSensitiveContexts.js:39:1:39:1 | x | +| nullSensitiveContexts.js:39:6:39:6 | y | +| nullSensitiveContexts.js:40:1:40:1 | x | +| nullSensitiveContexts.js:40:6:40:6 | y | +| nullSensitiveContexts.js:41:1:41:1 | x | +| nullSensitiveContexts.js:41:7:41:7 | y | +| nullSensitiveContexts.js:42:1:42:1 | x | +| nullSensitiveContexts.js:42:7:42:7 | y | +| nullSensitiveContexts.js:43:1:43:1 | x | +| nullSensitiveContexts.js:43:8:43:8 | y | +| nullSensitiveContexts.js:44:15:44:15 | y | +| primaries.js:22:5:22:9 | Array | +| primaries.js:23:5:23:10 | Object | +| primaries.js:24:5:24:10 | String | +| primaries.js:25:1:25:6 | String | +| primaries.js:26:1:26:6 | Object | +| primaries.js:26:1:26:13 | Object.create | +| primaries.js:27:1:27:6 | String | +| primaries.js:27:8:27:18 | 'epytotorp' | +| primaries.js:27:8:27:26 | 'epytotorp'.reverse | +| primaries.js:27:8:27:28 | 'epytot ... verse() | +| surrogates.js:2:1:2:8 | /\\uD800/ | +| surrogates.js:2:1:2:13 | /\\uD800/.test | +| unary.js:1:2:1:3 | 23 | +| unary.js:4:2:4:2 | 2 | +| unary.js:5:8:5:13 | Object | +| unary.js:7:8:7:13 | Object | +| unary.js:7:8:7:23 | Object.prototype | +| update.js:1:3:1:3 | a | +| update.js:2:1:2:1 | a | +| update.js:3:3:3:3 | b | +| update.js:4:1:4:1 | b | \ No newline at end of file diff --git a/javascript/ql/test/library-tests/Expr/tests.ql b/javascript/ql/test/library-tests/Expr/tests.ql index e2aaad1b9e29..a8c826edc9e2 100644 --- a/javascript/ql/test/library-tests/Expr/tests.ql +++ b/javascript/ql/test/library-tests/Expr/tests.ql @@ -9,3 +9,4 @@ import LetExpr import stripParens import getContainer import getEnclosingStmt +import nullSensitiveContexts \ No newline at end of file