Unittest tester.

Johannes Pfau nospam at example.com
Sun May 19 03:32:09 PDT 2013


Am Tue, 14 May 2013 18:59:14 +0200
schrieb "Iain Buclaw" <ibuclaw at ubuntu.com>:

> core.exception.AssertError at libphobos/src/std/range.d(2995):

This is a weird bug:

This is what happens: 
Struct Take consists of an int and a size_t. In between those two we
have 4 bytes padding on x86_64. If GCC returns this struct from a
function it just ignores the padding and the padding remains
'unchanged' from the 'original' value.

Test case: http://dpaste.dzfl.pl/cce31911
Cannot reproduce with dpaste gdc 2.060 so this might be a regression.

Some ASM:
Optimized & inlined:
--------------
   0x000000000040265a <+26>:	movl   $0x1,(%rsp)
   0x0000000000402661 <+33>:	movq   $0x5,0x8(%rsp)
   0x000000000040266a <+42>:	movl   $0x1,0x10(%rsp)
   0x0000000000402672 <+50>:	movq   $0x5,0x18(%rsp)
   0x000000000040267b <+59>:	callq  0x401bc0 <memcmp at plt>
--------------
Notice how gcc uses movl & movq. 0x4(%rsp) is not being accessed /
initialized.

Not optimized:
--------------
   0x000000000040267b <+27>:	callq  0x4025e0
<_D5range4takeFimZS5range4Take>
   0x0000000000402680 <+32>:	mov    %eax,%ecx 
   0x0000000000402682 <+34>:	mov    %rdx,%rax
   0x0000000000402685 <+37>:	mov    %ecx,-0x50(%rbp)
   0x0000000000402688 <+40>:	mov    %rax,-0x48(%rbp)
--------------
Here GCC uses the 4 byte registers for the int.


We could force all local variables to be initialized to .init to fix
this specific case, but I'm not sure if that would fix this bug
completely. We also have to consider that the variables could be
temporaries....

I wonder how C/C++ deals with this.


More information about the D.gnu mailing list