public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <bonzini@gnu.org>
To: Ian Lance Taylor <iant@google.com>
Cc: Nathan Boley <npboley@gmail.com>, gcc@gcc.gnu.org
Subject: Re: Possible Bug
Date: Mon, 28 Mar 2011 11:06:00 -0000	[thread overview]
Message-ID: <4D9065FD.6060100@gnu.org> (raw)
In-Reply-To: <mcrd3ldi3wf.fsf@google.com>

On 03/27/2011 06:27 AM, Ian Lance Taylor wrote:
> Nathan Boley<npboley@gmail.com>  writes:
>
>> In a much larger application, I was getting a weird segfault that an
>> assignment to a temporary variable fixed. I distilled the example into
>> the attached "test_case.c". When I run test_case.c under valgrind I
>> get a memory read error, and it segfaults with electric fence, but I'm
>> not actually able to get a true segfault. However, I am pretty sure
>> that the same issue was causing the segfault in my application.
>
> There is nothing wrong if gcc is reading an 8-byte value at an 8-byte
> aligned address.

Note the struct is packed, so alignof = 1.

> That said, I could not recreate the problem with your test case.  I only
> see 4-byte loads.

I see it with this modified testcase:

#include <stdio.h>
#include <stdlib.h>

/* GCC uses 4-byte + 2-byte loads and stack passing */
typedef struct __attribute__((__packed__))
{
    unsigned short chr;
    unsigned int loc;
} GENOME_LOC_TYPE_1;

/* GCC uses 8-byte loads and register passing even though sizeof = 6 */
typedef struct __attribute__((__packed__))
{
    unsigned chr            :16;
    unsigned loc            :32;
} GENOME_LOC_TYPE_2;

//#define GENOME_LOC_TYPE GENOME_LOC_TYPE_1
#define GENOME_LOC_TYPE GENOME_LOC_TYPE_2

static __attribute__((__noclone__,__noinline__))
int f(GENOME_LOC_TYPE x)
{
   return x.loc;
}

GENOME_LOC_TYPE h;
GENOME_LOC_TYPE *g = &h;

int
main()
{
   printf ("%d %d\n", sizeof (GENOME_LOC_TYPE),
                      __alignof__(GENOME_LOC_TYPE));
   return f(*g);
}


Both definitions have a (sizeof = 6, alignof = 1) but GCC loads the 
second with an 8-byte load.  It's really an ugly bug if I understood it 
correctly, because I would have expected the second struct to have 
sizeof = 8.  The two final bytes are not padding, they are what's left 
of the unsigned int from which the bitfields are carved.  If that were 
the correct fix for the bug, it would be a change to the ABI.

Paolo

  reply	other threads:[~2011-03-28 10:42 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-26 20:28 Nathan Boley
2011-03-27  7:38 ` Ian Lance Taylor
2011-03-28 11:06   ` Paolo Bonzini [this message]
2011-03-28 11:28     ` Richard Guenther
2011-03-28 11:47       ` Paolo Bonzini
2011-03-28 12:14         ` Richard Guenther
2011-03-28 13:37         ` Michael Matz
2011-03-28 13:54           ` Paolo Bonzini
2011-03-28 14:37             ` Richard Guenther
2011-03-29 16:03               ` Nathan Boley
  -- strict thread matches above, loose matches on Subject: below --
2003-01-31  0:33 possible bug Andrew Morton
2003-01-31  0:36 ` Jan Hubicka
2003-01-31  0:56   ` Andrew Morton
2003-01-31  8:08   ` Alexandre Oliva
2003-01-31 10:48     ` Fergus Henderson
1999-07-25 17:52 Manush Dodunekov
1999-07-26 10:57 ` Alexandre Oliva
1999-07-27  3:27   ` Manush Dodunekov
1999-07-27  3:37     ` Alexandre Oliva
1999-07-31 23:33       ` Alexandre Oliva
1999-07-31 23:33     ` Manush Dodunekov
1999-07-31 23:33   ` Alexandre Oliva
1999-07-31 23:33 ` Manush Dodunekov
1997-12-12 15:46 Possible Bug Mike Sullivan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4D9065FD.6060100@gnu.org \
    --to=bonzini@gnu.org \
    --cc=gcc@gcc.gnu.org \
    --cc=iant@google.com \
    --cc=npboley@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).