From 58bd65acee56c23dc37d342c1bb912fc4233fd1d Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 28 Nov 2017 10:12:08 +0700 Subject: [PATCH] DFA: do not flush array length on element write --- .../dataFlow/InstructionVisitor.java | 4 +++- .../dataFlow/fixture/ArrayLength.java | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/InstructionVisitor.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/InstructionVisitor.java index 5ddf9cb0a570..2e5250d657d8 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/InstructionVisitor.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/InstructionVisitor.java @@ -139,7 +139,9 @@ public abstract class InstructionVisitor { if (variable != null) { if (instruction.isDependentsOnly()) { for (DfaVariableValue qualified : runner.getFactory().getVarFactory().getAllQualifiedBy(variable)) { - memState.flushVariable(qualified); + if (qualified.isFlushableByCalls()) { + memState.flushVariable(qualified); + } } } else { diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ArrayLength.java b/java/java-tests/testData/inspection/dataFlow/fixture/ArrayLength.java index 2250766f8d45..b1369090e356 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/ArrayLength.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ArrayLength.java @@ -1,6 +1,23 @@ import java.util.Arrays; public final class ArrayLength { + void testEquality(int[] x) { + int len = x.length; + for(int i=0; i<100; i++) { + if (i == len) { + x[i] = 10; + } + } + } + + int[] testFor(int length) { + int[] x = new int[length]; + for(int i=0; i<=length; i++) { + x[i] = 1; + } + return x; + } + public static void testArray2(Object[] x, Object[] y, int a) { if(x[a] == null && a == x.length) { System.out.println("Impossible");