check correctly for uninitialized use in try-with-resources and polyadic expressions

This commit is contained in:
Bas Leijdekkers
2012-08-17 11:25:41 +02:00
parent 6dd7004213
commit e672dc012d
4 changed files with 57 additions and 20 deletions
@@ -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<PsiExpression> 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<MethodSignature>());
return blockAssignsVariable(block, variable, counter, new HashSet<MethodSignature>());
}
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<MethodSignature> checkedMethods) {
private boolean tryStatementAssignsVariable(@NotNull PsiTryStatement tryStatement, @NotNull PsiVariable variable,
int stamp, @NotNull Set<MethodSignature> checkedMethods) {
final PsiResourceList resourceList = tryStatement.getResourceList();
if (resourceList != null) {
final List<PsiResourceVariable> 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 =
@@ -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);
}
}
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<problems>
</problems>
@@ -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());
}
}