RFR: 8281213: Unsafe uses of long and size_t in MemReporterBase::diff_in_current_scale

Afshin Zafari duke at openjdk.org
Mon Dec 5 14:03:42 UTC 2022


### Description
MemReporterBase::diff_in_current_scale is defined as follows:

  inline long diff_in_current_scale(size_t s1, size_t s2) const {
    long amount = (long)(s1 - s2);
    long scale = (long)_scale;
    amount = (amount > 0) ? (amount + scale / 2) : (amount - scale / 2);
    return amount / scale;
  }

Long and size_t can have different sizes: 4 bytes and 8 bytes (LLP64). The result of 's1 - s2' might not fit into long. It might not fit into int64_t. For example: s1 is SIZE_MAX and s2 is SIZE_MAX-MAX_INT64-1.

Size_t should be used instead of long. Assertions must be added to check:
s1 >= s2 and (amount - scale/2) >= 0 and (amount + scale/2) <= SIZE_MAX.

### Patch
`long` is replaced by `size_t`. Comparison to 0 is implemented accordingly since size_t is always >= 0.
Since s1 can be less than s2 in some invocations of this method, no assert is written for `(s1 >= s2)` case.

### Test
local: runtime/NMT/Jcmd*
mach5: tier1

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

Commit messages:
 - 8281213: Unsafe uses of long and size_t in MemReporterBase::diff_in_current_scale
 - 8281213: Unsafe uses of long and size_t in MemReporterBase::diff_in_current_scale

Changes: https://git.openjdk.org/jdk/pull/11514/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=11514&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8281213
  Stats: 13 lines in 1 file changed: 9 ins; 0 del; 4 mod
  Patch: https://git.openjdk.org/jdk/pull/11514.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/11514/head:pull/11514

PR: https://git.openjdk.org/jdk/pull/11514


More information about the hotspot-runtime-dev mailing list