C++ delete operator undefined behavior

Ioi Lam ioi.lam at oracle.com
Sat Feb 9 08:42:09 UTC 2019


I am getting a "ud2" instruction on the Mac for a 'delete' expression. 
According to this page, it's clang flagging an undefined behavior:

https://stackoverflow.com/questions/21529308/why-does-clang-generate-ud2-opcode-on-osx

My code looks like this:

class MetaspaceClosure {
   class Ref : public ResourceObj {
   ...
   };


   void push_impl(Ref* ref) {
     if (_nest_level < MAX_NEST_LEVEL) {
       do_push(ref);
       delete ref;
     } else {
       ref->set_next(_pending_refs);
       _pending_refs = ref;
     }
   }
};

and clang generates this code

libjvm.dylib`MetaspaceClosure::push_impl:
     0x10316db9c <+0>:  pushq  %rbp
     0x10316db9d <+1>:  movq   %rsp, %rbp
     0x10316dba0 <+4>:  pushq  %rbx
     0x10316dba1 <+5>:  pushq  %rax
     0x10316dba2 <+6>:  movq   %rsi, %rbx
     0x10316dba5 <+9>:  cmpl   $0x4, 0x10(%rdi)
     0x10316dba9 <+13>: jg     0x10316dbba
     0x10316dbab <+15>: movq   %rbx, %rsi
     0x10316dbae <+18>: callq  0x10316dbce  ; do_push()
     0x10316dbb3 <+23>: testq  %rbx, %rbx
     0x10316dbb6 <+26>: je     0x10316dbc6
->  0x10316dbb8 <+28>: ud2 <<<<<<<<<<<<<<<<<<<<<<< HERE
     0x10316dbba <+30>: movq   0x8(%rdi), %rax
     0x10316dbbe <+34>: movq   %rax, 0x20(%rbx)
     0x10316dbc2 <+38>: movq   %rbx, 0x8(%rdi)
     0x10316dbc6 <+42>: addq   $0x8, %rsp
     0x10316dbca <+46>: popq   %rbx
     0x10316dbcb <+47>: popq   %rbp
     0x10316dbcc <+48>: retq
     0x10316dbcd <+49>: nop

Shouldn't the 'delete' expression be translated to ResourceObj::operator 
delete()?

And I couldn't find any warning messages given by clang ....

I rewrote the Ref class to inherit from CHeapObj<mtInternal> instead, 
and it magically worked.

However, but there's other use of 'delete' on ResourceObj (such as 
ResourceHashtable) that seems to work just fine. Am I missing something?

Thanks

- Ioi





More information about the hotspot-dev mailing list