From a3e6b55f19b5ee53e72c90b00a514bc352adc93a Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 24 Mar 2021 16:37:24 +0700 Subject: [PATCH] [java-dfa] Ignore some contracts if method return value is not used GitOrigin-RevId: 2834d00f1385759947351f8b93d8fc6a18a45106 --- .../dataFlow/ControlFlowAnalyzer.java | 5 ++++ .../fixture/FlushedNullableOnUnknownCall.java | 26 +++++++++++++++++++ .../DataFlowInspectionTest.java | 1 + 3 files changed, 32 insertions(+) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/FlushedNullableOnUnknownCall.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 2dd7c447e020..de52a5db2c56 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -1710,6 +1710,11 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { anchor = reference; } else { + if (ExpressionUtils.isVoidContext(expression) && ContainerUtil.all(contracts, c -> + c.getReturnValue() != ContractReturnValue.fail() && !(c.getReturnValue() instanceof ContractReturnValue.ParameterReturnValue))) { + // Do not track contracts if return value is not used + contracts = Collections.emptyList(); + } addInstruction(new MethodCallInstruction(expression, myFactory.createValue(expression), contracts)); anchor = expression; } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/FlushedNullableOnUnknownCall.java b/java/java-tests/testData/inspection/dataFlow/fixture/FlushedNullableOnUnknownCall.java new file mode 100644 index 000000000000..ef963ae18304 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/FlushedNullableOnUnknownCall.java @@ -0,0 +1,26 @@ +import org.jetbrains.annotations.*; + +class Inspection { + + @Nullable + private Object o; + + public void test1() { + check(o); + foo(o); + } + + public static Object check(@Nullable final Object o) { + if (o != null && is()) { + } + return null; + } + + private static boolean is() { + System.out.println(); + return true; + } + + private static void foo(@NotNull final Object obj) { + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java index 7b9c2f2266fd..d89e591109eb 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -693,4 +693,5 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testFinalStaticFields() { doTest(); } public void testReassignInConstructor() { doTest(); } public void testCollectionViewsSize() { doTest(); } + public void testFlushedNullableOnUnknownCall() { doTest(); } }