Possible bug in latest version of clang on Mac OS X

Doug Simon doug.simon at oracle.com
Fri Mar 14 11:03:12 UTC 2014


Thanks to more investigation by Tom, it appears as though clang is legally omitting the null pointer check according to one way of interpreting (recent?) C++ specification around the value and type of NULL.

For anyone interested, I took some of Tom’s example code and made it into a standalone program (attached) showing the issue:

$ clang++ -O3 -o clang_omits_null_check clang_omits_null_check.cpp 
$ ./clang_omits_null_check 
1. argc = 1 
2. argc = 1 
Illegal instruction: 4 

Switching to -O0 to prevents the crash: 

$ clang++ -O0 -o clang_omits_null_check clang_omits_null_check.cpp 
$ ./clang_omits_null_check 
1. argc = 1 
2. argc = 1 
3. argc = 1 

The only hints found on the web about this behavior so far are:

http://stackoverflow.com/questions/10153246/crashing-threads-with-intnull-1-problematic
http://blog.qt.digia.com/blog/2011/06/10/type-punning-and-strict-aliasing/

-Doug

-------------- next part --------------


On Mar 12, 2014, at 2:30 AM, Christian Thalinger <christian.thalinger at oracle.com> wrote:

> 
> On Mar 11, 2014, at 4:01 PM, Tom Rodriguez <tom.rodriguez at oracle.com> wrote:
> 
>> So this is a known clang/llvm issue?  Has it been reported?
> 
> I don’t think so.  At least I didn’t do it.
> 
>> 
>> tom
>> 
>> On Mar 11, 2014, at 3:14 PM, Christian Thalinger <christian.thalinger at oracle.com> wrote:
>> 
>>> Sigh.  Meta-circular FTW! ;-)
>>> 
>>> Did you add a new section like this:
>>> 
>>> # Clang 5.0
>>> ifeq ($(shell expr $(CC_VER_MAJOR) = 5 \& $(CC_VER_MINOR) = 0), 1)
>>>  OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT)
>>>  OPT_CFLAGS/unsafe.o += -O1
>>>  OPT_CFLAGS/graalCompilerToVM.o += -O1
>>> endif
>>> 
>>> for 5.1 in make/bsd/makefiles/gcc.make?
>>> 
>>> On Mar 11, 2014, at 3:03 PM, Doug Simon <doug.simon at oracle.com> wrote:
>>> 
>>>> Since I have automatic updating enabled on my Mac, I was recently updated to the latest version of Xcode (5.1). I have just done my first recompile of HotSpot since this update and am seeing that clang appears to have a rather serious bug. In both disassembled functions below, the third parameter (%rdx) is a jobject that should be resolved via JNIHandles::resolve and then dereferenced *after* adding the fourth parameter (%rcx) to it. clang is inlining the call to JNIHandles::resolve but omitting the null check on the jobject value.
>>>> 
>>>> If this is really a bug, I’m sure reports about it will start showing up soon. In the meantime, don’t update Xcode.
>>>> 
>>>> -Doug
>>>> 
>>>> 
>>>> _Unsafe_GetLong:
>>>> 0000000000357e59	pushq	%rbp
>>>> 0000000000357e5a	movq	%rsp, %rbp
>>>> 0000000000357e5d	pushq	%r15
>>>> 0000000000357e5f	pushq	%r14
>>>> 0000000000357e61	pushq	%r12
>>>> 0000000000357e63	pushq	%rbx
>>>> 0000000000357e64	subq	$0x10, %rsp
>>>> 0000000000357e68	movq	%rcx, %r14
>>>> 0000000000357e6b	movq	%rdx, %r15
>>>> 0000000000357e6e	movq	%rdi, %rbx
>>>> 0000000000357e71	movl	0x90(%rbx), %eax
>>>> 0000000000357e77	addq	$-0x1f0, %rbx
>>>> 0000000000357e7e	cmpl	$0xdeab, %eax
>>>> 0000000000357e83	je	0x357e9c
>>>> 0000000000357e85	movl	0x280(%rbx), %eax
>>>> 0000000000357e8b	cmpl	$0xdeac, %eax
>>>> 0000000000357e90	je	0x357e9c
>>>> 0000000000357e92	movq	%rbx, %rdi
>>>> 0000000000357e95	callq	__ZN10JavaThread18block_if_vm_exitedEv
>>>> 0000000000357e9a	xorl	%ebx, %ebx
>>>> 0000000000357e9c	leaq	-0x28(%rbp), %r12
>>>> 0000000000357ea0	movq	%r12, %rdi
>>>> 0000000000357ea3	movq	%rbx, %rsi
>>>> 0000000000357ea6	callq	__ZN20ThreadInVMfromNativeC1EP10JavaThread
>>>> 0000000000357eab	movq	%rbx, -0x30(%rbp)
>>>> 0000000000357eaf	movq	(%r15), %rax
>>>> 0000000000357eb2	movq	(%rax,%r14), %rbx
>>>> 0000000000357eb6	leaq	-0x30(%rbp), %rdi
>>>> 0000000000357eba	callq	__ZN17HandleMarkCleanerD1Ev
>>>> 0000000000357ebf	movq	%r12, %rdi
>>>> 0000000000357ec2	callq	__ZN20ThreadInVMfromNativeD1Ev
>>>> 0000000000357ec7	movq	%rbx, %rax
>>>> 0000000000357eca	addq	$0x10, %rsp
>>>> 0000000000357ece	popq	%rbx
>>>> 0000000000357ecf	popq	%r12
>>>> 0000000000357ed1	popq	%r14
>>>> 0000000000357ed3	popq	%r15
>>>> 0000000000357ed5	popq	%rbp
>>>> 0000000000357ed6	ret
>>>> 
>>>> __Z33c2v_readUnsafeUncompressedPointerP7JNIEnv_P8_jobjectS2_l:
>>>> 000000000016e261	pushq	%rbp
>>>> 000000000016e262	movq	%rsp, %rbp
>>>> 000000000016e265	pushq	%r15
>>>> 000000000016e267	pushq	%r14
>>>> 000000000016e269	pushq	%r12
>>>> 000000000016e26b	pushq	%rbx
>>>> 000000000016e26c	subq	$0x10, %rsp
>>>> 000000000016e270	movq	%rcx, %r14
>>>> 000000000016e273	movq	%rdx, %r15
>>>> 000000000016e276	leaq	_TraceGraal(%rip), %rax
>>>> 000000000016e27d	cmpq	$0x3, (%rax)
>>>> 000000000016e281	jl	0x16e2ac
>>>> 000000000016e283	leaq	_tty(%rip), %rbx
>>>> 000000000016e28a	movq	(%rbx), %rdi
>>>> 000000000016e28d	leaq	0x23de25(%rip), %rsi ## literal pool for: "      TraceGraal-3: "
>>>> 000000000016e294	xorl	%eax, %eax
>>>> 000000000016e296	callq	__ZN12outputStream5printEPKcz
>>>> 000000000016e29b	movq	(%rbx), %rdi
>>>> 000000000016e29e	leaq	0x23ef0f(%rip), %rsi ## literal pool for: "CompilerToVM::readUnsafeUncompressedPointer"
>>>> 000000000016e2a5	xorl	%eax, %eax
>>>> 000000000016e2a7	callq	__ZN12outputStream8print_crEPKcz
>>>> 000000000016e2ac	leaq	__ZN18ThreadLocalStorage13_thread_indexE(%rip), %rax
>>>> 000000000016e2b3	movslq	(%rax), %rdi
>>>> 000000000016e2b6	callq	0x38a758 ## symbol stub for: _pthread_getspecific
>>>> 000000000016e2bb	movq	%rax, %rbx
>>>> 000000000016e2be	leaq	-0x28(%rbp), %r12
>>>> 000000000016e2c2	movq	%r12, %rdi
>>>> 000000000016e2c5	movq	%rbx, %rsi
>>>> 000000000016e2c8	callq	__ZN20ThreadInVMfromNativeC1EP10JavaThread
>>>> 000000000016e2cd	movq	%rbx, -0x30(%rbp)
>>>> 000000000016e2d1	movq	(%r15), %rax
>>>> 000000000016e2d4	movq	(%rax,%r14), %rdi
>>>> 000000000016e2d8	callq	__ZN10JNIHandles10make_localEP7oopDesc
>>>> 000000000016e2dd	movq	%rax, %rbx
>>>> 000000000016e2e0	leaq	-0x30(%rbp), %rdi
>>>> 000000000016e2e4	callq	__ZN17HandleMarkCleanerD1Ev
>>>> 000000000016e2e9	movq	%r12, %rdi
>>>> 000000000016e2ec	callq	__ZN20ThreadInVMfromNativeD1Ev
>>>> 000000000016e2f1	movq	%rbx, %rax
>>>> 000000000016e2f4	addq	$0x10, %rsp
>>>> 000000000016e2f8	popq	%rbx
>>>> 000000000016e2f9	popq	%r12
>>>> 000000000016e2fb	popq	%r14
>>>> 000000000016e2fd	popq	%r15
>>>> 000000000016e2ff	popq	%rbp
>>>> 000000000016e300	ret
>>>> 
>>>> 
>>> 
>> 
> 



More information about the graal-dev mailing list