mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
avoid false positive contract violations when the control flow goes through unknown conditions (IDEA-164883)
This commit is contained in:
+6
-8
@@ -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(); }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user