From e672dc012dec829a13c6eeecc0e14b90c595b2f9 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 17 Aug 2012 11:25:41 +0200 Subject: [PATCH] check correctly for uninitialized use in try-with-resources and polyadic expressions --- .../psiutils/UninitializedReadCollector.java | 45 ++++++++++--------- .../InstanceVariableUninitializedUse.java | 17 +++++++ .../expected.xml | 4 ++ ...ariableUninitializedUseInspectionTest.java | 11 +++++ 4 files changed, 57 insertions(+), 20 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/initialization/instance_variable_uninitialized_use/InstanceVariableUninitializedUse.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/initialization/instance_variable_uninitialized_use/expected.xml create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/initialization/InstanceVariableUninitializedUseInspectionTest.java diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/UninitializedReadCollector.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/UninitializedReadCollector.java index 14ab38f80bc1..83f5e4676775 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/UninitializedReadCollector.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/UninitializedReadCollector.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2012 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. @@ -22,11 +22,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.HashSet; +import java.util.List; import java.util.Set; public class UninitializedReadCollector { - // Set to prevent duplicates private final Set uninitializedReads; private int counter = 0; @@ -36,15 +36,12 @@ public class UninitializedReadCollector { } public PsiExpression[] getUninitializedReads() { - final PsiExpression[] array = - new PsiExpression[uninitializedReads.size()]; - return uninitializedReads.toArray(array); + return uninitializedReads.toArray(new PsiExpression[uninitializedReads.size()]); } public boolean blockAssignsVariable(@Nullable PsiCodeBlock block, @NotNull PsiVariable variable) { - return blockAssignsVariable(block, variable, - counter, new HashSet()); + return blockAssignsVariable(block, variable, counter, new HashSet()); } private boolean blockAssignsVariable( @@ -264,10 +261,18 @@ public class UninitializedReadCollector { return false; } - private boolean tryStatementAssignsVariable( - @NotNull PsiTryStatement tryStatement, - @NotNull PsiVariable variable, - int stamp, @NotNull Set checkedMethods) { + private boolean tryStatementAssignsVariable(@NotNull PsiTryStatement tryStatement, @NotNull PsiVariable variable, + int stamp, @NotNull Set checkedMethods) { + final PsiResourceList resourceList = tryStatement.getResourceList(); + if (resourceList != null) { + final List resourceVariables = resourceList.getResourceVariables(); + for (PsiResourceVariable resourceVariable : resourceVariables) { + final PsiExpression initializer = resourceVariable.getInitializer(); + if (expressionAssignsVariable(initializer, variable, stamp, checkedMethods)) { + return true; + } + } + } final PsiCodeBlock tryBlock = tryStatement.getTryBlock(); boolean initializedInTryOrCatch = blockAssignsVariable(tryBlock, variable, stamp, checkedMethods); @@ -438,15 +443,15 @@ public class UninitializedReadCollector { return expressionAssignsVariable(operand, variable, stamp, checkedMethods); } - else if (expression instanceof PsiBinaryExpression) { - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)expression; - final PsiExpression lhs = binaryExpression.getLOperand(); - final PsiExpression rhs = binaryExpression.getROperand(); - return expressionAssignsVariable(lhs, variable, stamp, - checkedMethods) || - expressionAssignsVariable(rhs, variable, stamp, - checkedMethods); + else if (expression instanceof PsiPolyadicExpression) { + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; + final PsiExpression[] operands = polyadicExpression.getOperands(); + for (PsiExpression operand : operands) { + if (expressionAssignsVariable(operand, variable, stamp, checkedMethods)) { + return true; + } + } + return false; } else if (expression instanceof PsiConditionalExpression) { final PsiConditionalExpression conditional = diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/initialization/instance_variable_uninitialized_use/InstanceVariableUninitializedUse.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/initialization/instance_variable_uninitialized_use/InstanceVariableUninitializedUse.java new file mode 100644 index 000000000000..57e7e9167caa --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/initialization/instance_variable_uninitialized_use/InstanceVariableUninitializedUse.java @@ -0,0 +1,17 @@ +package com.siyeh.igtest.initialization.instance_variable_uninitialized_use; + +import java.io.IOException; + + + + +class InstanceVariableUnitializedUse { + + int i; + InstanceVariableUnitializedUse() throws IOException { + + try (java.io.FileInputStream in = new java.io.FileInputStream("asdf" + (i=3) + "asdf")) {} + System.out.println(i); + + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/initialization/instance_variable_uninitialized_use/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/initialization/instance_variable_uninitialized_use/expected.xml new file mode 100644 index 000000000000..e8f00e82629f --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/initialization/instance_variable_uninitialized_use/expected.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/initialization/InstanceVariableUninitializedUseInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/initialization/InstanceVariableUninitializedUseInspectionTest.java new file mode 100644 index 000000000000..afd90aea2e6f --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/initialization/InstanceVariableUninitializedUseInspectionTest.java @@ -0,0 +1,11 @@ +package com.siyeh.ig.initialization; + +import com.siyeh.ig.IGInspectionTestCase; + +public class InstanceVariableUninitializedUseInspectionTest + extends IGInspectionTestCase { + + public void test() throws Exception { + doTest("com/siyeh/igtest/initialization/instance_variable_uninitialized_use", new InstanceVariableUninitializedUseInspection()); + } +}