[common] Fix ArrayIndexOutOfBoundsException in .toArray() methods #2158
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Linked issue: close #2157
Purpose
The
to*Array()methods inBinaryArraywere passing*_ARRAY_OFFSETconstants (e.g.,DOUBLE_ARRAY_OFFSET) as thetargetOffsetparameter toBinarySegmentUtils.copyToUnsafe(). These constants are Unsafe memory offsets (typically 16 bytes on 64-bit JVMs), butcopyToUnsafe()usestargetOffsetas a regular Java array index.For example, with a 20-element double array:
targetOffset = DOUBLE_ARRAY_OFFSET ≈ 16target[16 + 0]throughtarget[16 + 19 = 35]ArrayIndexOutOfBoundsException: Index 20 out of bounds for length 20Brief change log
Changed all
to*Array()methods to pass0as thetargetOffsetsincecopyToUnsafe()uses regular Java array indexing, not Unsafe memory operations.Tests
testTo*ArrayWithLargeArray) that verify all primitive array conversion methods work correctly with 20-element arraysHere are all the test methods added to
BinaryArrayTest.java:testToDoubleArrayWithLargeArray()
testToFloatArrayWithLargeArray()
testToLongArrayWithLargeArray()
testToIntArrayWithLargeArray()
testToShortArrayWithLargeArray()
testToByteArrayWithLargeArray()
testToBooleanArrayWithLargeArray()
testToDoubleArrayWithLargeArray