[java-dfa] Fix hardcoded contract for three-arg Arrays.binarySearch method (IDEA-359546)

(cherry picked from commit a4ff22126f7d6fc1b4a7d99ee47c3caf1b144c4c)

GitOrigin-RevId: 74f0bae69219b650eb170bc517e5c1bc0b1d9ad2
This commit is contained in:
Tagir Valeev
2024-10-16 10:26:14 +02:00
committed by intellij-monorepo-bot
parent dc174fbf44
commit 88e99a58b4
3 changed files with 26 additions and 2 deletions

View File

@@ -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(

View File

@@ -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));
}
}

View File

@@ -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();