RFR: 8178495: Bug in the align_size_up_ macro

Stefan Karlsson stefan.karlsson at oracle.com
Wed Jun 28 15:08:27 UTC 2017


Hi all,

Please review this patch to fix a bug in the align_size_up_ macro.

http://cr.openjdk.java.net/~stefank/8178495/webrev.00/
https://bugs.openjdk.java.net/browse/JDK-8178495

The following:
  align_size_up_((uintptr_t)0x512345678ULL, (int8_t) 16);
  align_size_up_((uintptr_t)0x512345678ULL, (int16_t) 16);
  align_size_up_((uintptr_t)0x512345678ULL, (int32_t) 16);
  align_size_up_((uintptr_t)0x512345678ULL, (int64_t) 16);

  align_size_up_((uintptr_t)0x512345678ULL, (uint8_t) 16);
  align_size_up_((uintptr_t)0x512345678ULL, (uint16_t)16);
  align_size_up_((uintptr_t)0x512345678ULL, (uint32_t)16);
  align_size_up_((uintptr_t)0x512345678ULL, (uint64_t)16);

Gives this output:
  0x512345680
  0x512345680
  0x512345680
  0x512345680

  0x512345680
  0x512345680
   0x12345680
  0x512345680

So, align_size_up_((uintptr_t)0x512345678ULL, (uint32_t)16) returns an 
unexpected, truncated value.

This happens because in this macro:
#define align_size_up_(size, alignment) (((size) + ((alignment) - 1)) & 
~((alignment) - 1))

~((alignment) - 1) returns 0x00000000FFFFFFF0 instead of 0xFFFFFFFFFFFFFFF0

This isn't a problem for the 64-bit types, and maybe more non-obvious is 
that it doesn't happen for types 8-bit and 16-bit types.

For the 8-bit and 16-bit types, the (alignment - 1) is promoted to a 
signed int, when it later is used in the & expression it is signed 
extended into a signed 64-bit value.

When the type is an unsigned 32-bit integer, it isn't promoted to a 
signed int, and therefore it is not singed extended to 64 bits, but 
instead zero extended to 64 bits.

This bug is currently not affecting the code base, since the inline 
align functions promote all integers to intptr_t, before passing them 
down to the align macros. However, when/if JDK-8178489 
<https://bugs.openjdk.java.net/browse/JDK-8178489> is pushed the macro 
is actually used with 32 bits unsigned ints.

Tested with the unit test and JPRT with and without patches for 
JDK-8178489 <https://bugs.openjdk.java.net/browse/JDK-8178489>.

Thanks,
StefanK


More information about the hotspot-dev mailing list