From 145a513d7b26bcc56ccfdfd8775fab49edfc1015 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 27 Feb 2019 10:26:08 +0700 Subject: [PATCH] DfaMemoryStateImpl#applyUnboxedRelation: NPE fixed on erroneous code (EA-137969) --- .../codeInspection/dataFlow/DfaMemoryStateImpl.java | 2 +- .../dataFlow/value/DfaBinOpValue.java | 13 ++++++------- .../dataFlow/value/DfaConstValue.java | 1 + .../dataFlow/fixture/NewBoxedNumberEquality.java | 5 +++++ 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index d177892ba46f..c2f1d8656ff0 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -1137,7 +1137,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { DfaConstValue leftConst = getConstantValue(unboxedLeft); DfaConstValue rightConst = getConstantValue(unboxedRight); if (leftConst != null && rightConst != null) { - return leftConst.getValue().equals(rightConst.getValue()) != negated; + return Objects.equals(leftConst.getValue(), rightConst.getValue()) != negated; } if (negated && (PsiType.FLOAT.equals(unboxedLeft.getType()) || PsiType.DOUBLE.equals(unboxedLeft.getType()))) { // If floating point wrappers are not equal, unboxed versions could still be equal if they are 0.0 and -0.0 diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaBinOpValue.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaBinOpValue.java index d40d87aa9db0..5f5946cf1a59 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaBinOpValue.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaBinOpValue.java @@ -61,13 +61,12 @@ public class DfaBinOpValue extends DfaValue { @Override public String toString() { - String delimiter; - if (myOp == BinOp.PLUS && myRight instanceof DfaConstValue && - ((DfaConstValue)myRight).getValue() instanceof Long && - (Long)((DfaConstValue)myRight).getValue() < 0) { - delimiter = ""; - } else { - delimiter = myOp.toString(); + String delimiter = myOp.toString(); + if (myOp == BinOp.PLUS && myRight instanceof DfaConstValue) { + Object value = ((DfaConstValue)myRight).getValue(); + if (value instanceof Long && (Long)value < 0) { + delimiter = ""; + } } return myLeft + delimiter + myRight; } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaConstValue.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaConstValue.java index ee7a16e7cef7..9764e7e1159a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaConstValue.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaConstValue.java @@ -175,6 +175,7 @@ public class DfaConstValue extends DfaValue { return myType; } + @Nullable public Object getValue() { return myValue; } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NewBoxedNumberEquality.java b/java/java-tests/testData/inspection/dataFlow/fixture/NewBoxedNumberEquality.java index 1dc4ea5625a2..4d36446c7692 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/NewBoxedNumberEquality.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/NewBoxedNumberEquality.java @@ -16,4 +16,9 @@ class Testcase { } } + void test() { + int x = null; + Integer boxed = x; + if (boxed == 5) {} + } } \ No newline at end of file