From 9300034a9a237654330889b2e8049feb89d0a77b Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 13 Apr 2011 15:34:09 +0200 Subject: [PATCH] warn in more cases and optimization --- .../MismatchedArrayReadWriteInspection.java | 96 +++++++------------ .../MismatchedArrayReadWrite.java | 15 +++ .../mismatched_array_read_write/expected.xml | 29 ++++++ 3 files changed, 81 insertions(+), 59 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/MismatchedArrayReadWriteInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/MismatchedArrayReadWriteInspection.java index 8865ef364677..0c2b00284509 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/MismatchedArrayReadWriteInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/MismatchedArrayReadWriteInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 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. @@ -18,7 +18,6 @@ package com.siyeh.ig.bugs; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; -import com.siyeh.HardcodedMethodConstants; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -78,11 +77,7 @@ public class MismatchedArrayReadWriteInspection extends BaseInspection{ return; } final PsiClass containingClass = PsiUtil.getTopLevelClass(field); - if(containingClass == null){ - return; - } - final PsiType type = field.getType(); - if(type.getArrayDimensions() == 0){ + if(!checkVariable(field, containingClass)){ return; } final boolean written = @@ -99,11 +94,7 @@ public class MismatchedArrayReadWriteInspection extends BaseInspection{ super.visitLocalVariable(variable); final PsiCodeBlock codeBlock = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); - if(codeBlock == null){ - return; - } - final PsiType type = variable.getType(); - if(type.getArrayDimensions() == 0){ + if(!checkVariable(variable, codeBlock)){ return; } final boolean written = @@ -115,6 +106,28 @@ public class MismatchedArrayReadWriteInspection extends BaseInspection{ registerVariableError(variable, Boolean.valueOf(written)); } + private static boolean checkVariable(PsiVariable variable, + PsiElement context) { + if(context == null){ + return false; + } + final PsiType type = variable.getType(); + if(type.getArrayDimensions() == 0){ + return false; + } + if(VariableAccessUtils.variableIsAssigned(variable, context)){ + return false; + } + if(VariableAccessUtils.variableIsAssignedFrom(variable, context)){ + return false; + } + if(VariableAccessUtils.variableIsReturned(variable, context)){ + return false; + } + return !VariableAccessUtils.variableIsUsedInArrayInitializer( + variable, context); + } + private static boolean arrayContentsAreWritten(PsiVariable variable, PsiElement context){ if(VariableAccessUtils.arrayContentsAreAssigned(variable, context)){ @@ -124,20 +137,7 @@ public class MismatchedArrayReadWriteInspection extends BaseInspection{ if(initializer != null && !isDefaultArrayInitializer(initializer)){ return true; } - if(VariableAccessUtils.variableIsAssigned(variable, context)){ - return true; - } - if(VariableAccessUtils.variableIsAssignedFrom(variable, context)){ - return true; - } - if(VariableAccessUtils.variableIsReturned(variable, context)){ - return true; - } - if(variableIsWrittenAsMethodArgument(variable, context)) { - return true; - } - return VariableAccessUtils.variableIsUsedInArrayInitializer(variable, - context); + return variableIsWrittenAsMethodArgument(variable, context); } private static boolean arrayContentsAreRead(PsiVariable variable, @@ -145,24 +145,7 @@ public class MismatchedArrayReadWriteInspection extends BaseInspection{ if(VariableAccessUtils.arrayContentsAreAccessed(variable, context)){ return true; } - final PsiExpression initializer = variable.getInitializer(); - if(initializer != null && !isDefaultArrayInitializer(initializer)){ - return true; - } - if(VariableAccessUtils.variableIsAssigned(variable, context)){ - return true; - } - if(VariableAccessUtils.variableIsAssignedFrom(variable, context)){ - return true; - } - if(VariableAccessUtils.variableIsReturned(variable, context)){ - return true; - } - if(variableIsReadAsMethodArgument(variable, context)) { - return true; - } - return VariableAccessUtils.variableIsUsedInArrayInitializer(variable, - context); + return variableIsReadAsMethodArgument(variable, context); } private static boolean isDefaultArrayInitializer( @@ -170,21 +153,16 @@ public class MismatchedArrayReadWriteInspection extends BaseInspection{ if (initializer instanceof PsiNewExpression) { final PsiNewExpression newExpression = (PsiNewExpression) initializer; - return newExpression.getArrayInitializer() == null; - } else if (initializer instanceof PsiMethodCallExpression) { - final PsiMethodCallExpression methodCallExpression = - (PsiMethodCallExpression) initializer; - final PsiReferenceExpression methodExpression = - methodCallExpression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - if (!HardcodedMethodConstants.CLONE.equals(methodName)) { - return false; - } - final PsiExpressionList argumentList = - methodCallExpression.getArgumentList(); - final PsiExpression[] expressions = - argumentList.getExpressions(); - return expressions.length == 0; + final PsiArrayInitializerExpression arrayInitializer = + newExpression.getArrayInitializer(); + return arrayInitializer == null || + isDefaultArrayInitializer(arrayInitializer); + } else if (initializer instanceof PsiArrayInitializerExpression) { + final PsiArrayInitializerExpression arrayInitializerExpression = + (PsiArrayInitializerExpression) initializer; + final PsiExpression[] initializers = + arrayInitializerExpression.getInitializers(); + return initializers.length == 0; } return false; } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_array_read_write/MismatchedArrayReadWrite.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_array_read_write/MismatchedArrayReadWrite.java index 4feb02aadbb1..2084fd8cb339 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_array_read_write/MismatchedArrayReadWrite.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_array_read_write/MismatchedArrayReadWrite.java @@ -85,4 +85,19 @@ class Test{ array[0][1]++; System.out.println(array[0][1]); } + + void foo1() { + final int[] barzoom = {}; + barzoom[2] = 3; + } + + void foo2() { + final int[] barzoom = new int[]{}; + barzoom[2] = 3; + } + + void foo3(Object[] otherArr) { + Object[] arr = otherArr.clone(); + for (int i = 0; i < 10; i++) arr[i] = i; + } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_array_read_write/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_array_read_write/expected.xml index c322f7e4b800..c1b9fc0fdffa 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_array_read_write/expected.xml +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_array_read_write/expected.xml @@ -42,4 +42,33 @@ Contents of array <code>foo</code> are written to, but never read #loc + + MismatchedArrayReadWrite.java + 90 + Mismatched read and write of array + Contents of array <code>barzoom</code> are written to, but never read #loc + + + + MismatchedArrayReadWrite.java + 100 + Mismatched read and write of array + Contents of array <code>arr</code> are written to, but never read #loc + + + + MismatchedArrayReadWrite.java + 95 + Mismatched read and write of array + Contents of array <code>barzoom</code> are written to, but never read #loc + + + + MismatchedArrayReadWrite.java + 61 + Mismatched read and write of array + Contents of array <code>rowData</code> are written to, but never read #loc + + + \ No newline at end of file