From 6a2e1fe28411936f1838f8475be6fd33921555cc Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 19 Aug 2014 11:08:25 +0200 Subject: [PATCH] IDEA-128242 Static code analysis reports "always true" for conditions that are always false --- .../dataFlow/DfaMemoryStateImpl.java | 7 +++++ .../dataFlow/value/DfaVariableValue.java | 4 +++ .../fixture/GetterResultsNotSame.java | 26 +++++++++++++++++++ .../DataFlowInspectionTest.java | 1 + 4 files changed, 38 insertions(+) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/GetterResultsNotSame.java 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 1b6d1dfedfec..3f0caf47679e 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 @@ -640,6 +640,13 @@ public class DfaMemoryStateImpl implements DfaMemoryState { return true; } + if (dfaLeft == dfaRight) { + if (dfaLeft instanceof DfaVariableValue && ((DfaVariableValue)dfaLeft).containsCalls()) { + return true; + } + return !isNegated; + } + if (isNull(dfaLeft) && isNotNull(dfaRight) || isNull(dfaRight) && isNotNull(dfaLeft)) { return isNegated; } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java index 3030bef32934..840103f5c993 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java @@ -221,4 +221,8 @@ public class DfaVariableValue extends DfaValue { return true; } + public boolean containsCalls() { + return myVariable instanceof PsiMethod || myQualifier != null && myQualifier.containsCalls(); + } + } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/GetterResultsNotSame.java b/java/java-tests/testData/inspection/dataFlow/fixture/GetterResultsNotSame.java new file mode 100644 index 000000000000..1b60a7373900 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/GetterResultsNotSame.java @@ -0,0 +1,26 @@ +class Main { + + public static String getSameObject() { + return ""; // same object for any call + } + + public static Main getNewObject() { + return new Main(); // different objects for different subsequent calls + } + + public static void main(String[] args) { + Main m = new Main(); + + if (m.getSameObject() == m.getSameObject()) { + System.out.println("This will get printed"); + } + + if (m.getNewObject() == m.getNewObject()) { + System.out.println("This will not get printed"); + } + + if (Main.getNewObject() == Main.getNewObject()) { + System.out.println("This will not get printed"); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index 33eb32eb0ec6..bd129b7aa3a6 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -214,6 +214,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testNoConfusionWithAnonymousConstantInitializer() { doTest(); } public void testForeachOverWildcards() { doTest(); } public void testFinalGetter() { doTest(); } + public void testGetterResultsNotSame() { doTest(); } public void testByteBufferGetter() { myFixture.addClass("package java.nio; public class MappedByteBuffer { public int getInt() {} }");