dfa: exception handling reworked

no more gosub-return causing equal states differing by offset stack only
  don't visit outer finally without visiting inner one
This commit is contained in:
peter
2013-10-12 23:00:40 +02:00
parent 3744d2ce50
commit 099ead0d64
11 changed files with 261 additions and 270 deletions
@@ -0,0 +1,43 @@
public class Foo {
Foo getFoo() { return <warning descr="'null' is returned by the method which isn't declared as @Nullable">null</warning>; }
void foo() {
try {
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo().getFoo();
} finally {
if (hashCode() == 2) {
System.out.println();
}
}
}
}
@@ -0,0 +1,54 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.Throwable;
import java.net.Socket;
public class Foo {
void unchecked() {
boolean b = true;
try {
try {
System.out.println();
} finally {
b = false;
}
} finally {
if (<warning descr="Condition 'b' is always 'false'">b</warning>) {
System.out.println();
}
}
}
void checked(boolean flag) throws Throwable {
Throwable throwable = new Throwable();
boolean b = true;
try {
if (flag) {
try {
throw throwable;
} finally {
b = false;
}
}
} finally {
if (b) {
System.out.println();
}
}
}
void justReturn(boolean flag) throws Throwable {
boolean b = true;
try {
try {
return;
} finally {
b = false;
}
} finally {
if (<warning descr="Condition 'b' is always 'false'">b</warning>) {
System.out.println();
}
}
}
}
@@ -78,6 +78,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase {
public void testNestedTryInWhileNotComplex() throws Throwable { doTest(); }
public void testExceptionFromFinally() throws Throwable { doTest(); }
public void testExceptionFromFinallyNesting() throws Throwable { doTest(); }
public void testNestedFinally() { doTest(); }
public void testFieldChangedBetweenSynchronizedBlocks() throws Throwable { doTest(); }
public void testGeneratedEquals() throws Throwable { doTest(); }
@@ -291,6 +292,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase {
public void testWhileNotComplex() { doTest(); }
public void testManyDisjunctiveFieldAssignmentsInLoopNotComplex() { doTest(); }
public void testManyContinuesNotComplex() { doTest(); }
public void testFinallyNotComplex() { doTest(); }
public void testVariablesDiverge() { doTest(); }
public void testMergeByNullability() { doTest(); }