From fb616e1fe74db60f5439ecc3225ebc39f731fac1 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 13 Jan 2017 12:02:11 +0100 Subject: [PATCH] IG: don't report null comparisons as uninitialized read (IDEA-61057) --- .../StaticVariableUninitializedUseInspection.java | 10 +++------- .../siyeh/ig/psiutils/UninitializedReadCollector.java | 8 ++++---- .../InstanceVariableUninitializedUse.html | 3 ++- .../StaticVariableUninitializedUse.html | 1 + .../StaticVariableUninitializedUse.java | 7 +++++++ 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/initialization/StaticVariableUninitializedUseInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/initialization/StaticVariableUninitializedUseInspection.java index 0a78c13415cd..68666d00bc34 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/initialization/StaticVariableUninitializedUseInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/initialization/StaticVariableUninitializedUseInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2017 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -90,12 +90,8 @@ public class StaticVariableUninitializedUseInspection extends BaseInspection { return; } } - final PsiClassInitializer[] initializers = - containingClass.getInitializers(); - // Do the static initializers come in actual order in file? - // (They need to.) - final UninitializedReadCollector uninitializedReadCollector = - new UninitializedReadCollector(); + final PsiClassInitializer[] initializers = containingClass.getInitializers(); + final UninitializedReadCollector uninitializedReadCollector = new UninitializedReadCollector(); boolean assigned = false; for (final PsiClassInitializer initializer : initializers) { if (!initializer.hasModifierProperty(PsiModifier.STATIC)) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/UninitializedReadCollector.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/UninitializedReadCollector.java index f5ddf7a566bd..cb973d9bcaa2 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/UninitializedReadCollector.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/UninitializedReadCollector.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2017 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -406,7 +406,7 @@ public class UninitializedReadCollector { private boolean assignmentExpressionAssignsVariable(@NotNull PsiAssignmentExpression assignment, @NotNull PsiVariable variable, int stamp, @NotNull Set checkedMethods) { - final PsiExpression lhs = assignment.getLExpression(); + final PsiExpression lhs = ParenthesesUtils.stripParentheses(assignment.getLExpression()); if (expressionAssignsVariable(lhs, variable, stamp, checkedMethods)) { return true; } @@ -430,7 +430,7 @@ public class UninitializedReadCollector { return true; } if (variable.equals(referenceExpression.resolve())) { - final PsiElement parent = referenceExpression.getParent(); + final PsiElement parent = ParenthesesUtils.getParentSkipParentheses(referenceExpression); if (parent instanceof PsiAssignmentExpression) { final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)parent; final PsiExpression rhs = assignmentExpression.getRExpression(); @@ -438,7 +438,7 @@ public class UninitializedReadCollector { checkReferenceExpression(referenceExpression, variable, qualifierExpression); } } - else { + else if (!(parent instanceof PsiExpression) || !ComparisonUtils.isNullComparison((PsiExpression)parent)) { checkReferenceExpression(referenceExpression, variable, qualifierExpression); } } diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/InstanceVariableUninitializedUse.html b/plugins/InspectionGadgets/src/inspectionDescriptions/InstanceVariableUninitializedUse.html index 612b304e112f..30530ed955ff 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/InstanceVariableUninitializedUse.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/InstanceVariableUninitializedUse.html @@ -1,6 +1,7 @@ -Reports reads of instance variables which are not yet initialized. +Reports instance variables which are read prior to initialization. +Equality checks with null are ignored by this inspection.

Note: This inspection uses a very conservative dataflow algorithm, and may report instance variables as uninitialized incorrectly. Variables reported as initialized will always be initialized. diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/StaticVariableUninitializedUse.html b/plugins/InspectionGadgets/src/inspectionDescriptions/StaticVariableUninitializedUse.html index d2f04be89d65..17532a75861d 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/StaticVariableUninitializedUse.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/StaticVariableUninitializedUse.html @@ -1,6 +1,7 @@ Reports static variables which are read prior to initialization. +Equality checks with null are ignored by this inspection.

Note: This inspection uses a very conservative dataflow algorithm, and may report static variables used uninitialized incorrectly. Variables reported as initialized will always be initialized. diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/initialization/static_variable_uninitialized_use/StaticVariableUninitializedUse.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/initialization/static_variable_uninitialized_use/StaticVariableUninitializedUse.java index 91055e99897f..e90eebbf9e56 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/initialization/static_variable_uninitialized_use/StaticVariableUninitializedUse.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/initialization/static_variable_uninitialized_use/StaticVariableUninitializedUse.java @@ -34,4 +34,11 @@ public class StaticVariableUninitializedUse { static int foo() { return i; } + + private static String T; + static { + System.out.println((T) != (null)); + (T) = "null"; + System.out.println((T)); + } }