From 336eb9dcf35774bc28e5ec1ef2adc6b5152adf0b Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Wed, 27 Mar 2019 16:31:49 -0700 Subject: [PATCH 01/19] adds initial qll --- .../src/Expressions/NullSensitiveContext.qll | 706 ++++++++++++++++++ 1 file changed, 706 insertions(+) create mode 100644 javascript/ql/src/Expressions/NullSensitiveContext.qll diff --git a/javascript/ql/src/Expressions/NullSensitiveContext.qll b/javascript/ql/src/Expressions/NullSensitiveContext.qll new file mode 100644 index 000000000000..c1c03800abaa --- /dev/null +++ b/javascript/ql/src/Expressions/NullSensitiveContext.qll @@ -0,0 +1,706 @@ +import javascript + + + + +abstract class NullSensitiveContext extends Expr { + abstract Expr getPrincipalArgument(); +} + + + +/* + * _[prop] + */ + +class IndexExprBase extends NullSensitiveContext, IndexExpr { + + override Expr getPrincipalArgument() { result = this.getBase() } + +} + + + +/* + * obj[_] + */ + +class IndexExprIndex extends NullSensitiveContext, IndexExpr { + + override Expr getPrincipalArgument() { result = this.getPropertyNameExpr() } + +} + + + +/* + * _.prop + */ + +class DotExprBase extends NullSensitiveContext, DotExpr { + + override Expr getPrincipalArgument() { result = this.getBase() } + +} + + + +/* + * new _ + */ + +class NewExprCallee extends NullSensitiveContext, NewExpr { + + override Expr getPrincipalArgument() { result = this.getCallee() } + +} + + + +/* + * _(args) + */ + +class CallExprCallee extends NullSensitiveContext, CallExpr { + + override Expr getPrincipalArgument() { result = this.getCallee() } + +} + + + +/* + * _ + expr + */ + +class AddExprLeftOperand extends NullSensitiveContext, AddExpr { + + override Expr getPrincipalArgument() { result = this.getLeftOperand() } + +} + + + +/* + * expr + _ + */ + +class AddExprRightOperand extends NullSensitiveContext, AddExpr { + + override Expr getPrincipalArgument() { result = this.getRightOperand() } + +} + + + +/* + * _ - expr + */ + +class SubExprLeftOperand extends NullSensitiveContext, SubExpr { + + override Expr getPrincipalArgument() { result = this.getLeftOperand() } + +} + + + +/* + * expr - _ + */ + +class SubExprRightOperand extends NullSensitiveContext, SubExpr { + + override Expr getPrincipalArgument() { result = this.getRightOperand() } + +} + + + +/* + * _ * expr + */ + +class MulExprLeftOperand extends NullSensitiveContext, MulExpr { + + override Expr getPrincipalArgument() { result = this.getLeftOperand() } + +} + + + +/* + * expr * _ + */ + +class MulExprRightOperand extends NullSensitiveContext, MulExpr { + + override Expr getPrincipalArgument() { result = this.getRightOperand() } + +} + + + +/* + * _ / expr + */ + +class DivExprLeftOperand extends NullSensitiveContext, DivExpr { + + override Expr getPrincipalArgument() { result = this.getLeftOperand() } + +} + + + +/* + * expr / _ + */ + +class DivExprRightOperand extends NullSensitiveContext, DivExpr { + + override Expr getPrincipalArgument() { result = this.getRightOperand() } + +} + + + +/* + * _ % expr + */ + +class ModExprLeftOperand extends NullSensitiveContext, ModExpr { + + override Expr getPrincipalArgument() { result = this.getLeftOperand() } + +} + + + +/* + * expr % _ + */ + +class ModExprRightOperand extends NullSensitiveContext, ModExpr { + + override Expr getPrincipalArgument() { result = this.getRightOperand() } + +} + + + +/* + * +_ + */ + +class PlusExprOperand extends NullSensitiveContext, PlusExpr { + + override Expr getPrincipalArgument() { result = this.getOperand() } + +} + + + +/* + * -_ + */ + +class NegExprOperand extends NullSensitiveContext, NegExpr { + + override Expr getPrincipalArgument() { result = this.getOperand() } + +} + + + +/* + * ++_ + */ + +class PreIncExprOperand extends NullSensitiveContext, PreIncExpr { + + override Expr getPrincipalArgument() { result = this.getOperand() } + +} + + + +/* + * _++ + */ + +class PostIncExprOperand extends NullSensitiveContext, PostIncExpr { + + override Expr getPrincipalArgument() { result = this.getOperand() } + +} + + + +/* + * --_ + */ + +class PreDecExprOperand extends NullSensitiveContext, PreDecExpr { + + override Expr getPrincipalArgument() { result = this.getOperand() } + +} + + + +/* + * _-- + */ + +class PostDecExprOperand extends NullSensitiveContext, PostDecExpr { + + override Expr getPrincipalArgument() { result = this.getOperand() } + +} + + + +/* + * _ += y + */ + +class AssignAddExprLhs extends NullSensitiveContext, AssignAddExpr { + + override Expr getPrincipalArgument() { result = this.getLhs() } + +} + + + +/* + * x += _ + */ + +class AssignAddExprRhs extends NullSensitiveContext, AssignAddExpr { + + override Expr getPrincipalArgument() { result = this.getRhs() } + +} + + + +/* + * _ -= y + */ + +class AssignSubExprLhs extends NullSensitiveContext, AssignSubExpr { + + override Expr getPrincipalArgument() { result = this.getLhs() } + +} + + + +/* + * x -= _ + */ + +class AssignSubExprRhs extends NullSensitiveContext, AssignSubExpr { + + override Expr getPrincipalArgument() { result = this.getRhs() } + +} + + + +/* + * _ *= y + */ + +class AssignMulExprLhs extends NullSensitiveContext, AssignMulExpr { + + override Expr getPrincipalArgument() { result = this.getLhs() } + +} + + + +/* + * x *= _ + */ + +class AssignMulExprRhs extends NullSensitiveContext, AssignMulExpr { + + override Expr getPrincipalArgument() { result = this.getRhs() } + +} + + + +/* + * _ /= y + */ + +class AssignDivExprLhs extends NullSensitiveContext, AssignDivExpr { + + override Expr getPrincipalArgument() { result = this.getLhs() } + +} + + + +/* + * x /= _ + */ + +class AssignDivExprRhs extends NullSensitiveContext, AssignDivExpr { + + override Expr getPrincipalArgument() { result = this.getRhs() } + +} + + + +/* + * _ %= y + */ + +class AssignModExprLhs extends NullSensitiveContext, AssignModExpr { + + override Expr getPrincipalArgument() { result = this.getLhs() } + +} + + + +/* + * x %= _ + */ + +class AssignModExprRhs extends NullSensitiveContext, AssignModExpr { + + override Expr getPrincipalArgument() { result = this.getRhs() } + +} + + + +/* + * _ & expr + */ + +class BitAndExprLeftOperand extends NullSensitiveContext, BitAndExpr { + + override Expr getPrincipalArgument() { result = this.getLeftOperand() } + +} + + + +/* + * expr & _ + */ + +class BitAndExprRightOperand extends NullSensitiveContext, BitAndExpr { + + override Expr getPrincipalArgument() { result = this.getRightOperand() } + +} + + + +/* + * _ | expr + */ + +class BitOrExprLeftOperand extends NullSensitiveContext, BitOrExpr { + + override Expr getPrincipalArgument() { result = this.getLeftOperand() } + +} + + + +/* + * expr | _ + */ + +class BitOrExprRightOperand extends NullSensitiveContext, BitOrExpr { + + override Expr getPrincipalArgument() { result = this.getRightOperand() } + +} + + + +/* + * _ ^ expr + */ + +class XOrExprLeftOperand extends NullSensitiveContext, XOrExpr { + + override Expr getPrincipalArgument() { result = this.getLeftOperand() } + +} + + + +/* + * expr ^ _ + */ + +class XOrExprRightOperand extends NullSensitiveContext, XOrExpr { + + override Expr getPrincipalArgument() { result = this.getRightOperand() } + +} + + + +/* + * _ << expr + */ + +class LShiftExprLeftOperand extends NullSensitiveContext, LShiftExpr { + + override Expr getPrincipalArgument() { result = this.getLeftOperand() } + +} + + + +/* + * expr << _ + */ + +class LShiftExprRightOperand extends NullSensitiveContext, LShiftExpr { + + override Expr getPrincipalArgument() { result = this.getRightOperand() } + +} + + + +/* + * _ >> expr + */ + +class RShiftExprLeftOperand extends NullSensitiveContext, RShiftExpr { + + override Expr getPrincipalArgument() { result = this.getLeftOperand() } + +} + + + +/* + * expr >> _ + */ + +class RShiftExprRightOperand extends NullSensitiveContext, RShiftExpr { + + override Expr getPrincipalArgument() { result = this.getRightOperand() } + +} + + + +/* + * _ >>> expr + */ + +class URShiftExprLeftOperand extends NullSensitiveContext, URShiftExpr { + + override Expr getPrincipalArgument() { result = this.getLeftOperand() } + +} + + + +/* + * expr >>> _ + */ + +class URShiftExprRightOperand extends NullSensitiveContext, URShiftExpr { + + override Expr getPrincipalArgument() { result = this.getRightOperand() } + +} + + + +/* + * ~expr + */ + +class BitNotExprOperand extends NullSensitiveContext, BitNotExpr { + + override Expr getPrincipalArgument() { result = this.getOperand() } + +} + + + +/* + * _ &= y + */ + +class AssignAndExprLhs extends NullSensitiveContext, AssignAndExpr { + + override Expr getPrincipalArgument() { result = this.getLhs() } + +} + + + +/* + * x &= _ + */ + +class AssignAndExprRhs extends NullSensitiveContext, AssignAndExpr { + + override Expr getPrincipalArgument() { result = this.getRhs() } + +} + + + +/* + * _ |= y + */ + +class AssignOrExprLhs extends NullSensitiveContext, AssignOrExpr { + + override Expr getPrincipalArgument() { result = this.getLhs() } + +} + + + +/* + * x |= _ + */ + +class AssignOrExprRhs extends NullSensitiveContext, AssignOrExpr { + + override Expr getPrincipalArgument() { result = this.getRhs() } + +} + + + +/* + * _ ^= y + */ + +class AssignXOrExprLhs extends NullSensitiveContext, AssignXOrExpr { + + override Expr getPrincipalArgument() { result = this.getLhs() } + +} + + + +/* + * x ^= _ + */ + +class AssignXOrExprRhs extends NullSensitiveContext, AssignXOrExpr { + + override Expr getPrincipalArgument() { result = this.getRhs() } + +} + + + +/* + * _ <<= y + */ + +class AssignLShiftExprLhs extends NullSensitiveContext, AssignLShiftExpr { + + override Expr getPrincipalArgument() { result = this.getLhs() } + +} + + + +/* + * x <<= _ + */ + +class AssignLShiftExprRhs extends NullSensitiveContext, AssignLShiftExpr { + + override Expr getPrincipalArgument() { result = this.getRhs() } + +} + + + +/* + * _ >>= y + */ + +class AssignRShiftExprLhs extends NullSensitiveContext, AssignRShiftExpr { + + override Expr getPrincipalArgument() { result = this.getLhs() } + +} + + + +/* + * x >>= _ + */ + +class AssignRShiftExprRhs extends NullSensitiveContext, AssignRShiftExpr { + + override Expr getPrincipalArgument() { result = this.getRhs() } + +} + + + +/* + * _ >>>= y + */ + +class AssignURShiftExprLhs extends NullSensitiveContext, AssignURShiftExpr { + + override Expr getPrincipalArgument() { result = this.getLhs() } + +} + + + +/* + * x >>>= _ + */ + +class AssignURShiftExprRhs extends NullSensitiveContext, AssignURShiftExpr { + + override Expr getPrincipalArgument() { result = this.getRhs() } + +} + + + +/* + * pat = _ + */ + +class DestructuringAssignExprRhs extends NullSensitiveContext, AssignExpr { + + DestructuringAssignExprRhs() { this.getLhs() instanceof DestructuringPattern } + + override Expr getPrincipalArgument() { result = this.getRhs() } + +} + + + +/* + * [..._] + */ + +class SpreadElementOperand extends NullSensitiveContext, SpreadElement { + + override Expr getPrincipalArgument() { result = this.getOperand() } + +} \ No newline at end of file From 2d3c522efc192e9bdf9ec604b4b1029d5d07f87b Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Wed, 27 Mar 2019 16:57:35 -0700 Subject: [PATCH 02/19] cleans up naming conventions --- .../src/Expressions/NullSensitiveContext.qll | 70 ++++++++++++------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/javascript/ql/src/Expressions/NullSensitiveContext.qll b/javascript/ql/src/Expressions/NullSensitiveContext.qll index c1c03800abaa..f842eda93126 100644 --- a/javascript/ql/src/Expressions/NullSensitiveContext.qll +++ b/javascript/ql/src/Expressions/NullSensitiveContext.qll @@ -1,8 +1,26 @@ +/** + * Provides classes for working with contexts sensitive to containing null + * and undefined. + */ + import javascript +/** + * A `NullSensitiveContext` is a syntactic context in which neither null nor + * undefined should occur, because the context is guaranteed to inspect its + * content and thereby throw an error. + * + * The expression found in that context is called the principal argument of + * the context. + * + * In examples, we denote the position of the principal argument by use of + * an underscore. For example, in `_ + 0`, the context's principle argument + * is the left operand of the addition. + */ + abstract class NullSensitiveContext extends Expr { abstract Expr getPrincipalArgument(); } @@ -10,7 +28,7 @@ abstract class NullSensitiveContext extends Expr { /* - * _[prop] + * _[p] */ class IndexExprBase extends NullSensitiveContext, IndexExpr { @@ -22,7 +40,7 @@ class IndexExprBase extends NullSensitiveContext, IndexExpr { /* - * obj[_] + * o[_] */ class IndexExprIndex extends NullSensitiveContext, IndexExpr { @@ -34,7 +52,7 @@ class IndexExprIndex extends NullSensitiveContext, IndexExpr { /* - * _.prop + * _.p */ class DotExprBase extends NullSensitiveContext, DotExpr { @@ -70,7 +88,7 @@ class CallExprCallee extends NullSensitiveContext, CallExpr { /* - * _ + expr + * _ + y */ class AddExprLeftOperand extends NullSensitiveContext, AddExpr { @@ -82,7 +100,7 @@ class AddExprLeftOperand extends NullSensitiveContext, AddExpr { /* - * expr + _ + * x + _ */ class AddExprRightOperand extends NullSensitiveContext, AddExpr { @@ -94,7 +112,7 @@ class AddExprRightOperand extends NullSensitiveContext, AddExpr { /* - * _ - expr + * _ - y */ class SubExprLeftOperand extends NullSensitiveContext, SubExpr { @@ -106,7 +124,7 @@ class SubExprLeftOperand extends NullSensitiveContext, SubExpr { /* - * expr - _ + * x - _ */ class SubExprRightOperand extends NullSensitiveContext, SubExpr { @@ -118,7 +136,7 @@ class SubExprRightOperand extends NullSensitiveContext, SubExpr { /* - * _ * expr + * _ * u */ class MulExprLeftOperand extends NullSensitiveContext, MulExpr { @@ -130,7 +148,7 @@ class MulExprLeftOperand extends NullSensitiveContext, MulExpr { /* - * expr * _ + * x * _ */ class MulExprRightOperand extends NullSensitiveContext, MulExpr { @@ -142,7 +160,7 @@ class MulExprRightOperand extends NullSensitiveContext, MulExpr { /* - * _ / expr + * _ / y */ class DivExprLeftOperand extends NullSensitiveContext, DivExpr { @@ -154,7 +172,7 @@ class DivExprLeftOperand extends NullSensitiveContext, DivExpr { /* - * expr / _ + * x / _ */ class DivExprRightOperand extends NullSensitiveContext, DivExpr { @@ -166,7 +184,7 @@ class DivExprRightOperand extends NullSensitiveContext, DivExpr { /* - * _ % expr + * _ % y */ class ModExprLeftOperand extends NullSensitiveContext, ModExpr { @@ -178,7 +196,7 @@ class ModExprLeftOperand extends NullSensitiveContext, ModExpr { /* - * expr % _ + * x % _ */ class ModExprRightOperand extends NullSensitiveContext, ModExpr { @@ -382,7 +400,7 @@ class AssignModExprRhs extends NullSensitiveContext, AssignModExpr { /* - * _ & expr + * _ & y */ class BitAndExprLeftOperand extends NullSensitiveContext, BitAndExpr { @@ -394,7 +412,7 @@ class BitAndExprLeftOperand extends NullSensitiveContext, BitAndExpr { /* - * expr & _ + * x & _ */ class BitAndExprRightOperand extends NullSensitiveContext, BitAndExpr { @@ -406,7 +424,7 @@ class BitAndExprRightOperand extends NullSensitiveContext, BitAndExpr { /* - * _ | expr + * _ | y */ class BitOrExprLeftOperand extends NullSensitiveContext, BitOrExpr { @@ -418,7 +436,7 @@ class BitOrExprLeftOperand extends NullSensitiveContext, BitOrExpr { /* - * expr | _ + * x | _ */ class BitOrExprRightOperand extends NullSensitiveContext, BitOrExpr { @@ -430,7 +448,7 @@ class BitOrExprRightOperand extends NullSensitiveContext, BitOrExpr { /* - * _ ^ expr + * _ ^ y */ class XOrExprLeftOperand extends NullSensitiveContext, XOrExpr { @@ -442,7 +460,7 @@ class XOrExprLeftOperand extends NullSensitiveContext, XOrExpr { /* - * expr ^ _ + * x ^ _ */ class XOrExprRightOperand extends NullSensitiveContext, XOrExpr { @@ -454,7 +472,7 @@ class XOrExprRightOperand extends NullSensitiveContext, XOrExpr { /* - * _ << expr + * _ << y */ class LShiftExprLeftOperand extends NullSensitiveContext, LShiftExpr { @@ -466,7 +484,7 @@ class LShiftExprLeftOperand extends NullSensitiveContext, LShiftExpr { /* - * expr << _ + * x << _ */ class LShiftExprRightOperand extends NullSensitiveContext, LShiftExpr { @@ -478,7 +496,7 @@ class LShiftExprRightOperand extends NullSensitiveContext, LShiftExpr { /* - * _ >> expr + * _ >> y */ class RShiftExprLeftOperand extends NullSensitiveContext, RShiftExpr { @@ -490,7 +508,7 @@ class RShiftExprLeftOperand extends NullSensitiveContext, RShiftExpr { /* - * expr >> _ + * x >> _ */ class RShiftExprRightOperand extends NullSensitiveContext, RShiftExpr { @@ -502,7 +520,7 @@ class RShiftExprRightOperand extends NullSensitiveContext, RShiftExpr { /* - * _ >>> expr + * _ >>> y */ class URShiftExprLeftOperand extends NullSensitiveContext, URShiftExpr { @@ -514,7 +532,7 @@ class URShiftExprLeftOperand extends NullSensitiveContext, URShiftExpr { /* - * expr >>> _ + * x >>> _ */ class URShiftExprRightOperand extends NullSensitiveContext, URShiftExpr { @@ -526,7 +544,7 @@ class URShiftExprRightOperand extends NullSensitiveContext, URShiftExpr { /* - * ~expr + * ~_ */ class BitNotExprOperand extends NullSensitiveContext, BitNotExpr { From a049d9a4c6a04dcd202d942336d0bb0aa14c8842 Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Wed, 27 Mar 2019 16:58:33 -0700 Subject: [PATCH 03/19] moves lib to right place --- .../{Expressions => semmle/javascript}/NullSensitiveContext.qll | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename javascript/ql/src/{Expressions => semmle/javascript}/NullSensitiveContext.qll (100%) diff --git a/javascript/ql/src/Expressions/NullSensitiveContext.qll b/javascript/ql/src/semmle/javascript/NullSensitiveContext.qll similarity index 100% rename from javascript/ql/src/Expressions/NullSensitiveContext.qll rename to javascript/ql/src/semmle/javascript/NullSensitiveContext.qll From e4c5fd4f61a39ea834565ba2504c77ef7270e614 Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Wed, 27 Mar 2019 17:12:10 -0700 Subject: [PATCH 04/19] autoformats --- .../javascript/NullSensitiveContext.qll | 368 ++++-------------- 1 file changed, 66 insertions(+), 302 deletions(-) diff --git a/javascript/ql/src/semmle/javascript/NullSensitiveContext.qll b/javascript/ql/src/semmle/javascript/NullSensitiveContext.qll index f842eda93126..9ec4999bfe57 100644 --- a/javascript/ql/src/semmle/javascript/NullSensitiveContext.qll +++ b/javascript/ql/src/semmle/javascript/NullSensitiveContext.qll @@ -5,720 +5,484 @@ import javascript - - - /** * A `NullSensitiveContext` is a syntactic context in which neither null nor * undefined should occur, because the context is guaranteed to inspect its - * content and thereby throw an error. - * + * content and thereby throw an error or produce other undesirable behavior. + * * The expression found in that context is called the principal argument of * the context. - * + * * In examples, we denote the position of the principal argument by use of * an underscore. For example, in `_ + 0`, the context's principle argument * is the left operand of the addition. */ - abstract class NullSensitiveContext extends Expr { - abstract Expr getPrincipalArgument(); + abstract Expr getPrincipalArgument(); } - - /* * _[p] */ class IndexExprBase extends NullSensitiveContext, IndexExpr { - - override Expr getPrincipalArgument() { result = this.getBase() } - + override Expr getPrincipalArgument() { result = this.getBase() } } - - /* * o[_] */ class IndexExprIndex extends NullSensitiveContext, IndexExpr { - - override Expr getPrincipalArgument() { result = this.getPropertyNameExpr() } - + override Expr getPrincipalArgument() { result = this.getPropertyNameExpr() } } - - /* * _.p */ class DotExprBase extends NullSensitiveContext, DotExpr { - - override Expr getPrincipalArgument() { result = this.getBase() } - + override Expr getPrincipalArgument() { result = this.getBase() } } - - - + /* * new _ */ class NewExprCallee extends NullSensitiveContext, NewExpr { - - override Expr getPrincipalArgument() { result = this.getCallee() } - + override Expr getPrincipalArgument() { result = this.getCallee() } } - - /* * _(args) */ class CallExprCallee extends NullSensitiveContext, CallExpr { - - override Expr getPrincipalArgument() { result = this.getCallee() } - + override Expr getPrincipalArgument() { result = this.getCallee() } } - - /* * _ + y */ class AddExprLeftOperand extends NullSensitiveContext, AddExpr { - - override Expr getPrincipalArgument() { result = this.getLeftOperand() } - + override Expr getPrincipalArgument() { result = this.getLeftOperand() } } - - /* * x + _ */ class AddExprRightOperand extends NullSensitiveContext, AddExpr { - - override Expr getPrincipalArgument() { result = this.getRightOperand() } - + override Expr getPrincipalArgument() { result = this.getRightOperand() } } - - /* * _ - y */ class SubExprLeftOperand extends NullSensitiveContext, SubExpr { - - override Expr getPrincipalArgument() { result = this.getLeftOperand() } - + override Expr getPrincipalArgument() { result = this.getLeftOperand() } } - - /* * x - _ */ class SubExprRightOperand extends NullSensitiveContext, SubExpr { - - override Expr getPrincipalArgument() { result = this.getRightOperand() } - + override Expr getPrincipalArgument() { result = this.getRightOperand() } } - - /* * _ * u */ class MulExprLeftOperand extends NullSensitiveContext, MulExpr { - - override Expr getPrincipalArgument() { result = this.getLeftOperand() } - + override Expr getPrincipalArgument() { result = this.getLeftOperand() } } - - /* * x * _ */ class MulExprRightOperand extends NullSensitiveContext, MulExpr { - - override Expr getPrincipalArgument() { result = this.getRightOperand() } - + override Expr getPrincipalArgument() { result = this.getRightOperand() } } - - /* * _ / y */ class DivExprLeftOperand extends NullSensitiveContext, DivExpr { - - override Expr getPrincipalArgument() { result = this.getLeftOperand() } - + override Expr getPrincipalArgument() { result = this.getLeftOperand() } } - - /* * x / _ */ class DivExprRightOperand extends NullSensitiveContext, DivExpr { - - override Expr getPrincipalArgument() { result = this.getRightOperand() } - + override Expr getPrincipalArgument() { result = this.getRightOperand() } } - - /* * _ % y */ class ModExprLeftOperand extends NullSensitiveContext, ModExpr { - - override Expr getPrincipalArgument() { result = this.getLeftOperand() } - + override Expr getPrincipalArgument() { result = this.getLeftOperand() } } - - /* * x % _ */ class ModExprRightOperand extends NullSensitiveContext, ModExpr { - - override Expr getPrincipalArgument() { result = this.getRightOperand() } - + override Expr getPrincipalArgument() { result = this.getRightOperand() } } - - /* * +_ */ class PlusExprOperand extends NullSensitiveContext, PlusExpr { - - override Expr getPrincipalArgument() { result = this.getOperand() } - + override Expr getPrincipalArgument() { result = this.getOperand() } } - - /* * -_ */ class NegExprOperand extends NullSensitiveContext, NegExpr { - - override Expr getPrincipalArgument() { result = this.getOperand() } - + override Expr getPrincipalArgument() { result = this.getOperand() } } - - /* * ++_ */ class PreIncExprOperand extends NullSensitiveContext, PreIncExpr { - - override Expr getPrincipalArgument() { result = this.getOperand() } - + override Expr getPrincipalArgument() { result = this.getOperand() } } - - /* * _++ */ class PostIncExprOperand extends NullSensitiveContext, PostIncExpr { - - override Expr getPrincipalArgument() { result = this.getOperand() } - + override Expr getPrincipalArgument() { result = this.getOperand() } } - - /* * --_ */ class PreDecExprOperand extends NullSensitiveContext, PreDecExpr { - - override Expr getPrincipalArgument() { result = this.getOperand() } - + override Expr getPrincipalArgument() { result = this.getOperand() } } - - /* * _-- */ class PostDecExprOperand extends NullSensitiveContext, PostDecExpr { - - override Expr getPrincipalArgument() { result = this.getOperand() } - + override Expr getPrincipalArgument() { result = this.getOperand() } } - - /* * _ += y */ class AssignAddExprLhs extends NullSensitiveContext, AssignAddExpr { - - override Expr getPrincipalArgument() { result = this.getLhs() } - + override Expr getPrincipalArgument() { result = this.getLhs() } } - - /* * x += _ */ class AssignAddExprRhs extends NullSensitiveContext, AssignAddExpr { - - override Expr getPrincipalArgument() { result = this.getRhs() } - + override Expr getPrincipalArgument() { result = this.getRhs() } } - - /* * _ -= y */ class AssignSubExprLhs extends NullSensitiveContext, AssignSubExpr { - - override Expr getPrincipalArgument() { result = this.getLhs() } - + override Expr getPrincipalArgument() { result = this.getLhs() } } - - /* * x -= _ */ class AssignSubExprRhs extends NullSensitiveContext, AssignSubExpr { - - override Expr getPrincipalArgument() { result = this.getRhs() } - + override Expr getPrincipalArgument() { result = this.getRhs() } } - - /* * _ *= y */ class AssignMulExprLhs extends NullSensitiveContext, AssignMulExpr { - - override Expr getPrincipalArgument() { result = this.getLhs() } - + override Expr getPrincipalArgument() { result = this.getLhs() } } - - /* * x *= _ */ class AssignMulExprRhs extends NullSensitiveContext, AssignMulExpr { - - override Expr getPrincipalArgument() { result = this.getRhs() } - + override Expr getPrincipalArgument() { result = this.getRhs() } } - - /* * _ /= y */ class AssignDivExprLhs extends NullSensitiveContext, AssignDivExpr { - - override Expr getPrincipalArgument() { result = this.getLhs() } - + override Expr getPrincipalArgument() { result = this.getLhs() } } - - /* * x /= _ */ class AssignDivExprRhs extends NullSensitiveContext, AssignDivExpr { - - override Expr getPrincipalArgument() { result = this.getRhs() } - + override Expr getPrincipalArgument() { result = this.getRhs() } } - - /* * _ %= y */ class AssignModExprLhs extends NullSensitiveContext, AssignModExpr { - - override Expr getPrincipalArgument() { result = this.getLhs() } - + override Expr getPrincipalArgument() { result = this.getLhs() } } - - /* * x %= _ */ class AssignModExprRhs extends NullSensitiveContext, AssignModExpr { - - override Expr getPrincipalArgument() { result = this.getRhs() } - + override Expr getPrincipalArgument() { result = this.getRhs() } } - - /* * _ & y */ class BitAndExprLeftOperand extends NullSensitiveContext, BitAndExpr { - - override Expr getPrincipalArgument() { result = this.getLeftOperand() } - + override Expr getPrincipalArgument() { result = this.getLeftOperand() } } - - /* * x & _ */ class BitAndExprRightOperand extends NullSensitiveContext, BitAndExpr { - - override Expr getPrincipalArgument() { result = this.getRightOperand() } - + override Expr getPrincipalArgument() { result = this.getRightOperand() } } - - /* * _ | y */ class BitOrExprLeftOperand extends NullSensitiveContext, BitOrExpr { - - override Expr getPrincipalArgument() { result = this.getLeftOperand() } - + override Expr getPrincipalArgument() { result = this.getLeftOperand() } } - - /* * x | _ */ class BitOrExprRightOperand extends NullSensitiveContext, BitOrExpr { - - override Expr getPrincipalArgument() { result = this.getRightOperand() } - + override Expr getPrincipalArgument() { result = this.getRightOperand() } } - - /* * _ ^ y */ class XOrExprLeftOperand extends NullSensitiveContext, XOrExpr { - - override Expr getPrincipalArgument() { result = this.getLeftOperand() } - + override Expr getPrincipalArgument() { result = this.getLeftOperand() } } - - /* * x ^ _ */ class XOrExprRightOperand extends NullSensitiveContext, XOrExpr { - - override Expr getPrincipalArgument() { result = this.getRightOperand() } - + override Expr getPrincipalArgument() { result = this.getRightOperand() } } - - /* * _ << y */ class LShiftExprLeftOperand extends NullSensitiveContext, LShiftExpr { - - override Expr getPrincipalArgument() { result = this.getLeftOperand() } - + override Expr getPrincipalArgument() { result = this.getLeftOperand() } } - - /* * x << _ */ class LShiftExprRightOperand extends NullSensitiveContext, LShiftExpr { - - override Expr getPrincipalArgument() { result = this.getRightOperand() } - + override Expr getPrincipalArgument() { result = this.getRightOperand() } } - - /* * _ >> y */ class RShiftExprLeftOperand extends NullSensitiveContext, RShiftExpr { - - override Expr getPrincipalArgument() { result = this.getLeftOperand() } - + override Expr getPrincipalArgument() { result = this.getLeftOperand() } } - - /* * x >> _ */ class RShiftExprRightOperand extends NullSensitiveContext, RShiftExpr { - - override Expr getPrincipalArgument() { result = this.getRightOperand() } - + override Expr getPrincipalArgument() { result = this.getRightOperand() } } - - /* * _ >>> y */ class URShiftExprLeftOperand extends NullSensitiveContext, URShiftExpr { - - override Expr getPrincipalArgument() { result = this.getLeftOperand() } - + override Expr getPrincipalArgument() { result = this.getLeftOperand() } } - - /* * x >>> _ */ class URShiftExprRightOperand extends NullSensitiveContext, URShiftExpr { - - override Expr getPrincipalArgument() { result = this.getRightOperand() } - + override Expr getPrincipalArgument() { result = this.getRightOperand() } } - - /* * ~_ */ class BitNotExprOperand extends NullSensitiveContext, BitNotExpr { - - override Expr getPrincipalArgument() { result = this.getOperand() } - + override Expr getPrincipalArgument() { result = this.getOperand() } } - - /* * _ &= y */ class AssignAndExprLhs extends NullSensitiveContext, AssignAndExpr { - - override Expr getPrincipalArgument() { result = this.getLhs() } - + override Expr getPrincipalArgument() { result = this.getLhs() } } - - /* * x &= _ */ class AssignAndExprRhs extends NullSensitiveContext, AssignAndExpr { - - override Expr getPrincipalArgument() { result = this.getRhs() } - + override Expr getPrincipalArgument() { result = this.getRhs() } } - - /* * _ |= y */ class AssignOrExprLhs extends NullSensitiveContext, AssignOrExpr { - - override Expr getPrincipalArgument() { result = this.getLhs() } - + override Expr getPrincipalArgument() { result = this.getLhs() } } - - /* * x |= _ */ class AssignOrExprRhs extends NullSensitiveContext, AssignOrExpr { - - override Expr getPrincipalArgument() { result = this.getRhs() } - + override Expr getPrincipalArgument() { result = this.getRhs() } } - - /* * _ ^= y */ class AssignXOrExprLhs extends NullSensitiveContext, AssignXOrExpr { - - override Expr getPrincipalArgument() { result = this.getLhs() } - + override Expr getPrincipalArgument() { result = this.getLhs() } } - - /* * x ^= _ */ class AssignXOrExprRhs extends NullSensitiveContext, AssignXOrExpr { - - override Expr getPrincipalArgument() { result = this.getRhs() } - + override Expr getPrincipalArgument() { result = this.getRhs() } } - - /* * _ <<= y */ class AssignLShiftExprLhs extends NullSensitiveContext, AssignLShiftExpr { - - override Expr getPrincipalArgument() { result = this.getLhs() } - + override Expr getPrincipalArgument() { result = this.getLhs() } } - - /* * x <<= _ */ class AssignLShiftExprRhs extends NullSensitiveContext, AssignLShiftExpr { - - override Expr getPrincipalArgument() { result = this.getRhs() } - + override Expr getPrincipalArgument() { result = this.getRhs() } } - - /* * _ >>= y */ class AssignRShiftExprLhs extends NullSensitiveContext, AssignRShiftExpr { - - override Expr getPrincipalArgument() { result = this.getLhs() } - + override Expr getPrincipalArgument() { result = this.getLhs() } } - - /* * x >>= _ */ class AssignRShiftExprRhs extends NullSensitiveContext, AssignRShiftExpr { - - override Expr getPrincipalArgument() { result = this.getRhs() } - + override Expr getPrincipalArgument() { result = this.getRhs() } } - - /* * _ >>>= y */ class AssignURShiftExprLhs extends NullSensitiveContext, AssignURShiftExpr { - - override Expr getPrincipalArgument() { result = this.getLhs() } - + override Expr getPrincipalArgument() { result = this.getLhs() } } - - /* * x >>>= _ */ class AssignURShiftExprRhs extends NullSensitiveContext, AssignURShiftExpr { - - override Expr getPrincipalArgument() { result = this.getRhs() } - + override Expr getPrincipalArgument() { result = this.getRhs() } } - - /* * pat = _ */ class DestructuringAssignExprRhs extends NullSensitiveContext, AssignExpr { - - DestructuringAssignExprRhs() { this.getLhs() instanceof DestructuringPattern } - - override Expr getPrincipalArgument() { result = this.getRhs() } - -} - + DestructuringAssignExprRhs() { this.getLhs() instanceof DestructuringPattern } + override Expr getPrincipalArgument() { result = this.getRhs() } +} /* * [..._] */ class SpreadElementOperand extends NullSensitiveContext, SpreadElement { - - override Expr getPrincipalArgument() { result = this.getOperand() } - -} \ No newline at end of file + override Expr getPrincipalArgument() { result = this.getOperand() } +} From 7d183eab0b5752d3232330233311d129cf05a837 Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Mon, 1 Apr 2019 10:22:49 -0700 Subject: [PATCH 05/19] moves functionality over to `Expr` method per PR change requests --- javascript/ql/src/semmle/javascript/Expr.qll | 23 + .../javascript/NullSensitiveContext.qll | 488 ------------------ 2 files changed, 23 insertions(+), 488 deletions(-) delete mode 100644 javascript/ql/src/semmle/javascript/NullSensitiveContext.qll diff --git a/javascript/ql/src/semmle/javascript/Expr.qll b/javascript/ql/src/semmle/javascript/Expr.qll index 8946ab66f12a..1fc6fd005047 100644 --- a/javascript/ql/src/semmle/javascript/Expr.qll +++ b/javascript/ql/src/semmle/javascript/Expr.qll @@ -161,6 +161,29 @@ 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. + */ + predicate getNullSensitiveContext() { + exists(ExprOrStmt ctx | + 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 + not ctx instanceof EqualityTest) or + (this = ctx.(UnaryExpr).getOperand() and + not ctx instanceof LogNotExpr) or + this = ctx.(UpdateExpr).getOperand() or + this = ctx.(CompoundAssignExpr).getLhs() or + this = ctx.(CompoundAssignExpr).getRhs() or + this = ctx.(AssignExpr).getRhs() or + this = ctx.(SpreadElement).getOperand() or + this = ctx.(ForOfStmt).getIterationDomain() + ) + } } /** An identifier. */ diff --git a/javascript/ql/src/semmle/javascript/NullSensitiveContext.qll b/javascript/ql/src/semmle/javascript/NullSensitiveContext.qll deleted file mode 100644 index 9ec4999bfe57..000000000000 --- a/javascript/ql/src/semmle/javascript/NullSensitiveContext.qll +++ /dev/null @@ -1,488 +0,0 @@ -/** - * Provides classes for working with contexts sensitive to containing null - * and undefined. - */ - -import javascript - -/** - * A `NullSensitiveContext` is a syntactic context in which neither null nor - * undefined should occur, because the context is guaranteed to inspect its - * content and thereby throw an error or produce other undesirable behavior. - * - * The expression found in that context is called the principal argument of - * the context. - * - * In examples, we denote the position of the principal argument by use of - * an underscore. For example, in `_ + 0`, the context's principle argument - * is the left operand of the addition. - */ -abstract class NullSensitiveContext extends Expr { - abstract Expr getPrincipalArgument(); -} - -/* - * _[p] - */ - -class IndexExprBase extends NullSensitiveContext, IndexExpr { - override Expr getPrincipalArgument() { result = this.getBase() } -} - -/* - * o[_] - */ - -class IndexExprIndex extends NullSensitiveContext, IndexExpr { - override Expr getPrincipalArgument() { result = this.getPropertyNameExpr() } -} - -/* - * _.p - */ - -class DotExprBase extends NullSensitiveContext, DotExpr { - override Expr getPrincipalArgument() { result = this.getBase() } -} - -/* - * new _ - */ - -class NewExprCallee extends NullSensitiveContext, NewExpr { - override Expr getPrincipalArgument() { result = this.getCallee() } -} - -/* - * _(args) - */ - -class CallExprCallee extends NullSensitiveContext, CallExpr { - override Expr getPrincipalArgument() { result = this.getCallee() } -} - -/* - * _ + y - */ - -class AddExprLeftOperand extends NullSensitiveContext, AddExpr { - override Expr getPrincipalArgument() { result = this.getLeftOperand() } -} - -/* - * x + _ - */ - -class AddExprRightOperand extends NullSensitiveContext, AddExpr { - override Expr getPrincipalArgument() { result = this.getRightOperand() } -} - -/* - * _ - y - */ - -class SubExprLeftOperand extends NullSensitiveContext, SubExpr { - override Expr getPrincipalArgument() { result = this.getLeftOperand() } -} - -/* - * x - _ - */ - -class SubExprRightOperand extends NullSensitiveContext, SubExpr { - override Expr getPrincipalArgument() { result = this.getRightOperand() } -} - -/* - * _ * u - */ - -class MulExprLeftOperand extends NullSensitiveContext, MulExpr { - override Expr getPrincipalArgument() { result = this.getLeftOperand() } -} - -/* - * x * _ - */ - -class MulExprRightOperand extends NullSensitiveContext, MulExpr { - override Expr getPrincipalArgument() { result = this.getRightOperand() } -} - -/* - * _ / y - */ - -class DivExprLeftOperand extends NullSensitiveContext, DivExpr { - override Expr getPrincipalArgument() { result = this.getLeftOperand() } -} - -/* - * x / _ - */ - -class DivExprRightOperand extends NullSensitiveContext, DivExpr { - override Expr getPrincipalArgument() { result = this.getRightOperand() } -} - -/* - * _ % y - */ - -class ModExprLeftOperand extends NullSensitiveContext, ModExpr { - override Expr getPrincipalArgument() { result = this.getLeftOperand() } -} - -/* - * x % _ - */ - -class ModExprRightOperand extends NullSensitiveContext, ModExpr { - override Expr getPrincipalArgument() { result = this.getRightOperand() } -} - -/* - * +_ - */ - -class PlusExprOperand extends NullSensitiveContext, PlusExpr { - override Expr getPrincipalArgument() { result = this.getOperand() } -} - -/* - * -_ - */ - -class NegExprOperand extends NullSensitiveContext, NegExpr { - override Expr getPrincipalArgument() { result = this.getOperand() } -} - -/* - * ++_ - */ - -class PreIncExprOperand extends NullSensitiveContext, PreIncExpr { - override Expr getPrincipalArgument() { result = this.getOperand() } -} - -/* - * _++ - */ - -class PostIncExprOperand extends NullSensitiveContext, PostIncExpr { - override Expr getPrincipalArgument() { result = this.getOperand() } -} - -/* - * --_ - */ - -class PreDecExprOperand extends NullSensitiveContext, PreDecExpr { - override Expr getPrincipalArgument() { result = this.getOperand() } -} - -/* - * _-- - */ - -class PostDecExprOperand extends NullSensitiveContext, PostDecExpr { - override Expr getPrincipalArgument() { result = this.getOperand() } -} - -/* - * _ += y - */ - -class AssignAddExprLhs extends NullSensitiveContext, AssignAddExpr { - override Expr getPrincipalArgument() { result = this.getLhs() } -} - -/* - * x += _ - */ - -class AssignAddExprRhs extends NullSensitiveContext, AssignAddExpr { - override Expr getPrincipalArgument() { result = this.getRhs() } -} - -/* - * _ -= y - */ - -class AssignSubExprLhs extends NullSensitiveContext, AssignSubExpr { - override Expr getPrincipalArgument() { result = this.getLhs() } -} - -/* - * x -= _ - */ - -class AssignSubExprRhs extends NullSensitiveContext, AssignSubExpr { - override Expr getPrincipalArgument() { result = this.getRhs() } -} - -/* - * _ *= y - */ - -class AssignMulExprLhs extends NullSensitiveContext, AssignMulExpr { - override Expr getPrincipalArgument() { result = this.getLhs() } -} - -/* - * x *= _ - */ - -class AssignMulExprRhs extends NullSensitiveContext, AssignMulExpr { - override Expr getPrincipalArgument() { result = this.getRhs() } -} - -/* - * _ /= y - */ - -class AssignDivExprLhs extends NullSensitiveContext, AssignDivExpr { - override Expr getPrincipalArgument() { result = this.getLhs() } -} - -/* - * x /= _ - */ - -class AssignDivExprRhs extends NullSensitiveContext, AssignDivExpr { - override Expr getPrincipalArgument() { result = this.getRhs() } -} - -/* - * _ %= y - */ - -class AssignModExprLhs extends NullSensitiveContext, AssignModExpr { - override Expr getPrincipalArgument() { result = this.getLhs() } -} - -/* - * x %= _ - */ - -class AssignModExprRhs extends NullSensitiveContext, AssignModExpr { - override Expr getPrincipalArgument() { result = this.getRhs() } -} - -/* - * _ & y - */ - -class BitAndExprLeftOperand extends NullSensitiveContext, BitAndExpr { - override Expr getPrincipalArgument() { result = this.getLeftOperand() } -} - -/* - * x & _ - */ - -class BitAndExprRightOperand extends NullSensitiveContext, BitAndExpr { - override Expr getPrincipalArgument() { result = this.getRightOperand() } -} - -/* - * _ | y - */ - -class BitOrExprLeftOperand extends NullSensitiveContext, BitOrExpr { - override Expr getPrincipalArgument() { result = this.getLeftOperand() } -} - -/* - * x | _ - */ - -class BitOrExprRightOperand extends NullSensitiveContext, BitOrExpr { - override Expr getPrincipalArgument() { result = this.getRightOperand() } -} - -/* - * _ ^ y - */ - -class XOrExprLeftOperand extends NullSensitiveContext, XOrExpr { - override Expr getPrincipalArgument() { result = this.getLeftOperand() } -} - -/* - * x ^ _ - */ - -class XOrExprRightOperand extends NullSensitiveContext, XOrExpr { - override Expr getPrincipalArgument() { result = this.getRightOperand() } -} - -/* - * _ << y - */ - -class LShiftExprLeftOperand extends NullSensitiveContext, LShiftExpr { - override Expr getPrincipalArgument() { result = this.getLeftOperand() } -} - -/* - * x << _ - */ - -class LShiftExprRightOperand extends NullSensitiveContext, LShiftExpr { - override Expr getPrincipalArgument() { result = this.getRightOperand() } -} - -/* - * _ >> y - */ - -class RShiftExprLeftOperand extends NullSensitiveContext, RShiftExpr { - override Expr getPrincipalArgument() { result = this.getLeftOperand() } -} - -/* - * x >> _ - */ - -class RShiftExprRightOperand extends NullSensitiveContext, RShiftExpr { - override Expr getPrincipalArgument() { result = this.getRightOperand() } -} - -/* - * _ >>> y - */ - -class URShiftExprLeftOperand extends NullSensitiveContext, URShiftExpr { - override Expr getPrincipalArgument() { result = this.getLeftOperand() } -} - -/* - * x >>> _ - */ - -class URShiftExprRightOperand extends NullSensitiveContext, URShiftExpr { - override Expr getPrincipalArgument() { result = this.getRightOperand() } -} - -/* - * ~_ - */ - -class BitNotExprOperand extends NullSensitiveContext, BitNotExpr { - override Expr getPrincipalArgument() { result = this.getOperand() } -} - -/* - * _ &= y - */ - -class AssignAndExprLhs extends NullSensitiveContext, AssignAndExpr { - override Expr getPrincipalArgument() { result = this.getLhs() } -} - -/* - * x &= _ - */ - -class AssignAndExprRhs extends NullSensitiveContext, AssignAndExpr { - override Expr getPrincipalArgument() { result = this.getRhs() } -} - -/* - * _ |= y - */ - -class AssignOrExprLhs extends NullSensitiveContext, AssignOrExpr { - override Expr getPrincipalArgument() { result = this.getLhs() } -} - -/* - * x |= _ - */ - -class AssignOrExprRhs extends NullSensitiveContext, AssignOrExpr { - override Expr getPrincipalArgument() { result = this.getRhs() } -} - -/* - * _ ^= y - */ - -class AssignXOrExprLhs extends NullSensitiveContext, AssignXOrExpr { - override Expr getPrincipalArgument() { result = this.getLhs() } -} - -/* - * x ^= _ - */ - -class AssignXOrExprRhs extends NullSensitiveContext, AssignXOrExpr { - override Expr getPrincipalArgument() { result = this.getRhs() } -} - -/* - * _ <<= y - */ - -class AssignLShiftExprLhs extends NullSensitiveContext, AssignLShiftExpr { - override Expr getPrincipalArgument() { result = this.getLhs() } -} - -/* - * x <<= _ - */ - -class AssignLShiftExprRhs extends NullSensitiveContext, AssignLShiftExpr { - override Expr getPrincipalArgument() { result = this.getRhs() } -} - -/* - * _ >>= y - */ - -class AssignRShiftExprLhs extends NullSensitiveContext, AssignRShiftExpr { - override Expr getPrincipalArgument() { result = this.getLhs() } -} - -/* - * x >>= _ - */ - -class AssignRShiftExprRhs extends NullSensitiveContext, AssignRShiftExpr { - override Expr getPrincipalArgument() { result = this.getRhs() } -} - -/* - * _ >>>= y - */ - -class AssignURShiftExprLhs extends NullSensitiveContext, AssignURShiftExpr { - override Expr getPrincipalArgument() { result = this.getLhs() } -} - -/* - * x >>>= _ - */ - -class AssignURShiftExprRhs extends NullSensitiveContext, AssignURShiftExpr { - override Expr getPrincipalArgument() { result = this.getRhs() } -} - -/* - * pat = _ - */ - -class DestructuringAssignExprRhs extends NullSensitiveContext, AssignExpr { - DestructuringAssignExprRhs() { this.getLhs() instanceof DestructuringPattern } - - override Expr getPrincipalArgument() { result = this.getRhs() } -} - -/* - * [..._] - */ - -class SpreadElementOperand extends NullSensitiveContext, SpreadElement { - override Expr getPrincipalArgument() { result = this.getOperand() } -} From 5bf7efeed3387db371fbdf51b2e17c21285c7e28 Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Mon, 1 Apr 2019 10:39:06 -0700 Subject: [PATCH 06/19] fixes name and autoformats --- javascript/ql/src/semmle/javascript/Expr.qll | 46 ++++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/javascript/ql/src/semmle/javascript/Expr.qll b/javascript/ql/src/semmle/javascript/Expr.qll index 1fc6fd005047..1f3565b344e3 100644 --- a/javascript/ql/src/semmle/javascript/Expr.qll +++ b/javascript/ql/src/semmle/javascript/Expr.qll @@ -161,28 +161,38 @@ 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. */ - predicate getNullSensitiveContext() { - exists(ExprOrStmt ctx | - 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 - not ctx instanceof EqualityTest) or - (this = ctx.(UnaryExpr).getOperand() and - not ctx instanceof LogNotExpr) or - this = ctx.(UpdateExpr).getOperand() or - this = ctx.(CompoundAssignExpr).getLhs() or - this = ctx.(CompoundAssignExpr).getRhs() or - this = ctx.(AssignExpr).getRhs() or - this = ctx.(SpreadElement).getOperand() or - this = ctx.(ForOfStmt).getIterationDomain() - ) + predicate inNullSensitiveContext() { + exists(ExprOrStmt ctx | + 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 + not ctx instanceof EqualityTest + or + this = ctx.(UnaryExpr).getOperand() and + not ctx instanceof LogNotExpr + or + this = ctx.(UpdateExpr).getOperand() + or + this = ctx.(CompoundAssignExpr).getLhs() + or + this = ctx.(CompoundAssignExpr).getRhs() + or + this = ctx.(AssignExpr).getRhs() + or + this = ctx.(SpreadElement).getOperand() + or + this = ctx.(ForOfStmt).getIterationDomain() + ) } } From a16b5d36a8430b3248e483a310cfd7b77e60288f Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Mon, 1 Apr 2019 10:40:51 -0700 Subject: [PATCH 07/19] adds tests --- .../Expr/nullSensitiveContexts.js | 60 +++++++++++++++++++ .../Expr/nullSensitiveContexts.qll | 3 + 2 files changed, 63 insertions(+) create mode 100644 javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js create mode 100644 javascript/ql/test/library-tests/Expr/nullSensitiveContexts.qll 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..32e8e228d3ed --- /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) { } \ No newline at end of file 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() } From 0d0adada42241ae7d5912ef8e62eb61ea8a5cbd6 Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Mon, 1 Apr 2019 11:13:04 -0700 Subject: [PATCH 08/19] fixes tests and adds test results to expecteds --- .../Expr/nullSensitiveContexts.js | 6 +- .../ql/test/library-tests/Expr/tests.expected | 830 +++++++++++++++++- .../ql/test/library-tests/Expr/tests.ql | 1 + 3 files changed, 833 insertions(+), 4 deletions(-) diff --git a/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js b/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js index 32e8e228d3ed..45c17026122b 100644 --- a/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js +++ b/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js @@ -27,13 +27,13 @@ x *= y x /= y x %= y x , y = p -[1,2,...xs] +//[1,2,...xs] x & y x | y x ^ y x << y x >> y -x <<< y +x >>> y ~x x &= y x |= y @@ -57,4 +57,4 @@ x || y if (x) { } while (x) { } for (; y; z) { } -for (let x in y) { } \ No newline at end of file +for (let x in y) { } diff --git a/javascript/ql/test/library-tests/Expr/tests.expected b/javascript/ql/test/library-tests/Expr/tests.expected index dfb9852170d9..aaa5401b3739 100644 --- a/javascript/ql/test/library-tests/Expr/tests.expected +++ b/javascript/ql/test/library-tests/Expr/tests.expected @@ -1,4 +1,3 @@ -test_getParent | assignment.js:1:1:1:1 | a | assignment.js:1:1:1:6 | a = 23 | | assignment.js:1:1:1:6 | a = 23 | assignment.js:1:1:1:7 | a = 23; | | assignment.js:1:5:1:6 | 23 | assignment.js:1:1:1:6 | a = 23 | @@ -220,6 +219,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:8:1:8:3 | foo | nullSensitiveContexts.js:8:1:8:8 | foo[bar] | +| nullSensitiveContexts.js:8:1:8:8 | 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:3 | foo | nullSensitiveContexts.js:9:1:9:7 | foo.bar | +| nullSensitiveContexts.js:9:1:9:7 | foo.bar | nullSensitiveContexts.js:9:1:9:7 | foo.bar | +| nullSensitiveContexts.js:9:5:9:7 | bar | nullSensitiveContexts.js:9:1:9:7 | foo.bar | +| nullSensitiveContexts.js:10:1:10:7 | new Foo | nullSensitiveContexts.js:10:1:10:7 | new Foo | +| nullSensitiveContexts.js:10:5:10:7 | Foo | nullSensitiveContexts.js:10:1:10:7 | new Foo | +| nullSensitiveContexts.js:11:1:11:9 | new Foo() | nullSensitiveContexts.js:11:1:11:9 | new Foo() | +| nullSensitiveContexts.js:11:5:11:7 | Foo | nullSensitiveContexts.js:11:1:11:9 | new Foo() | +| nullSensitiveContexts.js:12:1:12:3 | foo | nullSensitiveContexts.js:12:1:12:7 | foo.bar | +| nullSensitiveContexts.js:12:1:12:7 | foo.bar | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | +| nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | +| nullSensitiveContexts.js:12:5:12:7 | bar | nullSensitiveContexts.js:12:1:12:7 | foo.bar | +| nullSensitiveContexts.js:12:11:12:11 | 5 | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | +| nullSensitiveContexts.js:13:1:13:3 | foo | nullSensitiveContexts.js:13:1:13:8 | foo(bar) | +| nullSensitiveContexts.js:13:1:13:8 | foo(bar) | nullSensitiveContexts.js:13:1:13:8 | foo(bar) | +| nullSensitiveContexts.js:13:5:13:7 | bar | nullSensitiveContexts.js:13:1:13:8 | foo(bar) | +| 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:5 | 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:5 | 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:5 | 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:5 | x / y | +| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:17:1:17:5 | x / y | +| nullSensitiveContexts.js:18:1:18:1 | x | nullSensitiveContexts.js:18:1:18:5 | x % y | +| nullSensitiveContexts.js:18:1:18:5 | x % y | nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | +| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:18:5:18:5 | y | nullSensitiveContexts.js:18:1:18:5 | x % y | +| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | +| nullSensitiveContexts.js:20:2:20:2 | x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:21:1:21:3 | ++x | nullSensitiveContexts.js:21:1:21:3 | ++x | +| nullSensitiveContexts.js:21:3:21:3 | x | nullSensitiveContexts.js:21:1:21:3 | ++x | +| nullSensitiveContexts.js:22:1:22:1 | x | nullSensitiveContexts.js:22:1:22:3 | x++ | +| nullSensitiveContexts.js:22:1:22:3 | x++ | nullSensitiveContexts.js:22:1:22:3 | x++ | +| nullSensitiveContexts.js:23:1:23:3 | --x | nullSensitiveContexts.js:23:1:23:3 | --x | +| nullSensitiveContexts.js:23:3:23:3 | x | nullSensitiveContexts.js:23:1:23:3 | --x | +| nullSensitiveContexts.js:24:1:24:1 | x | nullSensitiveContexts.js:24:1:24:3 | x-- | +| nullSensitiveContexts.js:24:1:24:3 | x-- | nullSensitiveContexts.js:24:1:24:3 | x-- | +| 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:6 | 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:6 | 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:6 | 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:6 | x /= y | +| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:1:28:6 | x /= y | +| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:29:1:29:6 | x %= y | +| nullSensitiveContexts.js:29:1:29:6 | x %= y | nullSensitiveContexts.js:29:1:29:6 | x %= y | +| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:29:1:29:6 | x %= y | +| nullSensitiveContexts.js:30:1:30:1 | x | nullSensitiveContexts.js:30:1:30:9 | x , y = p | +| nullSensitiveContexts.js:30:1:30:9 | x , y = p | nullSensitiveContexts.js:30:1:30:9 | x , y = p | +| nullSensitiveContexts.js:30:5:30:5 | y | nullSensitiveContexts.js:30:5:30:9 | y = p | +| nullSensitiveContexts.js:30:5:30:9 | y = p | nullSensitiveContexts.js:30:1:30:9 | x , y = p | +| nullSensitiveContexts.js:30:9:30:9 | p | nullSensitiveContexts.js:30:5:30:9 | y = p | +| 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:5 | 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:5 | 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:5 | x ^ y | +| nullSensitiveContexts.js:34:1:34:5 | x ^ y | nullSensitiveContexts.js:34:1:34:5 | x ^ y | +| nullSensitiveContexts.js:34:5:34:5 | y | nullSensitiveContexts.js:34:1:34:5 | 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:6 | 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:6 | x >> y | +| nullSensitiveContexts.js:36:1:36:6 | x >> y | nullSensitiveContexts.js:36:1:36:6 | x >> y | +| nullSensitiveContexts.js:36:6:36:6 | y | nullSensitiveContexts.js:36:1:36:6 | x >> y | +| nullSensitiveContexts.js:37:1:37:1 | x | nullSensitiveContexts.js:37:1:37:7 | x >>> y | +| nullSensitiveContexts.js:37:1:37:7 | x >>> y | nullSensitiveContexts.js:37:1:37:7 | x >>> y | +| nullSensitiveContexts.js:37:7:37:7 | y | nullSensitiveContexts.js:37:1:37:7 | x >>> y | +| nullSensitiveContexts.js:38:1:38:2 | ~x | nullSensitiveContexts.js:38:1:38:2 | ~x | +| nullSensitiveContexts.js:38:2:38:2 | x | nullSensitiveContexts.js:38:1:38:2 | ~x | +| 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:6 | 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:6 | 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:6 | x ^= y | +| nullSensitiveContexts.js:41:1:41:6 | x ^= y | nullSensitiveContexts.js:41:1:41:6 | x ^= y | +| nullSensitiveContexts.js:41:6:41:6 | y | nullSensitiveContexts.js:41:1:41:6 | 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:7 | 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:7 | x >>= y | +| nullSensitiveContexts.js:43:1:43:7 | x >>= y | nullSensitiveContexts.js:43:1:43:7 | x >>= y | +| nullSensitiveContexts.js:43:7:43:7 | y | nullSensitiveContexts.js:43:1:43:7 | x >>= y | +| nullSensitiveContexts.js:44:1:44:1 | x | nullSensitiveContexts.js:44:1:44:8 | x >>>= y | +| nullSensitiveContexts.js:44:1:44:8 | x >>>= y | nullSensitiveContexts.js:44:1:44:8 | x >>>= y | +| nullSensitiveContexts.js:44:8:44:8 | y | nullSensitiveContexts.js:44:1:44:8 | x >>>= y | +| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:45:6:45:10 | let x | +| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:45:10:45:10 | x | +| nullSensitiveContexts.js:45:15:45:15 | y | nullSensitiveContexts.js:45:1:45:20 | for (let x of y) { } | +| nullSensitiveContexts.js:56:1:56:1 | x | nullSensitiveContexts.js:56:1:56:6 | x && y | +| nullSensitiveContexts.js:56:1:56:6 | x && y | nullSensitiveContexts.js:56:1:56:6 | x && y | +| nullSensitiveContexts.js:56:6:56:6 | y | nullSensitiveContexts.js:56:1:56:6 | x && y | +| nullSensitiveContexts.js:57:1:57:1 | x | nullSensitiveContexts.js:57:1:57:6 | x \|\| y | +| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | nullSensitiveContexts.js:57:1:57:6 | x \|\| y | +| nullSensitiveContexts.js:57:6:57:6 | y | nullSensitiveContexts.js:57:1:57:6 | x \|\| y | +| nullSensitiveContexts.js:58:1:58:2 | !x | nullSensitiveContexts.js:58:1:58:2 | !x | +| nullSensitiveContexts.js:58:2:58:2 | x | nullSensitiveContexts.js:58:1:58:2 | !x | +| nullSensitiveContexts.js:59:5:59:5 | x | nullSensitiveContexts.js:59:1:59:10 | if (x) { } | +| nullSensitiveContexts.js:60:8:60:8 | x | nullSensitiveContexts.js:60:1:60:13 | while (x) { } | +| nullSensitiveContexts.js:61:8:61:8 | y | nullSensitiveContexts.js:61:1:61:16 | for (; y; z) { } | +| nullSensitiveContexts.js:61:11:61:11 | z | nullSensitiveContexts.js:61:1:61:16 | for (; y; z) { } | +| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:62:6:62:10 | let x | +| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:62:10:62:10 | x | +| nullSensitiveContexts.js:62:15:62:15 | y | nullSensitiveContexts.js:62:1:62: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 +672,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:8:1:8:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:8:1:8:8 | foo[bar] | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:8:5:8:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:9:1:9:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:9:1:9:7 | foo.bar | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:9:5:9:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:10:1:10:7 | new Foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:10:5:10:7 | Foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:11:1:11:9 | new Foo() | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:11:5:11:7 | Foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:12:1:12:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:12:1:12:7 | foo.bar | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:12:5:12:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:12:11:12:11 | 5 | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:13:1:13:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:13:1:13:8 | foo(bar) | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:13:5:13:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:14:1:14:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:14:1:14:5 | x + y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:14:5:14:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:15:1:15:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:15:1:15:5 | x - y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:15:5:15:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:16:1:16:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:16:1:16:5 | x * y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:16:5:16:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:17:1:17:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:17:1:17:5 | x / y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:18:1:18:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:18:1:18:5 | x % y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:18:5:18:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:20:2:20:2 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:21:1:21:3 | ++x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:21:3:21:3 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:22:1:22:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:22:1:22:3 | x++ | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:23:1:23:3 | --x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:23:3:23:3 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:24:1:24:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:24:1:24:3 | x-- | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:25:1:25:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:25:1:25:6 | x += y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:25:6:25:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:26:1:26:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:26:1:26:6 | x -= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:26:6:26:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:27:1:27:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:27:1:27:6 | x *= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:27:6:27:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:28:1:28:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:28:1:28:6 | x /= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:29:1:29:6 | x %= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:30:1:30:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:30:1:30:9 | x , y = p | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:30:5:30:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:30:5:30:9 | y = p | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:30:9:30:9 | p | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:32:1:32:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:32:1:32:5 | x & y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:32:5:32:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:33:1:33:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:33:1:33:5 | x \| y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:33:5:33:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:34:1:34:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:34:1:34:5 | x ^ y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:34:5:34:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:35:1:35:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:35:1:35:6 | x << y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:35:6:35:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:36:1:36:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:36:1:36:6 | x >> y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:36:6:36:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:37:1:37:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:37:1:37:7 | x >>> y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:37:7:37:7 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:38:1:38:2 | ~x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:38:2:38:2 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:39:1:39:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:39:1:39:6 | x &= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:39:6:39:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:40:1:40:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:40:1:40:6 | x \|= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:40:6:40:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:41:1:41:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:41:1:41:6 | x ^= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:41:6:41:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:42:1:42:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:42:1:42:7 | x <<= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:42:7:42:7 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:43:1:43:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:43:1:43:7 | x >>= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:43:7:43:7 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:44:1:44:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:44:1:44:8 | x >>>= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:44:8:44:8 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:45:15:45:15 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:56:1:56:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:56:1:56:6 | x && y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:56:6:56:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:57:1:57:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:57:6:57:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:58:1:58:2 | !x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:58:2:58:2 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:59:5:59:5 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:60:8:60:8 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:61:8:61:8 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:61:11:61:11 | z | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:62:15:62:15 | y | nullSensitiveContexts.js:1:1:63: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 +1049,82 @@ 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:8:1:8:8 | foo[bar] | 0 | nullSensitiveContexts.js:8:1:8:3 | foo | +| nullSensitiveContexts.js:8:1:8:8 | foo[bar] | 1 | nullSensitiveContexts.js:8:5:8:7 | bar | +| nullSensitiveContexts.js:9:1:9:7 | foo.bar | 0 | nullSensitiveContexts.js:9:1:9:3 | foo | +| nullSensitiveContexts.js:9:1:9:7 | foo.bar | 1 | nullSensitiveContexts.js:9:5:9:7 | bar | +| nullSensitiveContexts.js:10:1:10:7 | new Foo | -1 | nullSensitiveContexts.js:10:5:10:7 | Foo | +| nullSensitiveContexts.js:11:1:11:9 | new Foo() | -1 | nullSensitiveContexts.js:11:5:11:7 | Foo | +| nullSensitiveContexts.js:12:1:12:7 | foo.bar | 0 | nullSensitiveContexts.js:12:1:12:3 | foo | +| nullSensitiveContexts.js:12:1:12:7 | foo.bar | 1 | nullSensitiveContexts.js:12:5:12:7 | bar | +| nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | 0 | nullSensitiveContexts.js:12:1:12:7 | foo.bar | +| nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | 1 | nullSensitiveContexts.js:12:11:12:11 | 5 | +| nullSensitiveContexts.js:13:1:13:8 | foo(bar) | 0 | nullSensitiveContexts.js:13:5:13:7 | bar | +| nullSensitiveContexts.js:13:1:13:8 | foo(bar) | -1 | nullSensitiveContexts.js:13:1:13:3 | foo | +| 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:5 | x % y | 0 | nullSensitiveContexts.js:18:1:18:1 | x | +| nullSensitiveContexts.js:18:1:18:5 | x % y | 1 | nullSensitiveContexts.js:18:5:18:5 | y | +| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | 0 | nullSensitiveContexts.js:18:1:18:5 | x % y | +| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | 1 | nullSensitiveContexts.js:19:2:19:2 | x | +| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | 0 | nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | +| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | 1 | nullSensitiveContexts.js:20:2:20:2 | x | +| nullSensitiveContexts.js:21:1:21:3 | ++x | 0 | nullSensitiveContexts.js:21:3:21:3 | x | +| nullSensitiveContexts.js:22:1:22:3 | x++ | 0 | nullSensitiveContexts.js:22:1:22:1 | x | +| nullSensitiveContexts.js:23:1:23:3 | --x | 0 | nullSensitiveContexts.js:23:3:23:3 | x | +| nullSensitiveContexts.js:24:1:24:3 | x-- | 0 | nullSensitiveContexts.js:24:1:24:1 | x | +| 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:6 | x %= y | 0 | nullSensitiveContexts.js:29:1:29:1 | x | +| nullSensitiveContexts.js:29:1:29:6 | x %= y | 1 | nullSensitiveContexts.js:29:6:29:6 | y | +| nullSensitiveContexts.js:30:1:30:9 | x , y = p | 0 | nullSensitiveContexts.js:30:1:30:1 | x | +| nullSensitiveContexts.js:30:1:30:9 | x , y = p | 1 | nullSensitiveContexts.js:30:5:30:9 | y = p | +| nullSensitiveContexts.js:30:5:30:9 | y = p | 0 | nullSensitiveContexts.js:30:5:30:5 | y | +| nullSensitiveContexts.js:30:5:30:9 | y = p | 1 | nullSensitiveContexts.js:30:9:30:9 | p | +| 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:5 | x ^ y | 0 | nullSensitiveContexts.js:34:1:34:1 | x | +| nullSensitiveContexts.js:34:1:34:5 | x ^ y | 1 | nullSensitiveContexts.js:34:5:34:5 | 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:6 | x >> y | 0 | nullSensitiveContexts.js:36:1:36:1 | x | +| nullSensitiveContexts.js:36:1:36:6 | x >> y | 1 | nullSensitiveContexts.js:36:6:36:6 | y | +| nullSensitiveContexts.js:37:1:37:7 | x >>> y | 0 | nullSensitiveContexts.js:37:1:37:1 | x | +| nullSensitiveContexts.js:37:1:37:7 | x >>> y | 1 | nullSensitiveContexts.js:37:7:37:7 | y | +| nullSensitiveContexts.js:38:1:38:2 | ~x | 0 | nullSensitiveContexts.js:38:2:38:2 | x | +| 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:6 | x ^= y | 0 | nullSensitiveContexts.js:41:1:41:1 | x | +| nullSensitiveContexts.js:41:1:41:6 | x ^= y | 1 | nullSensitiveContexts.js:41:6:41:6 | 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:7 | x >>= y | 0 | nullSensitiveContexts.js:43:1:43:1 | x | +| nullSensitiveContexts.js:43:1:43:7 | x >>= y | 1 | nullSensitiveContexts.js:43:7:43:7 | y | +| nullSensitiveContexts.js:44:1:44:8 | x >>>= y | 0 | nullSensitiveContexts.js:44:1:44:1 | x | +| nullSensitiveContexts.js:44:1:44:8 | x >>>= y | 1 | nullSensitiveContexts.js:44:8:44:8 | y | +| nullSensitiveContexts.js:45:10:45:10 | x | 0 | nullSensitiveContexts.js:45:10:45:10 | x | +| nullSensitiveContexts.js:56:1:56:6 | x && y | 0 | nullSensitiveContexts.js:56:1:56:1 | x | +| nullSensitiveContexts.js:56:1:56:6 | x && y | 1 | nullSensitiveContexts.js:56:6:56:6 | y | +| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | 0 | nullSensitiveContexts.js:57:1:57:1 | x | +| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | 1 | nullSensitiveContexts.js:57:6:57:6 | y | +| nullSensitiveContexts.js:58:1:58:2 | !x | 0 | nullSensitiveContexts.js:58:2:58:2 | x | +| nullSensitiveContexts.js:62:10:62:10 | x | 0 | nullSensitiveContexts.js:62:10:62: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 +1367,104 @@ 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:8:1:8:3 | foo | +| nullSensitiveContexts.js:8:1:8:8 | foo[bar] | +| nullSensitiveContexts.js:8:5:8:7 | bar | +| nullSensitiveContexts.js:9:1:9:3 | foo | +| nullSensitiveContexts.js:9:1:9:7 | foo.bar | +| nullSensitiveContexts.js:9:5:9:7 | bar | +| nullSensitiveContexts.js:10:5:10:7 | Foo | +| nullSensitiveContexts.js:11:5:11:7 | Foo | +| nullSensitiveContexts.js:12:1:12:3 | foo | +| nullSensitiveContexts.js:12:1:12:7 | foo.bar | +| nullSensitiveContexts.js:12:5:12:7 | bar | +| nullSensitiveContexts.js:12:11:12:11 | 5 | +| nullSensitiveContexts.js:13:1:13:3 | foo | +| nullSensitiveContexts.js:13:5:13:7 | bar | +| 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:1 | x | +| nullSensitiveContexts.js:18:1:18:5 | x % y | +| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | +| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:18:5:18:5 | y | +| nullSensitiveContexts.js:19:2:19:2 | x | +| nullSensitiveContexts.js:20:2:20:2 | x | +| nullSensitiveContexts.js:21:3:21:3 | x | +| nullSensitiveContexts.js:22:1:22:1 | x | +| nullSensitiveContexts.js:23:3:23:3 | x | +| nullSensitiveContexts.js:24:1:24:1 | x | +| 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:1 | x | +| nullSensitiveContexts.js:29:6:29:6 | y | +| nullSensitiveContexts.js:30:1:30:1 | x | +| nullSensitiveContexts.js:30:5:30:5 | y | +| nullSensitiveContexts.js:30:9:30:9 | p | +| 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:5 | x ^ y | +| nullSensitiveContexts.js:34:5:34:5 | 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:6 | x >> y | +| nullSensitiveContexts.js:36:6:36:6 | y | +| nullSensitiveContexts.js:37:1:37:1 | x | +| nullSensitiveContexts.js:37:1:37:7 | x >>> y | +| nullSensitiveContexts.js:37:7:37:7 | y | +| nullSensitiveContexts.js:38:1:38:2 | ~x | +| nullSensitiveContexts.js:38:2:38:2 | x | +| 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:6:41:6 | 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:7:43:7 | y | +| nullSensitiveContexts.js:44:1:44:1 | x | +| nullSensitiveContexts.js:44:8:44:8 | y | +| nullSensitiveContexts.js:45:10:45:10 | x | +| nullSensitiveContexts.js:45:15:45:15 | y | +| nullSensitiveContexts.js:56:1:56:1 | x | +| nullSensitiveContexts.js:56:1:56:6 | x && y | +| nullSensitiveContexts.js:56:6:56:6 | y | +| nullSensitiveContexts.js:57:1:57:1 | x | +| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | +| nullSensitiveContexts.js:57:6:57:6 | y | +| nullSensitiveContexts.js:58:1:58:2 | !x | +| nullSensitiveContexts.js:58:2:58:2 | x | +| nullSensitiveContexts.js:59:5:59:5 | x | +| nullSensitiveContexts.js:60:8:60:8 | x | +| nullSensitiveContexts.js:61:8:61:8 | y | +| nullSensitiveContexts.js:61:11:61:11 | z | +| nullSensitiveContexts.js:62:10:62:10 | x | +| nullSensitiveContexts.js:62:15:62: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:8:1:8:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:8:1:8:8 | foo[bar] | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:8:5:8:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:9:1:9:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:9:1:9:7 | foo.bar | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:9:5:9:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:10:1:10:7 | new Foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:10:5:10:7 | Foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:11:1:11:9 | new Foo() | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:11:5:11:7 | Foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:12:1:12:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:12:1:12:7 | foo.bar | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:12:5:12:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:12:11:12:11 | 5 | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:13:1:13:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:13:1:13:8 | foo(bar) | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:13:5:13:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:14:1:14:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:14:1:14:5 | x + y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:14:5:14:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:15:1:15:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:15:1:15:5 | x - y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:15:5:15:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:16:1:16:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:16:1:16:5 | x * y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:16:5:16:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:17:1:17:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:17:1:17:5 | x / y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:18:1:18:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:18:1:18:5 | x % y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:18:5:18:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:20:2:20:2 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:21:1:21:3 | ++x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:21:3:21:3 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:22:1:22:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:22:1:22:3 | x++ | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:23:1:23:3 | --x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:23:3:23:3 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:24:1:24:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:24:1:24:3 | x-- | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:25:1:25:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:25:1:25:6 | x += y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:25:6:25:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:26:1:26:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:26:1:26:6 | x -= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:26:6:26:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:27:1:27:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:27:1:27:6 | x *= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:27:6:27:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:28:1:28:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:28:1:28:6 | x /= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:29:1:29:6 | x %= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:30:1:30:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:30:1:30:9 | x , y = p | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:30:5:30:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:30:5:30:9 | y = p | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:30:9:30:9 | p | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:32:1:32:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:32:1:32:5 | x & y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:32:5:32:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:33:1:33:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:33:1:33:5 | x \| y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:33:5:33:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:34:1:34:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:34:1:34:5 | x ^ y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:34:5:34:5 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:35:1:35:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:35:1:35:6 | x << y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:35:6:35:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:36:1:36:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:36:1:36:6 | x >> y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:36:6:36:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:37:1:37:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:37:1:37:7 | x >>> y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:37:7:37:7 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:38:1:38:2 | ~x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:38:2:38:2 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:39:1:39:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:39:1:39:6 | x &= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:39:6:39:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:40:1:40:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:40:1:40:6 | x \|= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:40:6:40:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:41:1:41:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:41:1:41:6 | x ^= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:41:6:41:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:42:1:42:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:42:1:42:7 | x <<= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:42:7:42:7 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:43:1:43:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:43:1:43:7 | x >>= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:43:7:43:7 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:44:1:44:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:44:1:44:8 | x >>>= y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:44:8:44:8 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:45:15:45:15 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:56:1:56:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:56:1:56:6 | x && y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:56:6:56:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:57:1:57:1 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:57:6:57:6 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:58:1:58:2 | !x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:58:2:58:2 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:59:5:59:5 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:60:8:60:8 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:61:8:61:8 | y | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:61:11:61:11 | z | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:1:1:63:0 | | +| nullSensitiveContexts.js:62:15:62:15 | y | nullSensitiveContexts.js:1:1:63: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:8:1:8:3 | foo | nullSensitiveContexts.js:8:1:8:8 | foo[bar] | +| nullSensitiveContexts.js:8:1:8:8 | 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:3 | foo | nullSensitiveContexts.js:9:1:9:7 | foo.bar | +| nullSensitiveContexts.js:9:1:9:7 | foo.bar | nullSensitiveContexts.js:9:1:9:7 | foo.bar | +| nullSensitiveContexts.js:9:5:9:7 | bar | nullSensitiveContexts.js:9:1:9:7 | foo.bar | +| nullSensitiveContexts.js:10:1:10:7 | new Foo | nullSensitiveContexts.js:10:1:10:7 | new Foo | +| nullSensitiveContexts.js:10:5:10:7 | Foo | nullSensitiveContexts.js:10:1:10:7 | new Foo | +| nullSensitiveContexts.js:11:1:11:9 | new Foo() | nullSensitiveContexts.js:11:1:11:9 | new Foo() | +| nullSensitiveContexts.js:11:5:11:7 | Foo | nullSensitiveContexts.js:11:1:11:9 | new Foo() | +| nullSensitiveContexts.js:12:1:12:3 | foo | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | +| nullSensitiveContexts.js:12:1:12:7 | foo.bar | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | +| nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | +| nullSensitiveContexts.js:12:5:12:7 | bar | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | +| nullSensitiveContexts.js:12:11:12:11 | 5 | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | +| nullSensitiveContexts.js:13:1:13:3 | foo | nullSensitiveContexts.js:13:1:13:8 | foo(bar) | +| nullSensitiveContexts.js:13:1:13:8 | foo(bar) | nullSensitiveContexts.js:13:1:13:8 | foo(bar) | +| nullSensitiveContexts.js:13:5:13:7 | bar | nullSensitiveContexts.js:13:1:13:8 | foo(bar) | +| 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:5 | 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:5 | 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:5 | 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:5 | x / y | +| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:17:1:17:5 | x / y | +| nullSensitiveContexts.js:18:1:18:1 | x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:18:1:18:5 | x % y | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:18:5:18:5 | y | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:20:2:20:2 | x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:21:1:21:3 | ++x | nullSensitiveContexts.js:21:1:21:3 | ++x | +| nullSensitiveContexts.js:21:3:21:3 | x | nullSensitiveContexts.js:21:1:21:3 | ++x | +| nullSensitiveContexts.js:22:1:22:1 | x | nullSensitiveContexts.js:22:1:22:3 | x++ | +| nullSensitiveContexts.js:22:1:22:3 | x++ | nullSensitiveContexts.js:22:1:22:3 | x++ | +| nullSensitiveContexts.js:23:1:23:3 | --x | nullSensitiveContexts.js:23:1:23:3 | --x | +| nullSensitiveContexts.js:23:3:23:3 | x | nullSensitiveContexts.js:23:1:23:3 | --x | +| nullSensitiveContexts.js:24:1:24:1 | x | nullSensitiveContexts.js:24:1:24:3 | x-- | +| nullSensitiveContexts.js:24:1:24:3 | x-- | nullSensitiveContexts.js:24:1:24:3 | x-- | +| 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:6 | 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:6 | 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:6 | 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:6 | x /= y | +| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:1:28:6 | x /= y | +| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:29:1:29:6 | x %= y | +| nullSensitiveContexts.js:29:1:29:6 | x %= y | nullSensitiveContexts.js:29:1:29:6 | x %= y | +| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:29:1:29:6 | x %= y | +| nullSensitiveContexts.js:30:1:30:1 | x | nullSensitiveContexts.js:30:1:30:9 | x , y = p | +| nullSensitiveContexts.js:30:1:30:9 | x , y = p | nullSensitiveContexts.js:30:1:30:9 | x , y = p | +| nullSensitiveContexts.js:30:5:30:5 | y | nullSensitiveContexts.js:30:1:30:9 | x , y = p | +| nullSensitiveContexts.js:30:5:30:9 | y = p | nullSensitiveContexts.js:30:1:30:9 | x , y = p | +| nullSensitiveContexts.js:30:9:30:9 | p | nullSensitiveContexts.js:30:1:30:9 | x , y = p | +| 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:5 | 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:5 | 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:5 | x ^ y | +| nullSensitiveContexts.js:34:1:34:5 | x ^ y | nullSensitiveContexts.js:34:1:34:5 | x ^ y | +| nullSensitiveContexts.js:34:5:34:5 | y | nullSensitiveContexts.js:34:1:34:5 | 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:6 | 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:6 | x >> y | +| nullSensitiveContexts.js:36:1:36:6 | x >> y | nullSensitiveContexts.js:36:1:36:6 | x >> y | +| nullSensitiveContexts.js:36:6:36:6 | y | nullSensitiveContexts.js:36:1:36:6 | x >> y | +| nullSensitiveContexts.js:37:1:37:1 | x | nullSensitiveContexts.js:37:1:37:7 | x >>> y | +| nullSensitiveContexts.js:37:1:37:7 | x >>> y | nullSensitiveContexts.js:37:1:37:7 | x >>> y | +| nullSensitiveContexts.js:37:7:37:7 | y | nullSensitiveContexts.js:37:1:37:7 | x >>> y | +| nullSensitiveContexts.js:38:1:38:2 | ~x | nullSensitiveContexts.js:38:1:38:2 | ~x | +| nullSensitiveContexts.js:38:2:38:2 | x | nullSensitiveContexts.js:38:1:38:2 | ~x | +| 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:6 | 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:6 | 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:6 | x ^= y | +| nullSensitiveContexts.js:41:1:41:6 | x ^= y | nullSensitiveContexts.js:41:1:41:6 | x ^= y | +| nullSensitiveContexts.js:41:6:41:6 | y | nullSensitiveContexts.js:41:1:41:6 | 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:7 | 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:7 | x >>= y | +| nullSensitiveContexts.js:43:1:43:7 | x >>= y | nullSensitiveContexts.js:43:1:43:7 | x >>= y | +| nullSensitiveContexts.js:43:7:43:7 | y | nullSensitiveContexts.js:43:1:43:7 | x >>= y | +| nullSensitiveContexts.js:44:1:44:1 | x | nullSensitiveContexts.js:44:1:44:8 | x >>>= y | +| nullSensitiveContexts.js:44:1:44:8 | x >>>= y | nullSensitiveContexts.js:44:1:44:8 | x >>>= y | +| nullSensitiveContexts.js:44:8:44:8 | y | nullSensitiveContexts.js:44:1:44:8 | x >>>= y | +| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:45:6:45:10 | let x | +| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:45:6:45:10 | let x | +| nullSensitiveContexts.js:45:15:45:15 | y | nullSensitiveContexts.js:45:1:45:20 | for (let x of y) { } | +| nullSensitiveContexts.js:56:1:56:1 | x | nullSensitiveContexts.js:56:1:56:6 | x && y | +| nullSensitiveContexts.js:56:1:56:6 | x && y | nullSensitiveContexts.js:56:1:56:6 | x && y | +| nullSensitiveContexts.js:56:6:56:6 | y | nullSensitiveContexts.js:56:1:56:6 | x && y | +| nullSensitiveContexts.js:57:1:57:1 | x | nullSensitiveContexts.js:57:1:57:6 | x \|\| y | +| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | nullSensitiveContexts.js:57:1:57:6 | x \|\| y | +| nullSensitiveContexts.js:57:6:57:6 | y | nullSensitiveContexts.js:57:1:57:6 | x \|\| y | +| nullSensitiveContexts.js:58:1:58:2 | !x | nullSensitiveContexts.js:58:1:58:2 | !x | +| nullSensitiveContexts.js:58:2:58:2 | x | nullSensitiveContexts.js:58:1:58:2 | !x | +| nullSensitiveContexts.js:59:5:59:5 | x | nullSensitiveContexts.js:59:1:59:10 | if (x) { } | +| nullSensitiveContexts.js:60:8:60:8 | x | nullSensitiveContexts.js:60:1:60:13 | while (x) { } | +| nullSensitiveContexts.js:61:8:61:8 | y | nullSensitiveContexts.js:61:1:61:16 | for (; y; z) { } | +| nullSensitiveContexts.js:61:11:61:11 | z | nullSensitiveContexts.js:61:1:61:16 | for (; y; z) { } | +| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:62:6:62:10 | let x | +| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:62:6:62:10 | let x | +| nullSensitiveContexts.js:62:15:62:15 | y | nullSensitiveContexts.js:62:1:62: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,174 @@ 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:1:5:1:6 | 23 | +| 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}) | +| 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:8:1:8:3 | foo | +| nullSensitiveContexts.js:8:5:8:7 | bar | +| nullSensitiveContexts.js:9:1:9:3 | foo | +| nullSensitiveContexts.js:10:5:10:7 | Foo | +| nullSensitiveContexts.js:11:5:11:7 | Foo | +| nullSensitiveContexts.js:12:1:12:3 | foo | +| nullSensitiveContexts.js:12:11:12:11 | 5 | +| nullSensitiveContexts.js:13:1:13:3 | foo | +| 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:18:1:18:1 | x | +| nullSensitiveContexts.js:18:1:18:5 | x % y | +| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | +| nullSensitiveContexts.js:18:5:18:5 | y | +| nullSensitiveContexts.js:19:2:19:2 | x | +| nullSensitiveContexts.js:20:2:20:2 | x | +| nullSensitiveContexts.js:21:3:21:3 | x | +| nullSensitiveContexts.js:22:1:22:1 | x | +| nullSensitiveContexts.js:23:3:23:3 | x | +| nullSensitiveContexts.js:24:1:24:1 | x | +| 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:1 | x | +| nullSensitiveContexts.js:29:6:29:6 | y | +| nullSensitiveContexts.js:30:9:30:9 | p | +| 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:5:34:5 | 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:6:36:6 | y | +| nullSensitiveContexts.js:37:1:37:1 | x | +| nullSensitiveContexts.js:37:7:37:7 | y | +| nullSensitiveContexts.js:38:2:38:2 | x | +| 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:6:41:6 | 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:7:43:7 | y | +| nullSensitiveContexts.js:44:1:44:1 | x | +| nullSensitiveContexts.js:44:8:44:8 | y | +| nullSensitiveContexts.js:45:15:45: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:2:2:2:3 | 42 | +| unary.js:4:2:4:2 | 2 | +| unary.js:5:8:5:13 | Object | +| unary.js:6:5:6:7 | (0) | +| 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 | 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 From 2b6869fff341bc40e4ce4483b63999de964944fb Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Mon, 1 Apr 2019 11:21:21 -0700 Subject: [PATCH 09/19] updates expecteds to reflect changes in the test file --- .../ql/test/library-tests/Expr/tests.expected | 1291 +++++++++-------- 1 file changed, 646 insertions(+), 645 deletions(-) diff --git a/javascript/ql/test/library-tests/Expr/tests.expected b/javascript/ql/test/library-tests/Expr/tests.expected index aaa5401b3739..39aecbf19ae7 100644 --- a/javascript/ql/test/library-tests/Expr/tests.expected +++ b/javascript/ql/test/library-tests/Expr/tests.expected @@ -1,3 +1,4 @@ +test_getParent | assignment.js:1:1:1:1 | a | assignment.js:1:1:1:6 | a = 23 | | assignment.js:1:1:1:6 | a = 23 | assignment.js:1:1:1:7 | a = 23; | | assignment.js:1:5:1:6 | 23 | assignment.js:1:1:1:6 | a = 23 | @@ -219,127 +220,127 @@ | 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:8:1:8:3 | foo | nullSensitiveContexts.js:8:1:8:8 | foo[bar] | -| nullSensitiveContexts.js:8:1:8:8 | 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:3 | foo | nullSensitiveContexts.js:9:1:9:7 | foo.bar | -| nullSensitiveContexts.js:9:1:9:7 | foo.bar | nullSensitiveContexts.js:9:1:9:7 | foo.bar | -| nullSensitiveContexts.js:9:5:9:7 | bar | nullSensitiveContexts.js:9:1:9:7 | foo.bar | -| nullSensitiveContexts.js:10:1:10:7 | new Foo | nullSensitiveContexts.js:10:1:10:7 | new Foo | -| nullSensitiveContexts.js:10:5:10:7 | Foo | nullSensitiveContexts.js:10:1:10:7 | new Foo | -| nullSensitiveContexts.js:11:1:11:9 | new Foo() | nullSensitiveContexts.js:11:1:11:9 | new Foo() | -| nullSensitiveContexts.js:11:5:11:7 | Foo | nullSensitiveContexts.js:11:1:11:9 | new Foo() | -| nullSensitiveContexts.js:12:1:12:3 | foo | nullSensitiveContexts.js:12:1:12:7 | foo.bar | -| nullSensitiveContexts.js:12:1:12:7 | foo.bar | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | -| nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | -| nullSensitiveContexts.js:12:5:12:7 | bar | nullSensitiveContexts.js:12:1:12:7 | foo.bar | -| nullSensitiveContexts.js:12:11:12:11 | 5 | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | -| nullSensitiveContexts.js:13:1:13:3 | foo | nullSensitiveContexts.js:13:1:13:8 | foo(bar) | -| nullSensitiveContexts.js:13:1:13:8 | foo(bar) | nullSensitiveContexts.js:13:1:13:8 | foo(bar) | -| nullSensitiveContexts.js:13:5:13:7 | bar | nullSensitiveContexts.js:13:1:13:8 | foo(bar) | -| 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:5 | 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:5 | 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:5 | 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:5 | x / y | -| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:17:1:17:5 | x / y | -| nullSensitiveContexts.js:18:1:18:1 | x | nullSensitiveContexts.js:18:1:18:5 | x % y | -| nullSensitiveContexts.js:18:1:18:5 | x % y | nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | -| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:18:5:18:5 | y | nullSensitiveContexts.js:18:1:18:5 | x % y | -| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | -| nullSensitiveContexts.js:20:2:20:2 | x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:21:1:21:3 | ++x | nullSensitiveContexts.js:21:1:21:3 | ++x | -| nullSensitiveContexts.js:21:3:21:3 | x | nullSensitiveContexts.js:21:1:21:3 | ++x | -| nullSensitiveContexts.js:22:1:22:1 | x | nullSensitiveContexts.js:22:1:22:3 | x++ | -| nullSensitiveContexts.js:22:1:22:3 | x++ | nullSensitiveContexts.js:22:1:22:3 | x++ | -| nullSensitiveContexts.js:23:1:23:3 | --x | nullSensitiveContexts.js:23:1:23:3 | --x | -| nullSensitiveContexts.js:23:3:23:3 | x | nullSensitiveContexts.js:23:1:23:3 | --x | -| nullSensitiveContexts.js:24:1:24:1 | x | nullSensitiveContexts.js:24:1:24:3 | x-- | -| nullSensitiveContexts.js:24:1:24:3 | x-- | nullSensitiveContexts.js:24:1:24:3 | x-- | -| 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:6 | 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:6 | 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:6 | 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:6 | x /= y | -| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:1:28:6 | x /= y | -| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:29:1:29:6 | x %= y | -| nullSensitiveContexts.js:29:1:29:6 | x %= y | nullSensitiveContexts.js:29:1:29:6 | x %= y | -| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:29:1:29:6 | x %= y | -| nullSensitiveContexts.js:30:1:30:1 | x | nullSensitiveContexts.js:30:1:30:9 | x , y = p | -| nullSensitiveContexts.js:30:1:30:9 | x , y = p | nullSensitiveContexts.js:30:1:30:9 | x , y = p | -| nullSensitiveContexts.js:30:5:30:5 | y | nullSensitiveContexts.js:30:5:30:9 | y = p | -| nullSensitiveContexts.js:30:5:30:9 | y = p | nullSensitiveContexts.js:30:1:30:9 | x , y = p | -| nullSensitiveContexts.js:30:9:30:9 | p | nullSensitiveContexts.js:30:5:30:9 | y = p | -| 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:5 | 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:5 | 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:5 | x ^ y | -| nullSensitiveContexts.js:34:1:34:5 | x ^ y | nullSensitiveContexts.js:34:1:34:5 | x ^ y | -| nullSensitiveContexts.js:34:5:34:5 | y | nullSensitiveContexts.js:34:1:34:5 | 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:6 | 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:6 | x >> y | -| nullSensitiveContexts.js:36:1:36:6 | x >> y | nullSensitiveContexts.js:36:1:36:6 | x >> y | -| nullSensitiveContexts.js:36:6:36:6 | y | nullSensitiveContexts.js:36:1:36:6 | x >> y | -| nullSensitiveContexts.js:37:1:37:1 | x | nullSensitiveContexts.js:37:1:37:7 | x >>> y | -| nullSensitiveContexts.js:37:1:37:7 | x >>> y | nullSensitiveContexts.js:37:1:37:7 | x >>> y | -| nullSensitiveContexts.js:37:7:37:7 | y | nullSensitiveContexts.js:37:1:37:7 | x >>> y | -| nullSensitiveContexts.js:38:1:38:2 | ~x | nullSensitiveContexts.js:38:1:38:2 | ~x | -| nullSensitiveContexts.js:38:2:38:2 | x | nullSensitiveContexts.js:38:1:38:2 | ~x | -| 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:6 | 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:6 | 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:6 | x ^= y | -| nullSensitiveContexts.js:41:1:41:6 | x ^= y | nullSensitiveContexts.js:41:1:41:6 | x ^= y | -| nullSensitiveContexts.js:41:6:41:6 | y | nullSensitiveContexts.js:41:1:41:6 | 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:7 | 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:7 | x >>= y | -| nullSensitiveContexts.js:43:1:43:7 | x >>= y | nullSensitiveContexts.js:43:1:43:7 | x >>= y | -| nullSensitiveContexts.js:43:7:43:7 | y | nullSensitiveContexts.js:43:1:43:7 | x >>= y | -| nullSensitiveContexts.js:44:1:44:1 | x | nullSensitiveContexts.js:44:1:44:8 | x >>>= y | -| nullSensitiveContexts.js:44:1:44:8 | x >>>= y | nullSensitiveContexts.js:44:1:44:8 | x >>>= y | -| nullSensitiveContexts.js:44:8:44:8 | y | nullSensitiveContexts.js:44:1:44:8 | x >>>= y | -| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:45:6:45:10 | let x | -| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:45:10:45:10 | x | -| nullSensitiveContexts.js:45:15:45:15 | y | nullSensitiveContexts.js:45:1:45:20 | for (let x of y) { } | -| nullSensitiveContexts.js:56:1:56:1 | x | nullSensitiveContexts.js:56:1:56:6 | x && y | -| nullSensitiveContexts.js:56:1:56:6 | x && y | nullSensitiveContexts.js:56:1:56:6 | x && y | -| nullSensitiveContexts.js:56:6:56:6 | y | nullSensitiveContexts.js:56:1:56:6 | x && y | -| nullSensitiveContexts.js:57:1:57:1 | x | nullSensitiveContexts.js:57:1:57:6 | x \|\| y | -| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | nullSensitiveContexts.js:57:1:57:6 | x \|\| y | -| nullSensitiveContexts.js:57:6:57:6 | y | nullSensitiveContexts.js:57:1:57:6 | x \|\| y | -| nullSensitiveContexts.js:58:1:58:2 | !x | nullSensitiveContexts.js:58:1:58:2 | !x | -| nullSensitiveContexts.js:58:2:58:2 | x | nullSensitiveContexts.js:58:1:58:2 | !x | -| nullSensitiveContexts.js:59:5:59:5 | x | nullSensitiveContexts.js:59:1:59:10 | if (x) { } | -| nullSensitiveContexts.js:60:8:60:8 | x | nullSensitiveContexts.js:60:1:60:13 | while (x) { } | -| nullSensitiveContexts.js:61:8:61:8 | y | nullSensitiveContexts.js:61:1:61:16 | for (; y; z) { } | -| nullSensitiveContexts.js:61:11:61:11 | z | nullSensitiveContexts.js:61:1:61:16 | for (; y; z) { } | -| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:62:6:62:10 | let x | -| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:62:10:62:10 | x | -| nullSensitiveContexts.js:62:15:62:15 | y | nullSensitiveContexts.js:62:1:62:20 | for (let x in y) { } | +| 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:8 | 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:7 | 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:7 | 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:9 | 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:11 | 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:8 | 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:5 | 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:5 | 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:5 | 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:5 | 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:18:2 | x % y\\n+x | +| nullSensitiveContexts.js:17:1:18:2 | x % y\\n+x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:17:1:17:5 | x % y | +| nullSensitiveContexts.js:18:2:18:2 | x | nullSensitiveContexts.js:17:1:18:2 | x % y\\n+x | +| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:20:1:20:3 | ++x | nullSensitiveContexts.js:20:1:20:3 | ++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:3 | x++ | +| nullSensitiveContexts.js:22:1:22:3 | --x | nullSensitiveContexts.js:22:1:22:3 | --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:3 | 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:6 | 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:6 | 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:6 | 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:6 | 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:6 | x %= y | +| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:1:28:6 | x %= y | +| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:29:1:29:9 | x , y = p | +| nullSensitiveContexts.js:29:1:29:9 | x , y = p | nullSensitiveContexts.js:29:1:29:9 | x , y = p | +| nullSensitiveContexts.js:29:5:29:5 | y | nullSensitiveContexts.js:29:5:29:9 | y = p | +| nullSensitiveContexts.js:29:5:29:9 | y = p | nullSensitiveContexts.js:29:1:29:9 | x , y = p | +| nullSensitiveContexts.js:29:9:29:9 | p | nullSensitiveContexts.js:29:5:29:9 | 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:5 | 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:5 | 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:5 | 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:6 | 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:6 | 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:7 | 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:2 | ~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:6 | 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:6 | 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:6 | 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:7 | 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:7 | 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:8 | 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:6 | 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:6 | 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:2 | !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 | @@ -672,127 +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:8:1:8:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:8:1:8:8 | foo[bar] | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:8:5:8:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:9:1:9:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:9:1:9:7 | foo.bar | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:9:5:9:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:10:1:10:7 | new Foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:10:5:10:7 | Foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:11:1:11:9 | new Foo() | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:11:5:11:7 | Foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:12:1:12:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:12:1:12:7 | foo.bar | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:12:5:12:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:12:11:12:11 | 5 | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:13:1:13:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:13:1:13:8 | foo(bar) | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:13:5:13:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:14:1:14:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:14:1:14:5 | x + y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:14:5:14:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:15:1:15:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:15:1:15:5 | x - y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:15:5:15:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:16:1:16:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:16:1:16:5 | x * y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:16:5:16:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:17:1:17:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:17:1:17:5 | x / y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:18:1:18:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:18:1:18:5 | x % y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:18:5:18:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:20:2:20:2 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:21:1:21:3 | ++x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:21:3:21:3 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:22:1:22:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:22:1:22:3 | x++ | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:23:1:23:3 | --x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:23:3:23:3 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:24:1:24:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:24:1:24:3 | x-- | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:25:1:25:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:25:1:25:6 | x += y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:25:6:25:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:26:1:26:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:26:1:26:6 | x -= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:26:6:26:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:27:1:27:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:27:1:27:6 | x *= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:27:6:27:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:28:1:28:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:28:1:28:6 | x /= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:29:1:29:6 | x %= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:30:1:30:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:30:1:30:9 | x , y = p | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:30:5:30:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:30:5:30:9 | y = p | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:30:9:30:9 | p | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:32:1:32:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:32:1:32:5 | x & y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:32:5:32:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:33:1:33:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:33:1:33:5 | x \| y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:33:5:33:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:34:1:34:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:34:1:34:5 | x ^ y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:34:5:34:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:35:1:35:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:35:1:35:6 | x << y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:35:6:35:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:36:1:36:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:36:1:36:6 | x >> y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:36:6:36:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:37:1:37:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:37:1:37:7 | x >>> y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:37:7:37:7 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:38:1:38:2 | ~x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:38:2:38:2 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:39:1:39:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:39:1:39:6 | x &= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:39:6:39:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:40:1:40:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:40:1:40:6 | x \|= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:40:6:40:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:41:1:41:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:41:1:41:6 | x ^= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:41:6:41:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:42:1:42:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:42:1:42:7 | x <<= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:42:7:42:7 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:43:1:43:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:43:1:43:7 | x >>= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:43:7:43:7 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:44:1:44:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:44:1:44:8 | x >>>= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:44:8:44:8 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:45:15:45:15 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:56:1:56:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:56:1:56:6 | x && y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:56:6:56:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:57:1:57:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:57:6:57:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:58:1:58:2 | !x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:58:2:58:2 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:59:5:59:5 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:60:8:60:8 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:61:8:61:8 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:61:11:61:11 | z | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:62:15:62:15 | y | nullSensitiveContexts.js:1:1:63:0 | | +| 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:1:18:2 | x % y\\n+x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:18:2:18: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:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:1:29:9 | x , y = p | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:5:29:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:5:29:9 | y = p | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:9:29:9 | 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 | | @@ -1049,82 +1050,82 @@ 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:8:1:8:8 | foo[bar] | 0 | nullSensitiveContexts.js:8:1:8:3 | foo | -| nullSensitiveContexts.js:8:1:8:8 | foo[bar] | 1 | nullSensitiveContexts.js:8:5:8:7 | bar | -| nullSensitiveContexts.js:9:1:9:7 | foo.bar | 0 | nullSensitiveContexts.js:9:1:9:3 | foo | -| nullSensitiveContexts.js:9:1:9:7 | foo.bar | 1 | nullSensitiveContexts.js:9:5:9:7 | bar | -| nullSensitiveContexts.js:10:1:10:7 | new Foo | -1 | nullSensitiveContexts.js:10:5:10:7 | Foo | -| nullSensitiveContexts.js:11:1:11:9 | new Foo() | -1 | nullSensitiveContexts.js:11:5:11:7 | Foo | -| nullSensitiveContexts.js:12:1:12:7 | foo.bar | 0 | nullSensitiveContexts.js:12:1:12:3 | foo | -| nullSensitiveContexts.js:12:1:12:7 | foo.bar | 1 | nullSensitiveContexts.js:12:5:12:7 | bar | -| nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | 0 | nullSensitiveContexts.js:12:1:12:7 | foo.bar | -| nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | 1 | nullSensitiveContexts.js:12:11:12:11 | 5 | -| nullSensitiveContexts.js:13:1:13:8 | foo(bar) | 0 | nullSensitiveContexts.js:13:5:13:7 | bar | -| nullSensitiveContexts.js:13:1:13:8 | foo(bar) | -1 | nullSensitiveContexts.js:13:1:13:3 | foo | -| 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:5 | x % y | 0 | nullSensitiveContexts.js:18:1:18:1 | x | -| nullSensitiveContexts.js:18:1:18:5 | x % y | 1 | nullSensitiveContexts.js:18:5:18:5 | y | -| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | 0 | nullSensitiveContexts.js:18:1:18:5 | x % y | -| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | 1 | nullSensitiveContexts.js:19:2:19:2 | x | -| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | 0 | nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | -| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | 1 | nullSensitiveContexts.js:20:2:20:2 | x | -| nullSensitiveContexts.js:21:1:21:3 | ++x | 0 | nullSensitiveContexts.js:21:3:21:3 | x | -| nullSensitiveContexts.js:22:1:22:3 | x++ | 0 | nullSensitiveContexts.js:22:1:22:1 | x | -| nullSensitiveContexts.js:23:1:23:3 | --x | 0 | nullSensitiveContexts.js:23:3:23:3 | x | -| nullSensitiveContexts.js:24:1:24:3 | x-- | 0 | nullSensitiveContexts.js:24:1:24:1 | x | -| 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:6 | x %= y | 0 | nullSensitiveContexts.js:29:1:29:1 | x | -| nullSensitiveContexts.js:29:1:29:6 | x %= y | 1 | nullSensitiveContexts.js:29:6:29:6 | y | -| nullSensitiveContexts.js:30:1:30:9 | x , y = p | 0 | nullSensitiveContexts.js:30:1:30:1 | x | -| nullSensitiveContexts.js:30:1:30:9 | x , y = p | 1 | nullSensitiveContexts.js:30:5:30:9 | y = p | -| nullSensitiveContexts.js:30:5:30:9 | y = p | 0 | nullSensitiveContexts.js:30:5:30:5 | y | -| nullSensitiveContexts.js:30:5:30:9 | y = p | 1 | nullSensitiveContexts.js:30:9:30:9 | p | -| 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:5 | x ^ y | 0 | nullSensitiveContexts.js:34:1:34:1 | x | -| nullSensitiveContexts.js:34:1:34:5 | x ^ y | 1 | nullSensitiveContexts.js:34:5:34:5 | 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:6 | x >> y | 0 | nullSensitiveContexts.js:36:1:36:1 | x | -| nullSensitiveContexts.js:36:1:36:6 | x >> y | 1 | nullSensitiveContexts.js:36:6:36:6 | y | -| nullSensitiveContexts.js:37:1:37:7 | x >>> y | 0 | nullSensitiveContexts.js:37:1:37:1 | x | -| nullSensitiveContexts.js:37:1:37:7 | x >>> y | 1 | nullSensitiveContexts.js:37:7:37:7 | y | -| nullSensitiveContexts.js:38:1:38:2 | ~x | 0 | nullSensitiveContexts.js:38:2:38:2 | x | -| 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:6 | x ^= y | 0 | nullSensitiveContexts.js:41:1:41:1 | x | -| nullSensitiveContexts.js:41:1:41:6 | x ^= y | 1 | nullSensitiveContexts.js:41:6:41:6 | 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:7 | x >>= y | 0 | nullSensitiveContexts.js:43:1:43:1 | x | -| nullSensitiveContexts.js:43:1:43:7 | x >>= y | 1 | nullSensitiveContexts.js:43:7:43:7 | y | -| nullSensitiveContexts.js:44:1:44:8 | x >>>= y | 0 | nullSensitiveContexts.js:44:1:44:1 | x | -| nullSensitiveContexts.js:44:1:44:8 | x >>>= y | 1 | nullSensitiveContexts.js:44:8:44:8 | y | -| nullSensitiveContexts.js:45:10:45:10 | x | 0 | nullSensitiveContexts.js:45:10:45:10 | x | -| nullSensitiveContexts.js:56:1:56:6 | x && y | 0 | nullSensitiveContexts.js:56:1:56:1 | x | -| nullSensitiveContexts.js:56:1:56:6 | x && y | 1 | nullSensitiveContexts.js:56:6:56:6 | y | -| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | 0 | nullSensitiveContexts.js:57:1:57:1 | x | -| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | 1 | nullSensitiveContexts.js:57:6:57:6 | y | -| nullSensitiveContexts.js:58:1:58:2 | !x | 0 | nullSensitiveContexts.js:58:2:58:2 | x | -| nullSensitiveContexts.js:62:10:62:10 | x | 0 | nullSensitiveContexts.js:62:10:62:10 | x | +| 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:17:1:18:2 | x % y\\n+x | 0 | nullSensitiveContexts.js:17:1:17:5 | x % y | +| nullSensitiveContexts.js:17:1:18:2 | x % y\\n+x | 1 | nullSensitiveContexts.js:18:2:18:2 | x | +| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | 0 | nullSensitiveContexts.js:17:1:18:2 | x % y\\n+x | +| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | 1 | 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:9 | x , y = p | 0 | nullSensitiveContexts.js:29:1:29:1 | x | +| nullSensitiveContexts.js:29:1:29:9 | x , y = p | 1 | nullSensitiveContexts.js:29:5:29:9 | y = p | +| nullSensitiveContexts.js:29:5:29:9 | y = p | 0 | nullSensitiveContexts.js:29:5:29:5 | y | +| nullSensitiveContexts.js:29:5:29:9 | y = p | 1 | nullSensitiveContexts.js:29:9:29:9 | 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 | @@ -1367,43 +1368,45 @@ 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:8 | foo[bar] | +| nullSensitiveContexts.js:8:1:8:7 | foo.bar | | nullSensitiveContexts.js:8:5:8:7 | bar | -| nullSensitiveContexts.js:9:1:9:3 | foo | -| nullSensitiveContexts.js:9:1:9:7 | foo.bar | -| nullSensitiveContexts.js:9:5:9:7 | bar | +| nullSensitiveContexts.js:9:5:9:7 | Foo | | nullSensitiveContexts.js:10:5:10:7 | Foo | -| nullSensitiveContexts.js:11:5:11: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:1:12:7 | foo.bar | | nullSensitiveContexts.js:12:5:12:7 | bar | -| nullSensitiveContexts.js:12:11:12:11 | 5 | -| nullSensitiveContexts.js:13:1:13:3 | foo | -| nullSensitiveContexts.js:13:5:13: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: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: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: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:1:17:5 | x % y | +| nullSensitiveContexts.js:17:1:18:2 | x % y\\n+x | +| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | | nullSensitiveContexts.js:17:5:17:5 | y | -| nullSensitiveContexts.js:18:1:18:1 | x | -| nullSensitiveContexts.js:18:1:18:5 | x % y | -| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | -| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:18:5:18:5 | y | +| nullSensitiveContexts.js:18:2:18:2 | x | | nullSensitiveContexts.js:19:2:19:2 | x | -| nullSensitiveContexts.js:20:2:20:2 | x | -| nullSensitiveContexts.js:21:3:21:3 | x | -| nullSensitiveContexts.js:22:1:22:1 | x | -| nullSensitiveContexts.js:23:3:23:3 | 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 | @@ -1413,58 +1416,56 @@ test_isPure | nullSensitiveContexts.js:28:1:28:1 | x | | nullSensitiveContexts.js:28:6:28:6 | y | | nullSensitiveContexts.js:29:1:29:1 | x | -| nullSensitiveContexts.js:29:6:29:6 | y | -| nullSensitiveContexts.js:30:1:30:1 | x | -| nullSensitiveContexts.js:30:5:30:5 | y | -| nullSensitiveContexts.js:30:9:30:9 | p | +| nullSensitiveContexts.js:29:5:29:5 | y | +| nullSensitiveContexts.js:29:9:29:9 | 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: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:1:33:5 | x ^ y | | nullSensitiveContexts.js:33:5:33:5 | y | | nullSensitiveContexts.js:34:1:34:1 | x | -| nullSensitiveContexts.js:34:1:34:5 | x ^ y | -| nullSensitiveContexts.js:34:5:34:5 | y | +| 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:1:35:6 | x >> y | | nullSensitiveContexts.js:35:6:35:6 | y | | nullSensitiveContexts.js:36:1:36:1 | x | -| nullSensitiveContexts.js:36:1:36:6 | x >> y | -| nullSensitiveContexts.js:36:6:36:6 | y | -| nullSensitiveContexts.js:37:1:37:1 | x | -| nullSensitiveContexts.js:37:1:37:7 | x >>> y | -| nullSensitiveContexts.js:37:7:37:7 | y | -| nullSensitiveContexts.js:38:1:38:2 | ~x | -| nullSensitiveContexts.js:38:2:38:2 | 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:6:41:6 | y | +| 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:7:43:7 | y | -| nullSensitiveContexts.js:44:1:44:1 | x | -| nullSensitiveContexts.js:44:8:44:8 | y | -| nullSensitiveContexts.js:45:10:45:10 | x | -| nullSensitiveContexts.js:45:15:45:15 | y | -| nullSensitiveContexts.js:56:1:56:1 | x | -| nullSensitiveContexts.js:56:1:56:6 | x && y | -| nullSensitiveContexts.js:56:6:56:6 | y | -| nullSensitiveContexts.js:57:1:57:1 | x | -| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | -| nullSensitiveContexts.js:57:6:57:6 | y | -| nullSensitiveContexts.js:58:1:58:2 | !x | -| nullSensitiveContexts.js:58:2:58:2 | x | -| nullSensitiveContexts.js:59:5:59:5 | x | -| nullSensitiveContexts.js:60:8:60:8 | x | -| nullSensitiveContexts.js:61:8:61:8 | y | -| nullSensitiveContexts.js:61:11:61:11 | z | -| nullSensitiveContexts.js:62:10:62:10 | x | -| nullSensitiveContexts.js:62:15:62:15 | y | +| 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 | @@ -1875,127 +1876,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:8:1:8:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:8:1:8:8 | foo[bar] | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:8:5:8:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:9:1:9:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:9:1:9:7 | foo.bar | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:9:5:9:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:10:1:10:7 | new Foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:10:5:10:7 | Foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:11:1:11:9 | new Foo() | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:11:5:11:7 | Foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:12:1:12:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:12:1:12:7 | foo.bar | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:12:5:12:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:12:11:12:11 | 5 | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:13:1:13:3 | foo | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:13:1:13:8 | foo(bar) | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:13:5:13:7 | bar | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:14:1:14:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:14:1:14:5 | x + y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:14:5:14:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:15:1:15:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:15:1:15:5 | x - y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:15:5:15:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:16:1:16:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:16:1:16:5 | x * y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:16:5:16:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:17:1:17:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:17:1:17:5 | x / y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:18:1:18:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:18:1:18:5 | x % y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:18:5:18:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:20:2:20:2 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:21:1:21:3 | ++x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:21:3:21:3 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:22:1:22:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:22:1:22:3 | x++ | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:23:1:23:3 | --x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:23:3:23:3 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:24:1:24:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:24:1:24:3 | x-- | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:25:1:25:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:25:1:25:6 | x += y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:25:6:25:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:26:1:26:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:26:1:26:6 | x -= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:26:6:26:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:27:1:27:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:27:1:27:6 | x *= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:27:6:27:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:28:1:28:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:28:1:28:6 | x /= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:29:1:29:6 | x %= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:30:1:30:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:30:1:30:9 | x , y = p | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:30:5:30:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:30:5:30:9 | y = p | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:30:9:30:9 | p | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:32:1:32:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:32:1:32:5 | x & y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:32:5:32:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:33:1:33:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:33:1:33:5 | x \| y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:33:5:33:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:34:1:34:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:34:1:34:5 | x ^ y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:34:5:34:5 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:35:1:35:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:35:1:35:6 | x << y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:35:6:35:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:36:1:36:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:36:1:36:6 | x >> y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:36:6:36:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:37:1:37:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:37:1:37:7 | x >>> y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:37:7:37:7 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:38:1:38:2 | ~x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:38:2:38:2 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:39:1:39:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:39:1:39:6 | x &= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:39:6:39:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:40:1:40:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:40:1:40:6 | x \|= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:40:6:40:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:41:1:41:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:41:1:41:6 | x ^= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:41:6:41:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:42:1:42:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:42:1:42:7 | x <<= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:42:7:42:7 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:43:1:43:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:43:1:43:7 | x >>= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:43:7:43:7 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:44:1:44:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:44:1:44:8 | x >>>= y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:44:8:44:8 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:45:15:45:15 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:56:1:56:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:56:1:56:6 | x && y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:56:6:56:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:57:1:57:1 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:57:6:57:6 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:58:1:58:2 | !x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:58:2:58:2 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:59:5:59:5 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:60:8:60:8 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:61:8:61:8 | y | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:61:11:61:11 | z | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:1:1:63:0 | | -| nullSensitiveContexts.js:62:15:62:15 | y | nullSensitiveContexts.js:1:1:63:0 | | +| 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:1:18:2 | x % y\\n+x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:18:2:18: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:1 | x | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:1:29:9 | x , y = p | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:5:29:5 | y | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:5:29:9 | y = p | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:29:9:29:9 | 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 | | @@ -2299,127 +2300,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:8:1:8:3 | foo | nullSensitiveContexts.js:8:1:8:8 | foo[bar] | -| nullSensitiveContexts.js:8:1:8:8 | 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:3 | foo | nullSensitiveContexts.js:9:1:9:7 | foo.bar | -| nullSensitiveContexts.js:9:1:9:7 | foo.bar | nullSensitiveContexts.js:9:1:9:7 | foo.bar | -| nullSensitiveContexts.js:9:5:9:7 | bar | nullSensitiveContexts.js:9:1:9:7 | foo.bar | -| nullSensitiveContexts.js:10:1:10:7 | new Foo | nullSensitiveContexts.js:10:1:10:7 | new Foo | -| nullSensitiveContexts.js:10:5:10:7 | Foo | nullSensitiveContexts.js:10:1:10:7 | new Foo | -| nullSensitiveContexts.js:11:1:11:9 | new Foo() | nullSensitiveContexts.js:11:1:11:9 | new Foo() | -| nullSensitiveContexts.js:11:5:11:7 | Foo | nullSensitiveContexts.js:11:1:11:9 | new Foo() | -| nullSensitiveContexts.js:12:1:12:3 | foo | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | -| nullSensitiveContexts.js:12:1:12:7 | foo.bar | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | -| nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | -| nullSensitiveContexts.js:12:5:12:7 | bar | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | -| nullSensitiveContexts.js:12:11:12:11 | 5 | nullSensitiveContexts.js:12:1:12:11 | foo.bar = 5 | -| nullSensitiveContexts.js:13:1:13:3 | foo | nullSensitiveContexts.js:13:1:13:8 | foo(bar) | -| nullSensitiveContexts.js:13:1:13:8 | foo(bar) | nullSensitiveContexts.js:13:1:13:8 | foo(bar) | -| nullSensitiveContexts.js:13:5:13:7 | bar | nullSensitiveContexts.js:13:1:13:8 | foo(bar) | -| 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:5 | 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:5 | 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:5 | 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:5 | x / y | -| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:17:1:17:5 | x / y | -| nullSensitiveContexts.js:18:1:18:1 | x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:18:1:18:5 | x % y | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:18:5:18:5 | y | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:20:2:20:2 | x | nullSensitiveContexts.js:18:1:20:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:21:1:21:3 | ++x | nullSensitiveContexts.js:21:1:21:3 | ++x | -| nullSensitiveContexts.js:21:3:21:3 | x | nullSensitiveContexts.js:21:1:21:3 | ++x | -| nullSensitiveContexts.js:22:1:22:1 | x | nullSensitiveContexts.js:22:1:22:3 | x++ | -| nullSensitiveContexts.js:22:1:22:3 | x++ | nullSensitiveContexts.js:22:1:22:3 | x++ | -| nullSensitiveContexts.js:23:1:23:3 | --x | nullSensitiveContexts.js:23:1:23:3 | --x | -| nullSensitiveContexts.js:23:3:23:3 | x | nullSensitiveContexts.js:23:1:23:3 | --x | -| nullSensitiveContexts.js:24:1:24:1 | x | nullSensitiveContexts.js:24:1:24:3 | x-- | -| nullSensitiveContexts.js:24:1:24:3 | x-- | nullSensitiveContexts.js:24:1:24:3 | x-- | -| 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:6 | 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:6 | 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:6 | 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:6 | x /= y | -| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:1:28:6 | x /= y | -| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:29:1:29:6 | x %= y | -| nullSensitiveContexts.js:29:1:29:6 | x %= y | nullSensitiveContexts.js:29:1:29:6 | x %= y | -| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:29:1:29:6 | x %= y | -| nullSensitiveContexts.js:30:1:30:1 | x | nullSensitiveContexts.js:30:1:30:9 | x , y = p | -| nullSensitiveContexts.js:30:1:30:9 | x , y = p | nullSensitiveContexts.js:30:1:30:9 | x , y = p | -| nullSensitiveContexts.js:30:5:30:5 | y | nullSensitiveContexts.js:30:1:30:9 | x , y = p | -| nullSensitiveContexts.js:30:5:30:9 | y = p | nullSensitiveContexts.js:30:1:30:9 | x , y = p | -| nullSensitiveContexts.js:30:9:30:9 | p | nullSensitiveContexts.js:30:1:30:9 | x , y = p | -| 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:5 | 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:5 | 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:5 | x ^ y | -| nullSensitiveContexts.js:34:1:34:5 | x ^ y | nullSensitiveContexts.js:34:1:34:5 | x ^ y | -| nullSensitiveContexts.js:34:5:34:5 | y | nullSensitiveContexts.js:34:1:34:5 | 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:6 | 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:6 | x >> y | -| nullSensitiveContexts.js:36:1:36:6 | x >> y | nullSensitiveContexts.js:36:1:36:6 | x >> y | -| nullSensitiveContexts.js:36:6:36:6 | y | nullSensitiveContexts.js:36:1:36:6 | x >> y | -| nullSensitiveContexts.js:37:1:37:1 | x | nullSensitiveContexts.js:37:1:37:7 | x >>> y | -| nullSensitiveContexts.js:37:1:37:7 | x >>> y | nullSensitiveContexts.js:37:1:37:7 | x >>> y | -| nullSensitiveContexts.js:37:7:37:7 | y | nullSensitiveContexts.js:37:1:37:7 | x >>> y | -| nullSensitiveContexts.js:38:1:38:2 | ~x | nullSensitiveContexts.js:38:1:38:2 | ~x | -| nullSensitiveContexts.js:38:2:38:2 | x | nullSensitiveContexts.js:38:1:38:2 | ~x | -| 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:6 | 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:6 | 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:6 | x ^= y | -| nullSensitiveContexts.js:41:1:41:6 | x ^= y | nullSensitiveContexts.js:41:1:41:6 | x ^= y | -| nullSensitiveContexts.js:41:6:41:6 | y | nullSensitiveContexts.js:41:1:41:6 | 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:7 | 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:7 | x >>= y | -| nullSensitiveContexts.js:43:1:43:7 | x >>= y | nullSensitiveContexts.js:43:1:43:7 | x >>= y | -| nullSensitiveContexts.js:43:7:43:7 | y | nullSensitiveContexts.js:43:1:43:7 | x >>= y | -| nullSensitiveContexts.js:44:1:44:1 | x | nullSensitiveContexts.js:44:1:44:8 | x >>>= y | -| nullSensitiveContexts.js:44:1:44:8 | x >>>= y | nullSensitiveContexts.js:44:1:44:8 | x >>>= y | -| nullSensitiveContexts.js:44:8:44:8 | y | nullSensitiveContexts.js:44:1:44:8 | x >>>= y | -| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:45:6:45:10 | let x | -| nullSensitiveContexts.js:45:10:45:10 | x | nullSensitiveContexts.js:45:6:45:10 | let x | -| nullSensitiveContexts.js:45:15:45:15 | y | nullSensitiveContexts.js:45:1:45:20 | for (let x of y) { } | -| nullSensitiveContexts.js:56:1:56:1 | x | nullSensitiveContexts.js:56:1:56:6 | x && y | -| nullSensitiveContexts.js:56:1:56:6 | x && y | nullSensitiveContexts.js:56:1:56:6 | x && y | -| nullSensitiveContexts.js:56:6:56:6 | y | nullSensitiveContexts.js:56:1:56:6 | x && y | -| nullSensitiveContexts.js:57:1:57:1 | x | nullSensitiveContexts.js:57:1:57:6 | x \|\| y | -| nullSensitiveContexts.js:57:1:57:6 | x \|\| y | nullSensitiveContexts.js:57:1:57:6 | x \|\| y | -| nullSensitiveContexts.js:57:6:57:6 | y | nullSensitiveContexts.js:57:1:57:6 | x \|\| y | -| nullSensitiveContexts.js:58:1:58:2 | !x | nullSensitiveContexts.js:58:1:58:2 | !x | -| nullSensitiveContexts.js:58:2:58:2 | x | nullSensitiveContexts.js:58:1:58:2 | !x | -| nullSensitiveContexts.js:59:5:59:5 | x | nullSensitiveContexts.js:59:1:59:10 | if (x) { } | -| nullSensitiveContexts.js:60:8:60:8 | x | nullSensitiveContexts.js:60:1:60:13 | while (x) { } | -| nullSensitiveContexts.js:61:8:61:8 | y | nullSensitiveContexts.js:61:1:61:16 | for (; y; z) { } | -| nullSensitiveContexts.js:61:11:61:11 | z | nullSensitiveContexts.js:61:1:61:16 | for (; y; z) { } | -| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:62:6:62:10 | let x | -| nullSensitiveContexts.js:62:10:62:10 | x | nullSensitiveContexts.js:62:6:62:10 | let x | -| nullSensitiveContexts.js:62:15:62:15 | y | nullSensitiveContexts.js:62:1:62:20 | for (let x in y) { } | +| 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:8 | 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:7 | 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:7 | 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:9 | 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:11 | foo.bar = 5 | +| 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:11 | foo.bar = 5 | +| nullSensitiveContexts.js:11:5:11:7 | bar | nullSensitiveContexts.js:11:1:11:11 | foo.bar = 5 | +| 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:8 | 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:5 | 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:5 | 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:5 | 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:5 | 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:19:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:17:1:17:5 | x % y | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:17:1:18:2 | x % y\\n+x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:18:2:18:2 | x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | +| nullSensitiveContexts.js:20:1:20:3 | ++x | nullSensitiveContexts.js:20:1:20:3 | ++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:3 | x++ | +| nullSensitiveContexts.js:22:1:22:3 | --x | nullSensitiveContexts.js:22:1:22:3 | --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:3 | 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:6 | 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:6 | 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:6 | 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:6 | 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:6 | x %= y | +| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:1:28:6 | x %= y | +| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:29:1:29:9 | x , y = p | +| nullSensitiveContexts.js:29:1:29:9 | x , y = p | nullSensitiveContexts.js:29:1:29:9 | x , y = p | +| nullSensitiveContexts.js:29:5:29:5 | y | nullSensitiveContexts.js:29:1:29:9 | x , y = p | +| nullSensitiveContexts.js:29:5:29:9 | y = p | nullSensitiveContexts.js:29:1:29:9 | x , y = p | +| nullSensitiveContexts.js:29:9:29:9 | p | nullSensitiveContexts.js:29:1:29:9 | 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:5 | 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:5 | 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:5 | 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:6 | 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:6 | 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:7 | 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:2 | ~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:6 | 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:6 | 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:6 | 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:7 | 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:7 | 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:8 | 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: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:6 | x && y | +| nullSensitiveContexts.js:54:1:54:6 | x && y | nullSensitiveContexts.js:54:1:54:6 | 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:6 | 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:2 | !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: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; | @@ -2614,14 +2615,16 @@ test_inNullSensitiveContext | 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:8:5:8:7 | bar | -| nullSensitiveContexts.js:9:1:9:3 | foo | +| nullSensitiveContexts.js:9:5:9:7 | Foo | | nullSensitiveContexts.js:10:5:10:7 | Foo | -| nullSensitiveContexts.js:11:5:11:7 | Foo | +| nullSensitiveContexts.js:11:1:11:3 | foo | +| nullSensitiveContexts.js:11:11:11:11 | 5 | | nullSensitiveContexts.js:12:1:12:3 | foo | -| nullSensitiveContexts.js:12:11:12:11 | 5 | -| nullSensitiveContexts.js:13:1:13: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 | @@ -2629,17 +2632,17 @@ test_inNullSensitiveContext | nullSensitiveContexts.js:16:1:16:1 | x | | 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:1:18:2 | x % y\\n+x | | nullSensitiveContexts.js:17:5:17:5 | y | -| nullSensitiveContexts.js:18:1:18:1 | x | -| nullSensitiveContexts.js:18:1:18:5 | x % y | -| nullSensitiveContexts.js:18:1:19:2 | x % y\\n+x | -| nullSensitiveContexts.js:18:5:18:5 | y | +| nullSensitiveContexts.js:18:2:18:2 | x | | nullSensitiveContexts.js:19:2:19:2 | x | -| nullSensitiveContexts.js:20:2:20:2 | x | -| nullSensitiveContexts.js:21:3:21:3 | x | -| nullSensitiveContexts.js:22:1:22:1 | x | -| nullSensitiveContexts.js:23:3:23:3 | 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 | @@ -2648,35 +2651,33 @@ test_inNullSensitiveContext | 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:1 | x | -| nullSensitiveContexts.js:29:6:29:6 | y | -| nullSensitiveContexts.js:30:9:30:9 | p | +| nullSensitiveContexts.js:29:9:29:9 | 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:5:34:5 | y | +| 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:6:36:6 | y | -| nullSensitiveContexts.js:37:1:37:1 | x | -| nullSensitiveContexts.js:37:7:37:7 | y | -| nullSensitiveContexts.js:38:2:38:2 | 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:6:41:6 | y | +| 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:7:43:7 | y | -| nullSensitiveContexts.js:44:1:44:1 | x | -| nullSensitiveContexts.js:44:8:44:8 | y | -| nullSensitiveContexts.js:45:15:45:15 | y | +| 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 | @@ -2699,4 +2700,4 @@ test_inNullSensitiveContext | 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 | +| update.js:4:1:4:1 | b | \ No newline at end of file From ec2e17f07a73dc52c1b44a78a8ea0ee77602e64d Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Wed, 3 Apr 2019 10:06:02 -0700 Subject: [PATCH 10/19] adds whitelist and recursive cases, per PR change req --- javascript/ql/src/semmle/javascript/Expr.qll | 30 +++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/javascript/ql/src/semmle/javascript/Expr.qll b/javascript/ql/src/semmle/javascript/Expr.qll index 1f3565b344e3..bfa1e2cda4ed 100644 --- a/javascript/ql/src/semmle/javascript/Expr.qll +++ b/javascript/ql/src/semmle/javascript/Expr.qll @@ -168,6 +168,7 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { */ predicate inNullSensitiveContext() { exists(ExprOrStmt ctx | + // bases cases this = ctx.(PropAccess).getBase() or this = ctx.(IndexExpr).getPropertyNameExpr() @@ -175,11 +176,18 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { this = ctx.(InvokeExpr).getCallee() or this = ctx.(BinaryExpr).getAnOperand() and - not ctx instanceof LogicalBinaryExpr and - not ctx instanceof EqualityTest + not ctx instanceof LogicalBinaryExpr and // x LOGOP y is fine b/c of implicit casting + not ctx instanceof EqualityTest and // x EQOP y is fine b/c of implicit casting and lack thereof + not ctx.(BitOrExpr).getAnOperand().(NumberLiteral).getIntValue() = 0 and // x | 0 is fine b/c it's used to cast to numbers + not ctx.(BitOrExpr).getAnOperand().(BigIntLiteral).getIntValue() = 0 and // x | 0 is fine b/c it's used to cast to numbers + not ctx.(RShiftExpr).getRightOperand().(NumberLiteral).getIntValue() = 0 and // x >> 0 is fine b/c it's used to cast to numbers + not ctx.(RShiftExpr).getRightOperand().(BigIntLiteral).getIntValue() = 0 and // x >> 0 is fine b/c it's used to cast to numbers + not ctx.(URShiftExpr).getRightOperand().(NumberLiteral).getIntValue() = 0 and // x >> 0 is fine b/c it's used to cast to numbers + not ctx.(URShiftExpr).getRightOperand().(BigIntLiteral).getIntValue() = 0 // x >> 0 is fine b/c it's used to cast to numbers or this = ctx.(UnaryExpr).getOperand() and - not ctx instanceof LogNotExpr + not ctx instanceof LogNotExpr and // !x is fine b/c of implicit casting + not ctx instanceof PlusExpr // +x is fine b/c of implicit casting or this = ctx.(UpdateExpr).getOperand() or @@ -187,11 +195,25 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { or this = ctx.(CompoundAssignExpr).getRhs() or - this = ctx.(AssignExpr).getRhs() + 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() ) } } From 5b87b85960dc9160d5fa459484c4e442e7a18f18 Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Thu, 4 Apr 2019 16:41:14 -0700 Subject: [PATCH 11/19] fixes comment language --- javascript/ql/src/semmle/javascript/Expr.qll | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/javascript/ql/src/semmle/javascript/Expr.qll b/javascript/ql/src/semmle/javascript/Expr.qll index bfa1e2cda4ed..a5181bfb83f1 100644 --- a/javascript/ql/src/semmle/javascript/Expr.qll +++ b/javascript/ql/src/semmle/javascript/Expr.qll @@ -176,18 +176,18 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { this = ctx.(InvokeExpr).getCallee() or this = ctx.(BinaryExpr).getAnOperand() and - not ctx instanceof LogicalBinaryExpr and // x LOGOP y is fine b/c of implicit casting - not ctx instanceof EqualityTest and // x EQOP y is fine b/c of implicit casting and lack thereof - not ctx.(BitOrExpr).getAnOperand().(NumberLiteral).getIntValue() = 0 and // x | 0 is fine b/c it's used to cast to numbers - not ctx.(BitOrExpr).getAnOperand().(BigIntLiteral).getIntValue() = 0 and // x | 0 is fine b/c it's used to cast to numbers - not ctx.(RShiftExpr).getRightOperand().(NumberLiteral).getIntValue() = 0 and // x >> 0 is fine b/c it's used to cast to numbers - not ctx.(RShiftExpr).getRightOperand().(BigIntLiteral).getIntValue() = 0 and // x >> 0 is fine b/c it's used to cast to numbers - not ctx.(URShiftExpr).getRightOperand().(NumberLiteral).getIntValue() = 0 and // x >> 0 is fine b/c it's used to cast to numbers - not ctx.(URShiftExpr).getRightOperand().(BigIntLiteral).getIntValue() = 0 // x >> 0 is fine b/c it's used to cast to numbers + 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.(BitOrExpr).getAnOperand().(BigIntLiteral).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.(RShiftExpr).getRightOperand().(BigIntLiteral).getIntValue() = 0 and // x >> 0 is fine because it's used to convert to numbers + not ctx.(URShiftExpr).getRightOperand().(NumberLiteral).getIntValue() = 0 and // x >> 0 is fine because it's used to convert to numbers + not ctx.(URShiftExpr).getRightOperand().(BigIntLiteral).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 b/c of implicit casting - not ctx instanceof PlusExpr // +x is fine b/c of implicit casting + not ctx instanceof LogNotExpr and // !x is fine because of implicit conversion + not ctx instanceof PlusExpr // +x is fine because of implicit conversion or this = ctx.(UpdateExpr).getOperand() or From b7939029bf4d34dc3b4312bbfc0508ef59a9f723 Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Thu, 4 Apr 2019 16:41:52 -0700 Subject: [PATCH 12/19] removes bigint cases --- javascript/ql/src/semmle/javascript/Expr.qll | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/javascript/ql/src/semmle/javascript/Expr.qll b/javascript/ql/src/semmle/javascript/Expr.qll index a5181bfb83f1..d2d349c94277 100644 --- a/javascript/ql/src/semmle/javascript/Expr.qll +++ b/javascript/ql/src/semmle/javascript/Expr.qll @@ -179,11 +179,8 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { 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.(BitOrExpr).getAnOperand().(BigIntLiteral).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.(RShiftExpr).getRightOperand().(BigIntLiteral).getIntValue() = 0 and // x >> 0 is fine because it's used to convert to numbers - not ctx.(URShiftExpr).getRightOperand().(NumberLiteral).getIntValue() = 0 and // x >> 0 is fine because it's used to convert to numbers - not ctx.(URShiftExpr).getRightOperand().(BigIntLiteral).getIntValue() = 0 // 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 From 280c334ab8bffb16bb6593b2634f84c529e090b9 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Fri, 5 Apr 2019 09:45:53 -0700 Subject: [PATCH 13/19] Update javascript/ql/src/semmle/javascript/Expr.qll Co-Authored-By: psygnisfive --- javascript/ql/src/semmle/javascript/Expr.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/ql/src/semmle/javascript/Expr.qll b/javascript/ql/src/semmle/javascript/Expr.qll index d2d349c94277..8f4acfb2e373 100644 --- a/javascript/ql/src/semmle/javascript/Expr.qll +++ b/javascript/ql/src/semmle/javascript/Expr.qll @@ -180,7 +180,7 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { 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 + 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 From 78407f85ee285b8ea8659033882301218a063f88 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Fri, 5 Apr 2019 09:46:09 -0700 Subject: [PATCH 14/19] Update javascript/ql/src/semmle/javascript/Expr.qll Co-Authored-By: psygnisfive --- javascript/ql/src/semmle/javascript/Expr.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/ql/src/semmle/javascript/Expr.qll b/javascript/ql/src/semmle/javascript/Expr.qll index 8f4acfb2e373..782a92fcd6fc 100644 --- a/javascript/ql/src/semmle/javascript/Expr.qll +++ b/javascript/ql/src/semmle/javascript/Expr.qll @@ -201,7 +201,7 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { or // recursive cases this = ctx.(ParExpr).getExpression() and - ctx.(ParExpr).inNullSensitiveContext() + ctx.inNullSensitiveContext() or this = ctx.(SeqExpr).getLastOperand() and ctx.(SeqExpr).inNullSensitiveContext() From 40e3a241a1ec51850ee4c7833548f2eb4e5f828b Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Fri, 5 Apr 2019 09:47:56 -0700 Subject: [PATCH 15/19] Revert "Update javascript/ql/src/semmle/javascript/Expr.qll" This reverts commit 78407f85ee285b8ea8659033882301218a063f88. --- javascript/ql/src/semmle/javascript/Expr.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/ql/src/semmle/javascript/Expr.qll b/javascript/ql/src/semmle/javascript/Expr.qll index 782a92fcd6fc..8f4acfb2e373 100644 --- a/javascript/ql/src/semmle/javascript/Expr.qll +++ b/javascript/ql/src/semmle/javascript/Expr.qll @@ -201,7 +201,7 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { or // recursive cases this = ctx.(ParExpr).getExpression() and - ctx.inNullSensitiveContext() + ctx.(ParExpr).inNullSensitiveContext() or this = ctx.(SeqExpr).getLastOperand() and ctx.(SeqExpr).inNullSensitiveContext() From c120cca9d35288de8f3926860b1c7d8e91a3b396 Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Mon, 8 Apr 2019 10:12:04 -0700 Subject: [PATCH 16/19] better explanation of null sensitive contexts --- javascript/ql/src/semmle/javascript/Expr.qll | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/javascript/ql/src/semmle/javascript/Expr.qll b/javascript/ql/src/semmle/javascript/Expr.qll index 8f4acfb2e373..4f169a3b225b 100644 --- a/javascript/ql/src/semmle/javascript/Expr.qll +++ b/javascript/ql/src/semmle/javascript/Expr.qll @@ -165,6 +165,13 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { /** * 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 | From d4f2172bdcca6abf0d27fdda2aefac3c5d80a764 Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Fri, 12 Apr 2019 10:39:20 -0700 Subject: [PATCH 17/19] void exprs are also ok --- javascript/ql/src/semmle/javascript/Expr.qll | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/javascript/ql/src/semmle/javascript/Expr.qll b/javascript/ql/src/semmle/javascript/Expr.qll index 4f169a3b225b..705d7b3aec40 100644 --- a/javascript/ql/src/semmle/javascript/Expr.qll +++ b/javascript/ql/src/semmle/javascript/Expr.qll @@ -191,7 +191,8 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { or this = ctx.(UnaryExpr).getOperand() and not ctx instanceof LogNotExpr and // !x is fine because of implicit conversion - not ctx instanceof PlusExpr // +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 From a66d1c0e095442dc4846d1d7baf8ad1cb40a9a7a Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Fri, 12 Apr 2019 10:39:34 -0700 Subject: [PATCH 18/19] fixes test errors --- .../Expr/nullSensitiveContexts.js | 2 +- .../ql/test/library-tests/Expr/tests.expected | 91 ++++++++++--------- 2 files changed, 50 insertions(+), 43 deletions(-) diff --git a/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js b/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js index 45c17026122b..451bc5049802 100644 --- a/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js +++ b/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js @@ -26,7 +26,7 @@ x -= y x *= y x /= y x %= y -x , y = p +[x , y] = p //[1,2,...xs] x & y x | y diff --git a/javascript/ql/test/library-tests/Expr/tests.expected b/javascript/ql/test/library-tests/Expr/tests.expected index 39aecbf19ae7..83990e5438f4 100644 --- a/javascript/ql/test/library-tests/Expr/tests.expected +++ b/javascript/ql/test/library-tests/Expr/tests.expected @@ -277,14 +277,15 @@ test_getParent | 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:6 | 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:6 | x %= y | -| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:1:28:6 | x %= y | -| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:29:1:29:9 | x , y = p | -| nullSensitiveContexts.js:29:1:29:9 | x , y = p | nullSensitiveContexts.js:29:1:29:9 | x , y = p | -| nullSensitiveContexts.js:29:5:29:5 | y | nullSensitiveContexts.js:29:5:29:9 | y = p | -| nullSensitiveContexts.js:29:5:29:9 | y = p | nullSensitiveContexts.js:29:1:29:9 | x , y = p | -| nullSensitiveContexts.js:29:9:29:9 | p | nullSensitiveContexts.js:29:5:29:9 | y = p | +| nullSensitiveContexts.js:28:1:28:1 | x | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | +| nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | +| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | +| nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | +| nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | +| nullSensitiveContexts.js:29:2:29:2 | x | nullSensitiveContexts.js:29:2:29:6 | x , y | +| nullSensitiveContexts.js:29:2:29:6 | x , y | nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | +| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:29:2:29:6 | x , y | +| nullSensitiveContexts.js:29:11:29:11 | p | nullSensitiveContexts.js:28:6:29:11 | y\\n[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:5 | x & y | | nullSensitiveContexts.js:31:5:31:5 | y | nullSensitiveContexts.js:31:1:31:5 | x & y | @@ -731,13 +732,14 @@ test_getTopLevel | 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:1:29:11 | x %= y\\n[x , y] = p | nullSensitiveContexts.js:1:1:61:0 | | | nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:29:1:29:9 | x , y = p | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:29:5:29:5 | y | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:29:5:29:9 | y = p | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:29:9:29:9 | p | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:28:6:29:11 | y\\n[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:2:29:6 | x , y | 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 | | @@ -1088,12 +1090,14 @@ test_getChild | 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:9 | x , y = p | 0 | nullSensitiveContexts.js:29:1:29:1 | x | -| nullSensitiveContexts.js:29:1:29:9 | x , y = p | 1 | nullSensitiveContexts.js:29:5:29:9 | y = p | -| nullSensitiveContexts.js:29:5:29:9 | y = p | 0 | nullSensitiveContexts.js:29:5:29:5 | y | -| nullSensitiveContexts.js:29:5:29:9 | y = p | 1 | nullSensitiveContexts.js:29:9:29:9 | p | +| nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | 0 | nullSensitiveContexts.js:28:1:28:1 | x | +| nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | 1 | nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | +| nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | 0 | nullSensitiveContexts.js:28:6:28:6 | y | +| nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | 1 | nullSensitiveContexts.js:29:2:29:6 | x , y | +| nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | 0 | nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | +| nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | 1 | nullSensitiveContexts.js:29:11:29:11 | p | +| nullSensitiveContexts.js:29:2:29:6 | x , y | 0 | nullSensitiveContexts.js:29:2:29:2 | x | +| nullSensitiveContexts.js:29:2:29:6 | x , y | 1 | nullSensitiveContexts.js:29:6:29:6 | y | | 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 | @@ -1415,9 +1419,11 @@ test_isPure | 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:1 | x | -| nullSensitiveContexts.js:29:5:29:5 | y | -| nullSensitiveContexts.js:29:9:29:9 | p | +| nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | +| nullSensitiveContexts.js:29:2:29:2 | x | +| nullSensitiveContexts.js:29:2:29:6 | x , y | +| 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 | @@ -1934,13 +1940,14 @@ test_getContainer | 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:1:29:11 | x %= y\\n[x , y] = p | nullSensitiveContexts.js:1:1:61:0 | | | nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:29:1:29:9 | x , y = p | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:29:5:29:5 | y | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:29:5:29:9 | y = p | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:29:9:29:9 | p | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | nullSensitiveContexts.js:1:1:61:0 | | +| nullSensitiveContexts.js:28:6:29:11 | y\\n[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:2:29:6 | x , y | 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 | | @@ -2357,14 +2364,15 @@ test_getEnclosingStmt | 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:6 | 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:6 | x %= y | -| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:1:28:6 | x %= y | -| nullSensitiveContexts.js:29:1:29:1 | x | nullSensitiveContexts.js:29:1:29:9 | x , y = p | -| nullSensitiveContexts.js:29:1:29:9 | x , y = p | nullSensitiveContexts.js:29:1:29:9 | x , y = p | -| nullSensitiveContexts.js:29:5:29:5 | y | nullSensitiveContexts.js:29:1:29:9 | x , y = p | -| nullSensitiveContexts.js:29:5:29:9 | y = p | nullSensitiveContexts.js:29:1:29:9 | x , y = p | -| nullSensitiveContexts.js:29:9:29:9 | p | nullSensitiveContexts.js:29:1:29:9 | x , y = p | +| nullSensitiveContexts.js:28:1:28:1 | x | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | +| nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | +| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | +| nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | +| nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | +| nullSensitiveContexts.js:29:2:29:2 | x | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | +| nullSensitiveContexts.js:29:2:29:6 | x , y | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | +| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | +| nullSensitiveContexts.js:29:11:29:11 | p | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[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:5 | x & y | | nullSensitiveContexts.js:31:5:31:5 | y | nullSensitiveContexts.js:31:1:31:5 | x & y | @@ -2531,7 +2539,6 @@ test_getEnclosingStmt | 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:1:5:1:6 | 23 | | assignment.js:2:1:2:1 | a | | assignment.js:2:6:2:7 | 19 | | assignment.js:3:1:3:1 | a | @@ -2607,6 +2614,7 @@ test_inNullSensitiveContext | 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 | @@ -2621,7 +2629,6 @@ test_inNullSensitiveContext | nullSensitiveContexts.js:9:5:9:7 | Foo | | nullSensitiveContexts.js:10:5:10:7 | Foo | | nullSensitiveContexts.js:11:1:11:3 | foo | -| nullSensitiveContexts.js:11:11:11:11 | 5 | | nullSensitiveContexts.js:12:1:12:3 | foo | | nullSensitiveContexts.js:13:1:13:1 | x | | nullSensitiveContexts.js:13:5:13:5 | y | @@ -2651,7 +2658,9 @@ test_inNullSensitiveContext | nullSensitiveContexts.js:27:6:27:6 | y | | nullSensitiveContexts.js:28:1:28:1 | x | | nullSensitiveContexts.js:28:6:28:6 | y | -| nullSensitiveContexts.js:29:9:29:9 | p | +| nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | +| nullSensitiveContexts.js:29:2:29:6 | x , y | +| nullSensitiveContexts.js:29:6:29:6 | y | | nullSensitiveContexts.js:31:1:31:1 | x | | nullSensitiveContexts.js:31:5:31:5 | y | | nullSensitiveContexts.js:32:1:32:1 | x | @@ -2691,10 +2700,8 @@ test_inNullSensitiveContext | surrogates.js:2:1:2:8 | /\\uD800/ | | surrogates.js:2:1:2:13 | /\\uD800/.test | | unary.js:1:2:1:3 | 23 | -| unary.js:2:2:2:3 | 42 | | unary.js:4:2:4:2 | 2 | | unary.js:5:8:5:13 | Object | -| unary.js:6:5:6:7 | (0) | | unary.js:7:8:7:13 | Object | | unary.js:7:8:7:23 | Object.prototype | | update.js:1:3:1:3 | a | From fb40548be511e74f30757c572352a95c6d8f2350 Mon Sep 17 00:00:00 2001 From: Rebecca Valentine Date: Fri, 12 Apr 2019 10:56:31 -0700 Subject: [PATCH 19/19] fixes semicolon issues --- .../Expr/nullSensitiveContexts.js | 78 ++-- .../ql/test/library-tests/Expr/tests.expected | 374 +++++++++--------- 2 files changed, 219 insertions(+), 233 deletions(-) diff --git a/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js b/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js index 451bc5049802..caa8e0046fe2 100644 --- a/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js +++ b/javascript/ql/test/library-tests/Expr/nullSensitiveContexts.js @@ -4,43 +4,43 @@ // // /////////////////// -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 +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 +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) { } @@ -51,9 +51,9 @@ for (let x of y) { } // // /////////////////////// -x && y -x || y -!x +x && y; +x || y; +!x; if (x) { } while (x) { } for (; y; z) { } diff --git a/javascript/ql/test/library-tests/Expr/tests.expected b/javascript/ql/test/library-tests/Expr/tests.expected index 83990e5438f4..4e080750fbad 100644 --- a/javascript/ql/test/library-tests/Expr/tests.expected +++ b/javascript/ql/test/library-tests/Expr/tests.expected @@ -221,119 +221,118 @@ test_getParent | 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: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: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:7 | new Foo | +| 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:9 | 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: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: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: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: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: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: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:18:2 | x % y\\n+x | -| nullSensitiveContexts.js:17:1:18:2 | x % y\\n+x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | +| 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:2:18:2 | x | nullSensitiveContexts.js:17:1:18:2 | x % y\\n+x | -| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:20:1:20:3 | ++x | nullSensitiveContexts.js:20:1:20:3 | ++x | +| 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:3 | x++ | -| nullSensitiveContexts.js:22:1:22:3 | --x | nullSensitiveContexts.js:22:1:22: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: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: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: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: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: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:29:11 | x %= y\\n[x , y] = p | -| nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | -| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | -| nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | -| nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | -| nullSensitiveContexts.js:29:2:29:2 | x | nullSensitiveContexts.js:29:2:29:6 | x , y | -| nullSensitiveContexts.js:29:2:29:6 | x , y | nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | -| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:29:2:29:6 | x , y | -| nullSensitiveContexts.js:29:11:29:11 | p | nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | +| 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: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: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: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: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: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: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:2 | ~x | +| 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: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: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: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: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: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: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: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: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:2 | !x | +| 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) { } | @@ -706,10 +705,10 @@ test_getTopLevel | 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:1:18:2 | x % y\\n+x | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | 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 | | @@ -732,12 +731,11 @@ test_getTopLevel | 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:29:11 | x %= y\\n[x , y] = p | 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:28:6:29:7 | y\\n[x , y] | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | 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:2:29:6 | x , y | 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 | | @@ -1074,10 +1072,8 @@ test_getChild | 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:17:1:18:2 | x % y\\n+x | 0 | nullSensitiveContexts.js:17:1:17:5 | x % y | -| nullSensitiveContexts.js:17:1:18:2 | x % y\\n+x | 1 | nullSensitiveContexts.js:18:2:18:2 | x | -| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | 0 | nullSensitiveContexts.js:17:1:18:2 | x % y\\n+x | -| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | 1 | nullSensitiveContexts.js:19:2:19:2 | x | +| 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 | @@ -1090,14 +1086,12 @@ test_getChild | 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:29:11 | x %= y\\n[x , y] = p | 0 | nullSensitiveContexts.js:28:1:28:1 | x | -| nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | 1 | nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | -| nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | 0 | nullSensitiveContexts.js:28:6:28:6 | y | -| nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | 1 | nullSensitiveContexts.js:29:2:29:6 | x , y | -| nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | 0 | nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | -| nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | 1 | nullSensitiveContexts.js:29:11:29:11 | p | -| nullSensitiveContexts.js:29:2:29:6 | x , y | 0 | nullSensitiveContexts.js:29:2:29:2 | x | -| nullSensitiveContexts.js:29:2:29:6 | x , y | 1 | nullSensitiveContexts.js:29:6:29: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 | @@ -1400,10 +1394,10 @@ test_isPure | 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:1:18:2 | x % y\\n+x | -| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | | 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 | @@ -1419,9 +1413,8 @@ test_isPure | nullSensitiveContexts.js:27:6:27:6 | y | | nullSensitiveContexts.js:28:1:28:1 | x | | nullSensitiveContexts.js:28:6:28:6 | y | -| nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | +| nullSensitiveContexts.js:29:1:29:7 | [x , y] | | nullSensitiveContexts.js:29:2:29:2 | x | -| nullSensitiveContexts.js:29:2:29:6 | x , y | | nullSensitiveContexts.js:29:6:29:6 | y | | nullSensitiveContexts.js:29:11:29:11 | p | | nullSensitiveContexts.js:31:1:31:1 | x | @@ -1914,10 +1907,10 @@ test_getContainer | 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:1:18:2 | x % y\\n+x | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | 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 | | @@ -1940,12 +1933,11 @@ test_getContainer | 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:29:11 | x %= y\\n[x , y] = p | 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:28:6:29:7 | y\\n[x , y] | nullSensitiveContexts.js:1:1:61:0 | | -| nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | 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:2:29:6 | x , y | 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 | | @@ -2307,121 +2299,120 @@ 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:8 | foo[bar] | -| nullSensitiveContexts.js:7:1:7:8 | foo[bar] | nullSensitiveContexts.js:7:1:7:8 | 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:7 | 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:7 | 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:9 | 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:11 | foo.bar = 5 | -| 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:11 | foo.bar = 5 | -| nullSensitiveContexts.js:11:5:11:7 | bar | nullSensitiveContexts.js:11:1:11:11 | foo.bar = 5 | -| 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:8 | 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:5 | 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:5 | 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:5 | 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:5 | 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:19:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:17:1:17:5 | x % y | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:17:1:18:2 | x % y\\n+x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:17:5:17:5 | y | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:18:2:18:2 | x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:19:2:19:2 | x | nullSensitiveContexts.js:17:1:19:2 | x % y\\n+x\\n-x | -| nullSensitiveContexts.js:20:1:20:3 | ++x | nullSensitiveContexts.js:20:1:20:3 | ++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:3 | x++ | -| nullSensitiveContexts.js:22:1:22:3 | --x | nullSensitiveContexts.js:22:1:22:3 | --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:3 | 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:6 | 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:6 | 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:6 | 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:6 | 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:29:11 | x %= y\\n[x , y] = p | -| nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | -| nullSensitiveContexts.js:28:6:28:6 | y | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | -| nullSensitiveContexts.js:28:6:29:7 | y\\n[x , y] | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | -| nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | -| nullSensitiveContexts.js:29:2:29:2 | x | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | -| nullSensitiveContexts.js:29:2:29:6 | x , y | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | -| nullSensitiveContexts.js:29:6:29:6 | y | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[x , y] = p | -| nullSensitiveContexts.js:29:11:29:11 | p | nullSensitiveContexts.js:28:1:29:11 | x %= y\\n[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:5 | 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:5 | 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:5 | 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:6 | 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:6 | 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:7 | 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:2 | ~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:6 | 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:6 | 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:6 | 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:7 | 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:7 | 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:8 | x >>>= y | -| nullSensitiveContexts.js:43:8:43:8 | y | nullSensitiveContexts.js:43:1:43:8 | x >>>= y | +| 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:6 | x && y | -| nullSensitiveContexts.js:54:1:54:6 | x && y | nullSensitiveContexts.js:54:1:54:6 | 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:6 | 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:2 | !x | -| nullSensitiveContexts.js:56:2:56:2 | x | nullSensitiveContexts.js:56:1:56:2 | !x | +| 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) { } | @@ -2639,10 +2630,7 @@ test_inNullSensitiveContext | nullSensitiveContexts.js:16:1:16:1 | x | | 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:1:18:2 | x % y\\n+x | | nullSensitiveContexts.js:17:5:17:5 | y | -| nullSensitiveContexts.js:18:2:18:2 | x | | nullSensitiveContexts.js:19:2:19:2 | x | | nullSensitiveContexts.js:20:3:20:3 | x | | nullSensitiveContexts.js:21:1:21:1 | x | @@ -2658,9 +2646,7 @@ test_inNullSensitiveContext | nullSensitiveContexts.js:27:6:27:6 | y | | nullSensitiveContexts.js:28:1:28:1 | x | | nullSensitiveContexts.js:28:6:28:6 | y | -| nullSensitiveContexts.js:28:6:29:11 | y\\n[x , y] = p | -| nullSensitiveContexts.js:29:2:29:6 | x , y | -| nullSensitiveContexts.js:29:6:29: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 |