RFR: 8352112: [ubsan] hotspot/share/code/relocInfo.cpp:130:37: runtime error: applying non-zero offset 18446744073709551614 to null pointer
Vladimir Kozlov
kvn at openjdk.org
Wed Mar 19 17:21:08 UTC 2025
On Wed, 19 Mar 2025 00:03:19 GMT, Dean Long <dlong at openjdk.org> wrote:
>> Before [JDK-8343789](https://bugs.openjdk.org/browse/JDK-8343789) `relocation_begin()` was never null even when there was no relocations - it pointed to the beginning of constant or code section in such case. It was used by relocation code to simplify code and avoid null checks.
>> With that fix `relocation_begin()` points to address in `CodeBlob::_mutable_data` field which could be `nullptr` if there is no relocation and metadata.
>>
>> There easy fix is to avoid `nullptr` in `CodeBlob::_mutable_data`. We could do that similar to what we do for `nmethod::_immutable_data`: [nmethod.cpp#L1514](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/code/nmethod.cpp#L1514).
>>
>> Tested tier1-4, stress, xcomp. Verified with failed tests listed in bug report.
>
> src/hotspot/share/code/codeBlob.cpp line 156:
>
>> 154: } else {
>> 155: // We need unique and valid not null address
>> 156: _mutable_data = blob_end();
>
> It makes me a little nervous pointing this value to real data. When RelocIterator computes `_current = nm->relocation_begin() - 1`, it should never read or write from that address, but how can we guarantee that? Any non-null address that is guarateed unmapped would do, or a special protetected page like `bad_page` here: https://github.com/openjdk/jdk/blob/8e530633a9d99d7ce585cafd5573cb89212feee7/src/hotspot/share/runtime/safepointMechanism.cpp#L66. If using protected memory seems like overkill, then I suggest using a static. Something like this:
>
> static union {
> relocInfo _dummy[1];
> } _empty[2];
> [...]
> _mutable_data = _empty+1;
>
> However, I think this is not the first time we have run into this issue with RelocIterator. Maybe it's time that we rewrote it to avoid this situation?
How about this?:
+++ b/src/hotspot/share/code/relocInfo.cpp
@@ -117,6 +117,8 @@ void relocInfo::change_reloc_info_for_address(RelocIterator *itr, address pc, re
// Implementation of RelocIterator
+static relocInfo dummy_reloc[2];
+
void RelocIterator::initialize(nmethod* nm, address begin, address limit) {
initialize_misc();
@@ -127,8 +129,14 @@ void RelocIterator::initialize(nmethod* nm, address begin, address limit) {
guarantee(nm != nullptr, "must be able to deduce nmethod from other arguments");
_code = nm;
- _current = nm->relocation_begin() - 1;
- _end = nm->relocation_end();
+ // Check for no relocations case and use dummy data to avoid referencing wrong data.
+ if (nm->relocation_size() == 0) {
+ _current = dummy_reloc;
+ _end = dummy_reloc + 1;
+ } else {
+ _current = nm->relocation_begin() - 1;
+ _end = nm->relocation_end();
+ }
_addr = nm->content_begin();
// Initialize code sections.
I filed RFE: [JDK-8352426](https://bugs.openjdk.org/browse/JDK-8352426)
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/24102#discussion_r2003871579
More information about the hotspot-compiler-dev
mailing list