RFR: 8326692: JVMCI Local.endBci is off-by-one

Guoxiong Li gli at openjdk.org
Sat Mar 2 11:31:51 UTC 2024


On Fri, 1 Mar 2024 17:48:51 GMT, Gilles Duboscq <gdub at openjdk.org> wrote:

> In class files, in the local variable table, local variables have a start BCI and a length. The local variable has a value from BCI (inclusive) until BCI + length (exclusive).
> On the other end, JVMCI stores that information in `Local` objects with a start BCI and an end BCI (inclusive).
> Currently the parser just uses BCI+length to compute the end BCI, leading to an off-by-one error.
> 
> A simple test checking that the start and end BCIs are within the method's bytecode is added. It fails without the fix.

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java line 635:

> 633:         for (int i = 0; i < localVariableTableLength; i++) {
> 634:             final int startBci = UNSAFE.getChar(localVariableTableElement + config.localVariableTableElementStartBciOffset);
> 635:             final int endBci = startBci + UNSAFE.getChar(localVariableTableElement + config.localVariableTableElementLengthOffset) - 1;

Just a question: Can the length of a local variable be 0?

**If the code length is 0, the `endBci` here may be less than `startBci`.**

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/18087#discussion_r1509950353


More information about the graal-dev mailing list