RFR: 8347426: Invalid value used for enum Cell in iTypeFlow::StateVector::meet_exception

Marc Chevalier duke at openjdk.org
Thu Feb 27 08:28:58 UTC 2025


On Tue, 25 Feb 2025 10:11:54 GMT, Marc Chevalier <duke at openjdk.org> wrote:

> As guess on the JBS ticket, we have a UB when `_outer->max_locals() == 0`, because then we try to do `(Cell)(-1)` which is out of range since Cell's range is [0, `INT_MAX`].
> 
> The obvious fix that is
> 
> Cell limit = local(_outer->max_locals());
> for (Cell c = start_cell(); c < limit; c = next_cell(c)) {
> 
> since `local` asserts its argument to be in [0, `outer->max_locals()`). Of course
> 
> Cell limit = (Cell)(_outer->max_locals());
> 
> would work, but it seems to break (the very light) abstraction.
> 
> I've also added an assert to transform the UB into a clear failure.
> 
> This fix makes the UB warning go away on Mac with arm64.
> 
> Thanks,
> Marc

I went with the first one then. I also like the fact that it hides the underlying int: it's all `Cell`, whatever that is, but known to be enumerable. It also doesn't use the fact that locals starts at 0 unlike the second option. One could have then done `for (int i = (int)start_cell(); ...` but doesn't it start to get heavy? (sure, the explicit conversion might be not quite necessary).

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

PR Comment: https://git.openjdk.org/jdk/pull/23772#issuecomment-2687229914


More information about the hotspot-compiler-dev mailing list