On Wed, 21 Aug 2024 13:26:58 GMT, Maurizio Cimadamore <[email protected]>
wrote:
> When working on startup improvements, I noticed that the method handle
> returned by `MemoryLayout::offsetHandle` can overflow if the client calls the
> handle with a base offset that is too big.
>
> In other similar situations, the layout API always fails with
> `ArithmeticException` (see `MemoryLayout::scale`), so we should do the same
> here.
>
> The fix is to use a `Math::addExact(long, long)` for the outermost add
> operation in the computation of the offset method handle. That outermost
> computation in fact is the only one that can overflow: it is an addition
> between a user-provided base offset `B` and a layout offset `L`. `L` is
> guaranteed not to overflow, by construction (as `L` is derived from a layout
> path). But `B` + `L` might overflow, so the new logic checks for that.
Nice catch.
Unrelated: I wonder if the performance of:
MH_ADD = lookup.findStatic(Long.class, "sum",
MethodType.methodType(long.class, long.class, long.class));
and
MH_ADD = MethodHandles.publicLookup().findStatic(Long.class, "sum",
MethodType.methodType(long.class, long.class, long.class));
Differ?
-------------
Marked as reviewed by pminborg (Reviewer).
PR Review: https://git.openjdk.org/jdk/pull/20662#pullrequestreview-2257329578
PR Comment: https://git.openjdk.org/jdk/pull/20662#issuecomment-2307163178