RFR: 8289046: Undefined Behaviour in x86 class Assembler

Andrew Haley aph at openjdk.org
Thu Jun 23 15:00:19 UTC 2022


All instances of type Register exhibit UB in the form of wild pointer (including null pointer) dereferences. This isn't very hard to fix: we should make Registers pointers to something rather than aliases of small integers. 

Here's an example of what was happening:

   ` rax->encoding();`

Where rax is defined as `(Register *)0`.

This patch things so that rax is now defined as a pointer to the start of a static array of RegisterImpl.


typedef const RegisterImpl* Register;
extern RegisterImpl all_Registers[RegisterImpl::number_of_declared_registers + 1] ;
inline constexpr Register RegisterImpl::first() { return all_Registers + 1; };
inline constexpr Register as_Register(int encoding) { return RegisterImpl::first() + encoding; }
constexpr Register rax = as_register(0);

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

Commit messages:
 - Compiles
 - Compiles
 - Compiles

Changes: https://git.openjdk.org/jdk/pull/9261/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=9261&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8289046
  Stats: 78 lines in 5 files changed: 29 ins; 9 del; 40 mod
  Patch: https://git.openjdk.org/jdk/pull/9261.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/9261/head:pull/9261

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


More information about the hotspot-compiler-dev mailing list