dfa: variables shouldn't be marked unknown if they don't have known constant values

This commit is contained in:
peter
2014-03-05 22:19:27 +01:00
parent 1cd41f0f85
commit c1b03f0163
2 changed files with 23 additions and 7 deletions
@@ -815,22 +815,36 @@ public class DfaMemoryStateImpl implements DfaMemoryState {
@Override
public void flushFields() {
Set<DfaVariableValue> vars = ContainerUtil.newLinkedHashSet(getChangedVariables());
for (EqClass aClass : myEqClasses) {
if (aClass != null) {
for (DfaVariableValue value : aClass.getVariables()) {
if (value.isFlushableByCalls()) {
doFlush(value, true);
}
}
vars.addAll(aClass.getVariables());
}
}
for (DfaVariableValue value : new ArrayList<DfaVariableValue>(getChangedVariables())) {
for (DfaVariableValue value : vars) {
if (value.isFlushableByCalls()) {
doFlush(value, true);
doFlush(value, shouldMarkUnknown(value));
}
}
}
private boolean shouldMarkUnknown(DfaVariableValue value) {
int eqClassIndex = getEqClassIndex(value);
if (eqClassIndex < 0) return false;
EqClass eqClass = myEqClasses.get(eqClassIndex);
if (eqClass == null) return false;
if (eqClass.findConstant(true) != null) return true;
for (UnorderedPair<EqClass> pair : getDistinctClassPairs()) {
if (pair.first == eqClass && pair.second.findConstant(true) != null ||
pair.second == eqClass && pair.first.findConstant(true) != null) {
return true;
}
}
return false;
}
Set<DfaVariableValue> getChangedVariables() {
return myVariableStates.keySet();
}
@@ -305,6 +305,8 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase {
public void testNotEqualsTypo() { doTest(); }
public void testAndEquals() { doTest(); }
public void testUnusedCallDoesNotMakeUnknown() { doTest(); }
public void testParametersAreNonnullByDefault() {
myFixture.addClass("package javax.annotation; public @interface ParametersAreNonnullByDefault {}");
myFixture.addClass("package javax.annotation; public @interface ParametersAreNullableByDefault {}");