https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94081

            Bug ID: 94081
           Summary: -Waddress-of-packed-member doesn’t take variable
                    attributes or __builtin_assume_aligned into account
           Product: gcc
           Version: 9.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: felix.von.s at posteo dot de
  Target Milestone: ---

In this code:

    #include <stdint.h>

    struct foo {
        uint16_t a, b;
    } __attribute__((packed));

    extern struct foo *f(void);
    extern void g(uint16_t *p);

    void h(void) {
        struct foo *s0 = __builtin_assume_aligned(f(), 16);
        g(&s0->a);

        struct foo s1 __attribute__ ((aligned(16)));
        g(&s1.a);
    }

GCC will warn about taking the address of s0->a and s1.a, even though it has
enough information to recognise those as false positives.

On many platforms, variables on the stack are naturally aligned at a 32-bit
boundary, so I believe &s1.a is a false positive on those platforms as well,
but I’m less sure if skipping the warning for this case is desirable.

Reply via email to