DFA: Fix array flushing on assignment special case (unknown = unknown)

This commit is contained in:
Tagir Valeev
2019-01-04 16:23:49 +07:00
parent 4db99cd17a
commit 81baaf47e3
3 changed files with 28 additions and 0 deletions
@@ -59,6 +59,7 @@ public class StandardInstructionVisitor extends InstructionVisitor {
}
if (dfaSource == dfaDest) {
memState.push(dfaDest);
flushArrayOnUnknownAssignment(instruction, runner.getFactory(), dfaDest, memState);
return nextInstruction(instruction, runner, memState);
}
if (!(dfaDest instanceof DfaVariableValue &&
@@ -0,0 +1,26 @@
public class TwoArraysDiff {
public void test(Iterable<String> net) {
final int size = 3;
final double[] d1 = new double[size];
int count = 0;
for (String s : net) {
d1[count++] = calculate();
}
final double[] d2 = new double[size];
count = 0;
for (String s : net) {
d2[count++] = calculate();
}
for (int i = 0; i < size; i++) {
assertTrue(d2[i] < d1[i]);
}
}
static void assertTrue(boolean b) {
if (!b) {
throw new AssertionError();
}
}
native double calculate();
}
@@ -57,4 +57,5 @@ public class DataFlowRangeAnalysisTest extends DataFlowInspectionTestCase {
public void testBoxedRanges() { doTest(); }
public void testLongRangeDiff() { doTest(); }
public void testAlgebraic() { doTest(); }
public void testTwoArraysDiff() { doTest(); }
}