avoid false positive contract violations when the control flow goes through unknown conditions (IDEA-164883)

This commit is contained in:
peter
2016-12-22 15:12:03 +01:00
parent 116a11a17b
commit 19ffdbe7aa
3 changed files with 19 additions and 8 deletions
@@ -15,14 +15,8 @@
*/
package com.intellij.codeInspection.dataFlow;
import com.intellij.codeInspection.dataFlow.instructions.CheckReturnValueInstruction;
import com.intellij.codeInspection.dataFlow.instructions.Instruction;
import com.intellij.codeInspection.dataFlow.instructions.MethodCallInstruction;
import com.intellij.codeInspection.dataFlow.instructions.ReturnInstruction;
import com.intellij.codeInspection.dataFlow.value.DfaConstValue;
import com.intellij.codeInspection.dataFlow.value.DfaValue;
import com.intellij.codeInspection.dataFlow.value.DfaValueFactory;
import com.intellij.codeInspection.dataFlow.value.DfaVariableValue;
import com.intellij.codeInspection.dataFlow.instructions.*;
import com.intellij.codeInspection.dataFlow.value.*;
import com.intellij.psi.*;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -104,6 +98,10 @@ class ContractChecker extends DataFlowRunner {
return DfaInstructionState.EMPTY_ARRAY;
}
if (instruction instanceof ConditionalGotoInstruction && memState.peek() == DfaUnknownValue.getInstance()) {
return DfaInstructionState.EMPTY_ARRAY;
}
return super.acceptInstruction(visitor, instructionState);
}
@@ -0,0 +1,12 @@
class Test {
@org.jetbrains.annotations.Contract("null->false")
public static boolean smth(Object context) {
if (someMethodWithUnknownContract(context)) {
return true;
}
return false;
}
private static native boolean someMethodWithUnknownContract(Object o);
}
@@ -47,4 +47,5 @@ public class ContractCheckTest extends LightCodeInsightFixtureTestCase {
public void testCheckConstructorContracts() { doTest(); }
public void testPassingVarargsToDelegate() { doTest(); }
public void testUnknownIfCondition() { doTest(); }
}