------- Comment #5 from rguenth at gcc dot gnu dot org  2009-11-21 17:29 -------
static inline void put_unaligned_uint64(void *p, uint64_t datum)
{
        struct { uint64_t d; } __attribute__((packed)) *pp = p;

        pp->d = datum;
}

int iax_ie_append_versioned_uint64(struct iax_ie_data *ied, unsigned char ie,
unsigned char version, uint64_t value)
{
 struct _local {
  unsigned char version;
  uint64_t value;
 } __attribute__((packed)) newval = { version, };
 put_unaligned_uint64(&newval.value, htonll(value));
 return iax_ie_append_raw(ied, ie, &newval, (int) sizeof(newval));
}

This code accesses an object of type uint64_t via a pointer to a
struct containing an uint64_t which is an alias violation.

I don't see put_unaligned_uint32 being used, and only in the context
of the use of put_unaligned_uint64 it is appearant to the compiler
that you violate C aliasing rules.

You probably instead want to use sth like

typedef uint64_t __attribute__((aligned(1))) unaligned_uint64_t;
static inline void put_unaligned_uint64(void *p, uint64_t datum)
{
    unaligned_uint64_t *pp = p;
    *pp = datum;
}


-- 

rguenth at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|WAITING                     |RESOLVED
         Resolution|                            |INVALID


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42103

Reply via email to