Update Long2IntArray to fill the array in reverse.
This addresses a false positive alert for a potential array index out of
bounds exception raised by LGTM.com.
diff --git a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/Long2IntArray.java b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/Long2IntArray.java
index 0e161fe..47866b2 100644
--- a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/Long2IntArray.java
+++ b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/Long2IntArray.java
@@ -63,19 +63,17 @@
private static int[] convertSeed(Long seed, int size) {
final int[] out = new int[size];
final SplitMix64 rng = new SplitMix64(seed);
- int i = 0;
- // Handle an odd size
- if ((size & 1) == 1) {
- out[i++] = NumberFactory.extractHi(rng.nextLong());
- }
- // Fill the remaining pairs
- while (i < size) {
+ // Fill pairs of ints from a long.
+ // The array is filled from the end towards the start.
+ for (int i = size - 1; i > 0; i -= 2) {
final long v = rng.nextLong();
out[i] = NumberFactory.extractHi(v);
- out[i + 1] = NumberFactory.extractLo(v);
- i += 2;
+ out[i - 1] = NumberFactory.extractLo(v);
}
-
+ // An odd size requires a final single int at the start
+ if ((size & 1) == 1) {
+ out[0] = NumberFactory.extractHi(rng.nextLong());
+ }
return out;
}
}
diff --git a/commons-rng-simple/src/test/java/org/apache/commons/rng/simple/internal/Long2IntArrayTest.java b/commons-rng-simple/src/test/java/org/apache/commons/rng/simple/internal/Long2IntArrayTest.java
index fad7d37..97c915a 100644
--- a/commons-rng-simple/src/test/java/org/apache/commons/rng/simple/internal/Long2IntArrayTest.java
+++ b/commons-rng-simple/src/test/java/org/apache/commons/rng/simple/internal/Long2IntArrayTest.java
@@ -25,9 +25,19 @@
public class Long2IntArrayTest {
@Test
public void testFixedLengthConversion() {
+ for (int length = 0; length < 10; length++) {
+ testFixedLengthConversion(length);
+ }
+ }
+
+ private static void testFixedLengthConversion(int length) {
final Long seed = 567L;
- final int length = 5;
final int[] out = new Long2IntArray(length).convert(seed);
Assert.assertEquals(length, out.length);
+ // This very seed dependent but the algorithm
+ // should only produce 0 about 1 in 2^32 times.
+ for (int i = 0; i < length; i++) {
+ Assert.assertNotEquals(0, out[i]);
+ }
}
}