This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: how do I tell gcc not to assume an alignment?


On 07/03/2013 05:26 PM, FlÃvio J. Saraiva wrote:

> In https://github.com/GNS3/dynamips-community/issues/9 I found that
> the reason for a crash was the compiler assuming that the pointer was
> 4-byte aligned in one of the O3 optimizations.
> Using gcc-4.4.7-3.el6.x86_64 in a Cent6.4-x86_64 box.
> 
> I don't understand why it made that assumption, so I'd like to know
> how to tell the compiler not to assume an alignment.

There is attribute(aligned) and attribute(packed) but I don't think that
you need them for this.

GCC knows what the integer alignment for a machine is.  It is
perfectly entitled to assume that a pointer to uint32_t really is
aligned, The only thing you are allowed to do in C is convert an int
pointer to a void* or a char* and then copy it back again.  You can't
convert, say, a char* to an int* and us it as you're trying to do.

There is a saying:  Do not lie to the compiler.  It will bite you.

So, what's the right way to solve your problem?

Like this:

/* Byte-swap a memory block */
void mem_bswap32(void *ptr,size_t len)
{
   m_uint32_t *p = ptr;
   size_t count = len >> 2;
   int i;
   m_uint32_t x;

   for(i=0;i<count;i++,p++)
   {
      memcpy(&x, p, sizeof x);
      x = swap32(x);
      memcpy(p, &x, sizeof x);
   }
}

GCC will generate the best code it can for the memcpy(); this will be
the fastest kind of unaligned memory move that your processor
supports.

Andrew.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]