From 4ba3bce5f4399b4951001f9d8dc34dec3515ec37 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 27 Sep 2019 10:23:02 +0700 Subject: [PATCH] HardcodedContracts: support Deque#getFirst, getLast; Queue#element Fixes IDEA-223629 'Method invocation may produce NullPointerException' false positive for ArrayDeque.pollFirst() GitOrigin-RevId: e1284cb51c0a1f5a12683a57c58b085de6e5b705 --- .../codeInspection/dataFlow/HardcodedContracts.java | 5 ++++- .../testData/inspection/dataFlow/fixture/QueuePeek.java | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java index 5d18c48f5338..f9987dfdcce3 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java @@ -109,7 +109,10 @@ public class HardcodedContracts { ContractValue.qualifier().specialField(SpecialField.COLLECTION_SIZE), RelationType.EQ, ContractValue.zero(), returnFalse()))) .register(instanceCall(JAVA_UTIL_LIST, "get").parameterTypes("int"), ContractProvider.of(specialFieldRangeContract(0, RelationType.LT, SpecialField.COLLECTION_SIZE))) - .register(instanceCall("java.util.SortedSet", "first", "last").parameterCount(0), + .register(anyOf( + instanceCall("java.util.SortedSet", "first", "last").parameterCount(0), + instanceCall("java.util.Deque", "getFirst", "getLast").parameterCount(0), + instanceCall("java.util.Queue", "element").parameterCount(0)), ContractProvider.of(singleConditionContract( ContractValue.qualifier().specialField(SpecialField.COLLECTION_SIZE), RelationType.EQ, ContractValue.zero(), fail()))) diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/QueuePeek.java b/java/java-tests/testData/inspection/dataFlow/fixture/QueuePeek.java index f3e29161d0b2..ac78beddab7d 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/QueuePeek.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/QueuePeek.java @@ -26,4 +26,11 @@ class ThisAsVariable { void notCheck(Queue queue) { System.out.println(queue.peek().trim()); } + + void checkGetFirstPollFirst(Deque queue) { + if ("bar".equals(queue.getFirst())) { + String first = queue.pollFirst(); + System.out.println(first.toString()); + } + } }