RFR: 8289046: Undefined Behaviour in x86 class Assembler [v4]

Aleksey Shipilev shade at openjdk.org
Mon Jul 4 10:37:42 UTC 2022


On Mon, 27 Jun 2022 12:35:44 GMT, Andrew Haley <aph at openjdk.org> wrote:

>> 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);
>
> Andrew Haley has updated the pull request incrementally with one additional commit since the last revision:
> 
>   More

Looks to me this now subsumes JDK-8289060, but not exactly? For example, the PR for JDK-8289060 has richer comment around `VMRegImpl::stack0`.

src/hotspot/share/code/vmreg.hpp line 90:

> 88:   }
> 89:   intptr_t value() const { return this - first(); }
> 90:   static VMReg Bad() { return BAD_REG+first(); }

I was confused as to why is it `+first()`. We can probably do: `return as_VMReg(BAD_REG, true);`?

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

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


More information about the hotspot-compiler-dev mailing list