From da62a731acf2ae51ade0b5ff3fcd45006eade49d Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 17 Apr 2023 14:43:11 +0200 Subject: [PATCH] [java-dfa] Avoid false-positive NPE warnings inside java.lang.System source MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes IDEA-316248 Inspection "Method invocation ‘println’ will produce ‘NullPointerException’" on System.err GitOrigin-RevId: 0d257c09bff9712299bc749288703d057dfa3fdb --- .../dataFlow/java/JavaDfaValueFactory.java | 2 +- .../dataFlow/fixture/SystemOutNullSource.java | 12 ++++++++++++ .../java/codeInspection/DataFlowInspectionTest.java | 3 ++- 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/SystemOutNullSource.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/JavaDfaValueFactory.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/JavaDfaValueFactory.java index ee8584395444..e0107dec460e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/JavaDfaValueFactory.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/JavaDfaValueFactory.java @@ -120,7 +120,7 @@ public final class JavaDfaValueFactory { private static DfaValue createReferenceValue(DfaValueFactory factory, @NotNull PsiReferenceExpression refExpr) { PsiElement target = refExpr.resolve(); if (target instanceof PsiVariable variable) { - if (!PsiUtil.isAccessedForWriting(refExpr)) { + if (!PsiUtil.isAccessedForWriting(refExpr) && !PlainDescriptor.hasInitializationHacks(variable)) { DfaValue constValue = getConstantFromVariable(factory, variable); if (constValue != null && !maybeUninitializedConstant(constValue, refExpr, variable)) return constValue; } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/SystemOutNullSource.java b/java/java-tests/testData/inspection/dataFlow/fixture/SystemOutNullSource.java new file mode 100644 index 000000000000..c80936ede38c --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/SystemOutNullSource.java @@ -0,0 +1,12 @@ +// IDEA-316248 +package java.lang; + +import java.io.PrintStream; + +class System { + public static final PrintStream out = null; + + void test() { + out.println(1); + } +} \ 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 60edd3bb12b0..5c6be66608c0 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -1,4 +1,4 @@ -// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.java.codeInspection; import com.intellij.JavaTestUtil; @@ -724,4 +724,5 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testTryWithResourcesCloseThrows() { doTest(); } public void testBooleanOrEquals() { doTest(); } public void testDuplicatedByPointlessBooleanInspection() { doTest(); } + public void testSystemOutNullSource() { doTest(); } }