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 83c3dac193f7..983c90674487 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 @@ -141,8 +141,10 @@ public final class HardcodedContracts { ContractValue.zero(), fail()))) // All these methods take array as 1st parameter, from index as 2nd and to index as 3rd // thus ARRAY_RANGE_CONTRACTS are applicable to them - .register(staticCall(JAVA_UTIL_ARRAYS, "binarySearch", "fill", "parallelPrefix", "parallelSort", "sort", "spliterator", "stream"), + .register(staticCall(JAVA_UTIL_ARRAYS, "fill", "parallelPrefix", "parallelSort", "sort", "spliterator", "stream"), (call, cnt) -> cnt >= 3 ? ARRAY_RANGE_CONTRACTS : null) + .register(staticCall(JAVA_UTIL_ARRAYS, "binarySearch"), + (call, cnt) -> cnt >= 4 ? ARRAY_RANGE_CONTRACTS : null) .register(staticCall("org.mockito.ArgumentMatchers", "argThat", "assertArg").parameterCount(1), ContractProvider.of(StandardMethodContract.fromText("_->_"))) .register(anyOf( diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ArrayBinarySearchNoWarningAtNeedle.java b/java/java-tests/testData/inspection/dataFlow/fixture/ArrayBinarySearchNoWarningAtNeedle.java new file mode 100644 index 000000000000..5cefe018217a --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ArrayBinarySearchNoWarningAtNeedle.java @@ -0,0 +1,21 @@ +import java.util.*; + +class Main { + public static void main(String[] args) { + Integer[] arr = new Integer[]{568, 659, 685, 235, 258, 657, 159, 357, 756, 958, 657}; + + Arrays.sort(arr, Collections.reverseOrder()); + + int index1 = Arrays.binarySearch(arr, 756, Comparator.reverseOrder()); + int index2 = Arrays.binarySearch(arr, 657, Comparator.reverseOrder()); + + Integer[] newArr = Arrays.copyOf(arr, 15); + Arrays.fill(newArr, arr.length, newArr.length, 999); + + System.out.println(Arrays.toString(arr)); + System.out.println(index1); + System.out.println(index2); + System.out.println(Arrays.toString(newArr)); + } +} + diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowRangeAnalysisTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowRangeAnalysisTest.java index 22fe247ece35..98885456cfab 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowRangeAnalysisTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowRangeAnalysisTest.java @@ -94,7 +94,8 @@ public class DataFlowRangeAnalysisTest extends DataFlowInspectionTestCase { public void testTwoFlagsMixed() { doTest(); } public void testArrayInitializersWithMethodCall() { doTest(); } public void testLongMinValue() { doTest(); } - + public void testArrayBinarySearchNoWarningAtNeedle() { doTest(); } + public void testJmhParamRange() { myFixture.addClass("package org.openjdk.jmh.annotations;public @interface Param {String[] value();}"); doTest();